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