6

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

3 ответа3

10

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

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

Скриншоты

До:

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

После:

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

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

1

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

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

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

0

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .