Sublime Text 2 - вставить разрывы, чтобы соответствовать текущей упаковке?

Существует ли автоматический способ вставки разрывов строк в каждой точке, где текст в настоящее время переносится? После этой операции никакие строки не должны быть перенесены, но они должны выглядеть визуально одинаково.

4 ответа

Решение

Создайте плагин для этого. Выберите Инструменты "Новый плагин… и введите следующий скрипт:

import sublime, sublime_plugin

class WrapLinesExCommand(sublime_plugin.TextCommand):
    def run(self, edit):
        wrap_column = 0

        if self.view.settings().get('word_wrap') == False:
            # wrapping is disabled, do nothing
            return

        if self.view.settings().get('wrap_width') == 0:
            # compute wrap column from viewport width
            wrap_column = int(self.view.viewport_extent()[0] / self.view.em_width())
        else:
            wrap_column = self.view.settings().get('wrap_width')

        e = self.view.begin_edit()
        rewrap(self.view, e, wrap_column)
        self.view.end_edit(e)

def rewrap(v, e, column):
    # 0-indexed current line
    current_line_no = 0

    # RHS expression is line count, can change whenever we create a new one
    while current_line_no < v.rowcol(v.size())[0] + 1:
        # where current line drawing starts
        current_line_coords = v.text_to_layout(v.text_point(current_line_no, 0))

        # rightmost character drawn in current viewport
        textpos = v.layout_to_text((v.em_width() * (column), current_line_coords[1]))

        # physical line boundaries as absolute text positions
        current_line = v.line(textpos)

        if textpos < current_line.b:
            # the current line spans multiple rows, so insert a newline at the wrap column

            textpos = v.layout_to_text((v.em_width() * (column), current_line_coords[1]))
            next_line_indent = v.text_to_layout(textpos+1)[0]

            # TODO why -1?
            next_line_indent_chars = int(next_line_indent/(v.em_width()))-1
            # determine how to indent the following line based on how wide the wrapping indents and what the current tab/spaces settings are
            if v.settings().get('translate_tabs_to_spaces') and v.settings().get('use_tab_stops'):
                next_line_indent_chars = next_line_indent_chars / v.settings().get('tab_size')
                next_line_indent_string = '\t' * next_line_indent_chars
            else:
                next_line_indent_string = ' ' * next_line_indent_chars

            # insert newline and spacing at wrap column (sublime hides actual line endings from editor, therefore it's always LF)
            v.insert(e, textpos, '\n' + next_line_indent_string)
        else:
            # only continue to the next line if we didn't edit the current line
            current_line_no = current_line_no + 1

Сохранить, например, как wrap_lines_ex_command.py по умолчанию (User) каталог.

Чтобы сделать это доступным из строки меню, выберите пункт меню Обзор пакетов..., перейдите к User папку и редактировать Main.sublime-menu (создавая его при необходимости), как описано в этом ответе, поэтому он содержит текст, например, такой:

[
    {
        "id": "edit",
        "children":
        [
            {"id": "wrap"},
            {"command": "wrap_lines_ex", "caption": "Wrap All Lines"}
        ]
    }
]

Скриншоты

До:

Скриншот перед

После:

Скриншот после

Конечно, в этом случае из-за того, что комментарии также обернуты, код больше не будет работать. Но это поведение как дизайн в соответствии с вопросом.

Спустя годы есть готовые пакеты (плагины) для такого рода вещей. Они могут не полностью удовлетворить ваш запрос (в соответствии с текущей упаковкой, показанной в вашем окне), но вы можете указать, какой столбец вы хотите обернуть в своих предпочтениях.

Sublime-Wrap-Plus

Страница GitHub

Монтаж

  1. открыто Sublime Text 2 or 3,
  2. Нажмите command-shift-p (Mac OS X) или ctrl-shift-p (Windows), чтобы открыть Command Palette введите "установить" и выберите опцию Install Package Control,
  3. Открой Command Palette снова введите "установить" снова и выберите параметр Install a Package,
  4. Начните печатать, а затем выберите sublime-wrap-text,

использование

  1. Выберите текст в вопросе.
  2. Нажмите command+alt+q (Mac OS X) или alt+q (Windows).

См. Страницу GitHub для большего количества нюансов использования и того, как установить предпочтения.

демонстрация

До

После (я просто выделил весь текст и нажал Alt + Q)

Другой подобный пакет - Sublime-Wrap-Statement

Страница GitHub

Я не пробовал это сам, но вы можете попробовать, если хотите.

Аккаунт слишком молод, чтобы добавлять его в качестве комментария
, но хотел добавить обновление 2021 года к превосходному ответу MarredCheese за 2017 год, найденному выше.

Чтобы установить первый пакет, упомянутый MarredCheese:

GitHub:
Имя пакета Sublime: Wrap Plus

Шаг 1. Все еще работает, вставка из исходного сообщения:

  1. Открыть возвышенное

Шаг 2. Все еще работает, вставка из исходного сообщения:

  1. Нажмите commandshiftp(Mac OS X) или ctrlshiftp(Windows), чтобы открытьCommand Palette, введите «установить» и выберите вариантInstall Package Control.

Шаг 3. немного неточный.
Если синтаксис изменился, вот что будет работать в 2021 году:

   Шаг 3. (Оригинал):

  • ОткройCommand Palette again, еще раз введите «установить» и выберите вариант .

   Шаг 3. (Пересмотрено на 2021 год):

  • вместо того, чтобы печататьInstall a Packageвведите либо:
    • или
    • Package Control: Install Package
    • Примечание. «Управление пакетами: пакет расширенной установки» полезно,
      но не обязательно для этого рецепта.

Шаг 4. больше не работает.

   Шаг 4. (Оригинал):

  • Начните вводить, а затем выберитеsublime-wrap-text.

   Шаг 4. (Пересмотрено на 2021 год):

Чтобы установить второй пакет MarredCheese, упомянутый внизу ответа:

GitHub:
Имя пакета Sublime: WrapStatement

Выполните те же действия, что и в последнем разделе, но для шага 3 введитеWrapStatementвместо этого (нет места).
(Вы увидите https://github.com/shagabutdinov/sublime-wrap-statementhttps://github.com/shagabutdinov/sublime-wrap-statement в деталях этой записи вInstall Packageпадать)

В настоящий момент может показаться, что эта функция не включена в настройки Sublime Text 2 (вы можете убедиться в этом в Default/Preferences.sublime-settings). Можно использовать опцию конфигурации как"line_padding_bottom": 4 (где 4 - это количество пикселей, которое вы хотите под каждой строкой) для ясности чтения по всем строкам, но невозможно выборочно применять разные отступы в зависимости от того, переносится ли строка.

Вы можете отправить запрос на добавочный текст на форуме Sublime Text 2. Я знаю, что я был бы признателен за эту функциональность, если это целесообразно реализовать.

Другие вопросы по тегам