Существует ли автоматический способ вставки разрывов строк в каждой точке, где в настоящее время переносится текст? После этой операции никакие строки не должны быть перенесены, но они должны выглядеть визуально одинаково.
3 ответа
Создайте плагин для этого. Выберите Инструменты »Новый плагин… и введите следующий скрипт:
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
Я не пробовал это сам, но вы можете попробовать, если хотите.
В настоящий момент может показаться, что эта функция не включена в настройки Sublime Text 2 (вы можете убедиться в этом в Default/Preferences.sublime-settings). Можно использовать параметр конфигурации, такой как "line_padding_bottom": 4
(где 4 - количество пикселей, которое вы хотите под каждой строкой) для четкости чтения всех строк, но невозможно выборочно применять разные отступы в зависимости от того, не строка завернута.
Вы можете отправить запрос на добавочный текст на форуме Sublime Text 2. Я знаю, что я был бы признателен за эту функциональность, если это целесообразно реализовать.