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
Монтаж
- открыто
Sublime Text 2 or 3
, - Нажмите
command-shift-p
(Mac OS X) илиctrl-shift-p
(Windows), чтобы открытьCommand Palette
введите "установить" и выберите опциюInstall Package Control
, - Открой
Command Palette
снова введите "установить" снова и выберите параметрInstall a Package
, - Начните печатать, а затем выберите
sublime-wrap-text
,
использование
- Выберите текст в вопросе.
- Нажмите
command+alt+q
(Mac OS X) илиalt+q
(Windows).
См. Страницу GitHub для большего количества нюансов использования и того, как установить предпочтения.
демонстрация
До
После (я просто выделил весь текст и нажал Alt + Q)
Другой подобный пакет - Sublime-Wrap-Statement
Я не пробовал это сам, но вы можете попробовать, если хотите.
Аккаунт слишком молод, чтобы добавлять его в качестве комментария
, но хотел добавить обновление 2021 года к превосходному ответу MarredCheese за 2017 год, найденному выше.
Чтобы установить первый пакет, упомянутый MarredCheese:
GitHub:
Имя пакета Sublime: Wrap Plus
Шаг 1. Все еще работает, вставка из исходного сообщения:
- Открыть возвышенное
Шаг 2. Все еще работает, вставка из исходного сообщения:
- Нажмите 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 год):
- Тип
Wrap Plus
в раскрывающийся список «Установочный пакет» ( подробнее об этой записи
вы увидите https://github.com/ehuss/Sublime-Wrap-Plushttps://github.com/ehuss/Sublime-Wrap-Plus )
Чтобы установить второй пакет 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. Я знаю, что я был бы признателен за эту функциональность, если это целесообразно реализовать.