Привет, коллеги. Форматирование — это расстановка переносов строк, чтобы они были не длиннее нужного, но при этом без разрывов внутри слова и прочих безобразий; это расстановка отступов; а также выравнивание текста различными способами. У Вим припасено несколько приятных возможностей.
Сначала оговоримся, что желаемое поведение зависит от типа текста. Если это исходный код, то полезно форматирование комментариев, а в самом коде нужны отступы, а строки трогать не надо. Если это текст вроде ТеХ, там все зависит от стиля. Я, например, люблю, чтобы строки умещались в экран и каждое предложение начиналось с новой строки. Если же вы редактируете текст, который с экрана будет читаться, то там выравнивание, отступы, красные строки и т.п. очень полезно.
Форматирование комментариев мы рассмотрим в следующий раз. См. Оглавление рубрики, там уже очень много полезного (в том числе материал про отступы) и будет еще больше. В этой заметке обсудим форматирование в общем.
Начнем с переменной textwidth, ненулевое значение которой определяет длину строки. Если вы ее превысите, строка автоматически разорвется. Вы можете потом склеить, дело ваше. Но в целом строки будут получаться примерно равные. Нулевое значение отключает эту возможность.
Далее, есть команды :left, :right и :center, которые позволяют выровнять текст по левому краю, правому краю или по центру. Надо указать диапазон строк, по умолчанию форматируется текущая. Две последние команды могут принять ширину текста, по умолчанию ориентируются на textwidth, а если она нуль, то на 80 символов. Аргумент команды :left означает, если указан, отступ от левого края. Все команды могут быть применены к выделению, что удобно.
Команда gq с движением форматирует текст. В основном, это разрывание строк, чтобы они были примерно одной длины. Используется встроенный алгоритм, но можно указать внешнюю утилиту (formatprg) или выражение, обычно функцию: formatexpr. Можно применить к выделению.
Как обычно, есть версии gqgq и gqq для одной строки, и к ним может быть повторитель.
Вариант gw делает то же, что gq (но встроенным алгоритмом), однако в конце работы возвращает курсор на начало. Варианты gwgw и gww тоже предусмотрены.
В качестве движений удобны команды выделения текстовых объектов, например gqap выровняет абзац.
Настроить форматирование текста можно с помощью переменной formatoptions, о которой далее. Если она содержит букву a, то Вим будет автоматически форматировать текст, что может быть как очень удобно, так и неимоверно неудобно, и вы должны знать, как эту возможность включить/выключить!
Про отступы уже был материал. Если кратко, то команда = с движением расставляет отступы по синтаксису. Вариант == ставит отступы в данной строке и может быть с повторителем.
Настройка форматирования
Переменная formatoptions содержит буквы (можно запятыми разделять), описывающими действия при форматировании. По умолчанию tcq. Варианты:
- t: разрыв строк по textwidth
- c: разрыв строк комментария по textwidth с добавлением нужного символа в начало новых строк
- r: вставлять символ комментария при нажатии Enter в режиме вставки (если текущая строка — строка комментария).
- o: аналогично при создании новых строк командами o и O.
- q: включает форматирование комментариев командой gq.
- w: означает, что пробелы на конце строки означают, что абзац продолжен на следующей строке. Строка, оканчивающаяся на непробельный символ, последняя в абзаце.
- a: автоматическое форматирование абзацев. Если сочетается с c, то относится только к комментариям и не портит код. Если же вы работаете с текстом и вам важно блюсти длину строк, может быть полезно.
- n: распознает списки. Так что при переносе строк будут соблюдены отступы. Как в этом списке. Надо, чтобы была включена опция autoindent. С чего начинается список, описывает переменная formatlistpat, которая содержит регулярное выражение. По умолчанию описывает число с точкой или другим пунктуационным значком после.
- 2: использует отступ второй (а не первой) строки абзаца для всего абзаца. Позволяет делать красную строку. Надо, чтобы была включена опция autoindent.
- l: не разбивать длинные строки.
- m: разрывать строку после многобайтных символов. Полезно для азиатских языков с иероглифами.
- M: не вставлять пробел до и после таких символов при склейке строк.
- B: не вставлять пробел между такими символами при склейке строк.
- 1: не разрывать строку после слова из одной буквы.
- j: убирать символ комментария при склейке строк.
Так что для кода crokj должно быть нормально, а для ТеХа, например, надо подбирать, что вам нравится.
Не забываем про такие возможности, как:
- :set fortmatoptions — покажет текущее значение
- :set fortmatoptions+=j — добавит символ, не меняя того, что там уже было
- :set fortmatoptions-=j — удалит символ, не меняя того, что там уже было, причем сделает то, что вы имеете в виду. Например, если было 2ja, то станет 2a.
Удачи, коллеги! На следующей неделе заметка про форматирование комментариев.