Sublime-Wrap-Plus

Sublime-Wrap-Plus

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

решение1

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

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"}
        ]
    }
]

Скриншоты

До:

Скриншот до

После:

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

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

решение2

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

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» и выберите опцию Install a Package.
  4. Начните вводить текст, а затем выберите sublime-wrap-text.

Применение

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

Дополнительные сведения об использовании и настройке параметров см. на странице GitHub.

Демо

До

введите описание изображения здесь

После(Я просто выделил весь текст и нажал alt+q)

введите описание изображения здесь

Еще один похожий пакет —Возвышенное-Обертывание-Заявление

Страница GitHub

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

решение3

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

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

GitHub: https://github.com/ehuss/Sublime-Wrap-Plus
Название пакета Sublime: Обертывание Плюс

Шаг 1.Все еще работает, вставляю из оригинального поста:

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

Шаг 2.Все еще работает, вставляю из оригинального поста:

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

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

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

  • Откройте Command Palette again, снова введите «install» и выберите опцию Install a Package.

   Шаг 3. (Изменено на 2021 год):

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

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

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

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

   Шаг 4. (Изменено на 2021 год):

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

GitHub: https://github.com/shagabutdinov/sublime-wrap-statement
Название пакета Sublime:WrapStatement

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

решение4

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

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

Связанный контент