РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ VIM - Брам Мооленаар

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

28.1    Что такое складки?
28.2    Создание складок вручную
28.3    Работа со складками
28.4    Сохранение и восстановление складок
28.5    Настройка складок по отступам
28.6    Настройка складок при помощи маркеров
28.7    Складки с использованием синтаксиса
28.8    Настройка складок с использованием выражений
28.9    Использование складок для неизменённых строк
28.10 Какой метод задания складок лучше?

Следующая глава: Перемещение в программном коде
Предыдущая глава: Шаблоны и команды поиска
Содержание: Руководство пользователя Vim


28.1 Что такое складки?

Складки используются для отображения нескольких строк в буфере в виде одной строки. Это похоже на лист бумаги, который можно сложить, чтобы сделать его короче:

+------------------------+
| строка 1         |
| строка 2         |
| строка 3         |
|_______________________ |
\             \
\________________________\
/ строки в складке       /
/________________________/
| строка 12         |
| строка 13         |
| строка 14         |
+------------------------+

Текст по прежнему находится в буфере без изменений. Складки влияют только на способ отображения текста.

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


28.2 Создание складок вручную

Попробуйте создать складку: поместите курсор где-нибудь в абзаце текста и наберите:

zfap

Вы увидите, что текст абзаца заменён на подсвеченную строку. Вы создали складку. |zf| это оператор создания складки, а |ap| это указание на текстовый объект, в данном случае абзац. Оператор |zf| можно использовать с любыми командами перемещения, при этом в складку будет помещаться текст, над которым переместился курсор. |zf| также работает и в Визуальном режиме.

Для просмотра текста в складке, откройте её с помощью команды:

zo

Чтобы закрыть складку, используйте команду:

zc

Все команды, работающие со складками, начинаются с "z". Складки и в самом деле напоминают лист бумаги, в котором некоторые фрагменты текста заложены таким образом, что текст оказывается спрятанным. Буква после команды "z" имеет мнемоническое значение, облегчающее запоминание команды:

zf Создание складки (F-old creation)
zo Открыть складку (O-pen a fold)
zc Закрыть складку (C-lose a fold)

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

Предположим, вы создали несколько складок, и хотели бы увидеть текст, который в них находится. Вместо того, чтобы вводить команду "zo" на каждой складке, можно использовать команду:

zr

Эта команда уменьшит (R-educe) количество складок. Её противоположность - команда

zm

которая делает больше (M-ore) складок. Для открытия или закрытия вложенных складок на разных уровнях можно повторять команды "zr" или "zm".

Чтобы открыть все складки в файле на всех уровнях, используйте команду:

zR

Эта команда уменьшает количество закрытых складок до нуля. Чтобы закрыть все складки, используйте команду:

zM

Быстро отменить использование складок можно по команде |zn|. Команда |zN| возвращает все определённые складки на место. |zi| переключает между этими двумя режимами. Вот примерный способ работы с документом, которым можно пользоваться:

  • создайте необходимые складки для получения общего представления о документе.
  • переместите курсор к тому месту, где необходимо внести изменения.
  • для перехода к тексту в складке используйте команду |zi|.
  • для возвращения к общей структуре текста повторите команду |zi|.

Подробнее о складках, созданных вручную смотрите в справочнике: |складки-ручной_способ|


28.3 Работа со складками

Команды "j" и "k" перемещают курсор над закрытыми складками так, как будто на месте складки находится одна пустая строка. Это позволяет вам быстро перемещаться над текстом, находящимся в складках.

Вы можете удалять, копировать и вклеивать складки, как будто это одна строка. Это может оказаться очень полезным, если вы хотите перестроить порядок функций в программе. Прежде всего убедитесь, что каждая складка содержит одну функцию, выбрав правильный способ создания складок при помощи опции 'foldmethod'. Затем вы можете, к примеру, удалить всю функцию в складке по команде "dd", переместить курсор в требуемую позицию и вклеить функцию при помощи команды "p". Если несколько строк в функции выходят за границы складки, то можно воспользоваться Визуальным режимом:

  • поместите курсор на первую строку, которую необходимо переместить
  • перейдите в Визуальный режим по команде "V"
  • переместите курсор к последней строке, которую необходимо перенести
  • нажмите "d" для удаления выделенных строк
  • переместите курсор в новое положение и вклейте удалённые раннее строки при помощи команды "p".

Иногда бывает трудно запомнить, где находятся те или иные складки, На помощь приходит опция 'foldcolumn':

:set foldcolumn=4

На экране появится узкая колонка (в данном случае, шириной 4 символа) в левой части окна, в которой будут отображаться определённые складки. Для закрытых складок в колонке отображается символ "+". В начале каждой открытой складки отображается символ "-" и на всём протяжении открытой складки в колонке также отображается символ "|".

Чтобы открыть складку, можно щелкнуть мышью по знаку "+" в колонке складки. Нажатие мышью по символу "-" или "|" приведёт к закрытию соответствующей складки.

Для открытия всех складок, расположенных в строке под курсором, используйте команду |zO|.
Для закрытия всех складок, расположенных в строке под курсором, используйте команду |zC|.
Для удаления складки, расположенной в строке под курсором, используйте команду |zd|.
Для удаления всех складок, расположенных в строке под курсором, используйте команду |zD|.

В режиме Вставки, складка, расположенная в позиции курсора, никогда не закрывается. Это позволяет вам видеть, что вы печатаете внутри складки.

Складки открываются автоматически при переходе по прыжкам или горизонтальном перемещении курсора. Например, команда "0" открывает складку, находящуюся под курсором (в том случае, если в опции 'foldopen' содержится значение "hor", что является значением по умолчанию). Опция 'foldopen' позволяет настроить команды, использование которых приводит к автоматическому открытию складки. Если вы хотите, чтобы складка, находящаяся под курсором всегда автоматически открывалась, то установите значение опции 'foldopen' равным "all":

:set foldopen=all

Предупреждение: в этом случае вы не сможете перейти на закрытую складку. Возможны, вы захотите ввести эту настройку лишь временно, и потом восстановить значение опции по умолчанию:

:set foldopen&

Вы также можете настроить складки на автоматическое закрытие при перемещении курсора за пределы складки:

:set foldclose=all

Эта установка автоматически применяет 'foldlevel' ко всем складкам, кроме тех, в которых находится курсор. Попробуйте, возможно вам это понравится. Для изменения текущего уровня открытия складок используйте команды |zm| и |zr|.

Складки относятся к текущему окну. Это позволяет вам открыть для одного и того же буфера два окна и настроить в каждом окне свои складки.


28.4 Сохранение и восстановление складок

При редактировании нового файла в том же окне состояние складок будет утрачено. Если вы вернётесь к редактированию того же самого файла, то все открытые и закрытые вручную складки будут возвращены в значение по умолчанию. Если складки были определены вручную, то они и вовсе исчезнут из файла. Для сохранения складок используйте команду |:mkview|:

:mkview

Эта команда сохраняет настройки, которые оказывают влияние на вид файла. Что именно сохраняется по этой команде, можно настроить с помощью опции 'viewoptions'. Если вы позднее вернётесь к тому же самому файлу, то можете загрузить сохранённый вид по команде:

:loadview

Для каждого файла можно сохранить до 10 видов. Например, для сохранения текущего вида в качестве третьего вида и загрузки второго вида, используйте команды:

:mkview 3
:loadview 2

Замечание: при вставке и удалении строк сохранённые виды могут оказаться неактуальными. Обратите внимание на значение опции 'viewdir', где указывается каталог, в котором сохраняются виды. Возможно, вам захочется время от времени удалять виды, которые утратили свою ценность.


28.5 Настройка складок по отступам

Определение складок вручную при помощи |zf| требует много работы. Если ваш текст структурирован при помощи отступов, то есть фрагменты текста, находящиеся на более глубоком уровне, выделяются большими отступами, то вы можете использовать метод задания складок по отступам. При этом автоматически будут созданы складки для всех фрагментов текста с равными отступами. Строки, имеющие больший отступ, будут помещены во вложенные складки.Этот метод хорошо подходит для исходных текстов программ на многих языках программирования.

Метод определения складок устанавливается с помощью опции 'foldmethod':

:set foldmethod=indent

Теперь вы можете пользоваться командами |zm| и |zr| для открытия и закрытия складок разного уровня. Приведём простой пример:

Это строка без отступа
    Это строка с одним отступом
        Это строка с двумя отступами
        Это строка с двумя отступами
    Это строка с одним отступом
Это строка без отступа
    Это строка с одним отступом
    Это строка с одним отступом

Замечание: Соотношение между глубиной складки и шириной отступа зависит от опции 'shiftwidth'. Каждый отступ, равный количеству символов, указанных в 'shiftwidth', добавляет один уровень к глубине складки. Это называется также уровнем складки.

При использовании команд |zr| и |zm| вы фактически изменяете текущее значение опции 'foldlevel'. Вы также можете менять её значение напрямую:

:set foldlevel=3

В данном случае, такая настройка будет означать, что все складки с отступами равными три значения опции 'shiftwidth' и более будут закрыты. При значении опции 'foldlevel' равном нулю, все складки являются закрытыми. |zM| устанавливает значение опции 'foldlevel' равным нулю, а противоположная по действию команда |zR| устанавливает значение 'foldlevel' равным максимальной величине уровня складки в данном файле.

Таким образом, существует два способа открытия и закрытия складок:

  1. При помощи установки текущего уровня складок. Этот способ позволяет быстро посмотреть структуру текста, переместить курсор в требуемое место, и вернуть складки в прежнее состояние.
  2. При помощи команд |zo| и |zc|, служащих для открытия отдельных складок. Этот способ позволяет открывать только действительно необходимые складки, независимо от остальных складок.

Эти два способа можно совмещать: например, сначала можно закрыть большинство складок, используя команду |zm| несколько раз, и затем открыть одну из складок по команде |zo|. Или открыть все складки по команде |zR| и затем закрыть ненужные по команде |zc|.

При значении опции 'foldmethod', равном "indent" вы не сможете вручную определять складки в тексте, поскольку это будет входить в противоречие с отношением между шириной отступа и уровнем складки.

Подробнее о настройке складок по отступам смотрите в справочнике: |складки-отступы|


28.6 Настройка складок при помощи маркеров

Для отметки области складки в тексте, можно пользоваться специальными маркерами, которые указывают на начало и конец области. Такие маркеры позволяют вам получить полный контроль над содержимым складки. Недостаток этого способа состоит в том, что маркеры должны быть вставлены непосредственно в текст.

Попробуйте:

:set foldmethod=marker

Пример текста, использующий маркеры складок:

/* foobar () {{{ */
int foobar()
{
    /* return a value {{{ */
    return 42;
    /* }}} */
}
/* }}} */

Обратите внимание, что строка в складке будет отображать текст, помещённый перед маркером. Это очень полезно для быстрого определения содержимого складки.

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

/* global variables {{{1 */
int varA, varB;

/* functions {{{1 */
/* funcA() {{{2 */
void funcA() {}

/* funcB() {{{2 */
void funcB() {}
/* }}}1 */

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

Подробнее о настройке складок по отступам смотрите в справочнике: |складки-маркеры|


28.7 Складки с использованием синтаксиса

Для каждого языка Vim  использует свой особый файл синтаксиса. В этом файле определены цвета для подсветки различных синтаксических элементов. Если вы читаете этот документ в Vim на цветном терминале, то он должен быть подсвечен при помощи правила синтаксиса для файлов справки.

В файлах синтаксиса можно добавлять элементы, которые имеют аргумент "fold". При помощи этих элементов определяются области складок. Это не всегда просто сделать и требует написания полноценного файла с правилами синтаксиса, но после того, как эта работа будет проделана, складки для данного типа файла будут создаваться автоматически.

Если вы пользуетесь правилами создания складок, определёнными в файле синтаксиса, то здесь вряд ли требуются ещё какие-либо пояснения. Вы можете открывать и закрывать складки, как объяснялось раннее. При редактировании файла складки будут создаваться и удаляться автоматически.

Подробнее о складках, созданных при помощи файла синтаксиса, смотрите в справочнике: |складки-синтаксис|


28.8 Настройка складок с использованием выражений

Этот метод в чём то схож с использованием отступов, но вместо использования отступа уровень складки для строки вычисляется при помощи определённой пользователем функции. Это можно использовать в тех случаях, когда на область складки может указывать содержание текста. Например, в почтовом сообщении как правило выделяется процитированный текст, при помощи символа ">" в начале строки. Чтобы помещать области, относящиеся к таким цитатам, используйте такие команды:

:set foldmethod=expr
:set foldexpr=strlen(substitute(substitute(getline(v:lnum),'\\s','',\"g\"),'[^>].*','',''))

Попробуйте этот метод со следующим фрагментом текста:

> цитата из текста собеседника
> цитата из текста собеседника
> > двойная цитата из моего предыдущего письма
> > двойная цитата из моего предыдущего письма

Пояснения для использованного в примере 'foldexpr':

getline(v:lnum) взять текущую строку
substitute(...,'\\s','','g') убрать из текущей строки пробелы
substitute(...,'[^>].*','','')) убрать из текущей строки всё, кроме начальных '>'
strlen(...) подсчитать необходимый уровень складки, равный длине строки (количество найденных символов '>')

В 'foldexpr' необходимо использовать обратную косую черту перед каждым пробелом, двойной кавычкой и командой ":set". Чтобы посмотреть, что получилось в итоге, введите команду

:set foldexpr

Для исправления обнаруженных ошибок, используйте автодополнение командной строки:

:set foldexpr=<Tab>

Здесь <Tab> это нажатие на кнопку Tab. Vim подставит предыдущее значение, которое можно будет редактировать.

Если выражение становится слишком сложным, то его лучше всего записать в виде функции и выполнять вызов этой функции из значения опции 'foldexpr'.

Подробнее об использовании выражений при определении складок в тексте, смотрите в справочнике: |складки-выражения|


28.9 Использование складок для неизменённых строк

Этот метод полезен при включённой в том же окне опции 'diff'. Команда |vimdiff| сама устанавливает этот метод складок автоматически. Пример:

setlocal diff foldmethod=diff scrollbind nowrap foldlevel=1

Введите эту команду в каждом окне, которое отображает отличную версию того же самого файла. Вы сразу увидите отличия между файлами, а неизменённый текст будет аккуратно помещён в складки.

Подробнее смотрите |складки-diff|.


28.10 Какой метод задания складок лучше?

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

Если для вашего типа файла существуют правила синтаксиса с определёнными областями складок, то скорее всего это будет лучший выбор. Если такого файла не существует, вы можете попытаться написать свой. Это потребует от вас хорошего знания шаблонов поиска. Хотя это и не самый простой путь, но при работе вам не потребуется определять складки вручную.

Определение складок вручную полезно для бесструктурного текста. Не забудьте использовать команду |:mkview| для сохранения определённых вручную складок.

Метод с использованием маркеров требует внесения маркеров непосредственно в текст файла. Если вы используете файл совместно с другими людьми, или добавление маркеров в текст противоречит корпоративным стандартам, то вы не сможете пользоваться этим методом.

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

Использование отступов зачастую неплохо работает на самых различных типах файла, но не всегда так, как требуется. Используйте этот метод, если нет более подходящего способа определения складок в тексте. Вместе с тем, этот метод очень хорошо подходит для построения структурированного текста. В этом случае вы должны использовать строго один 'shiftwidth' для каждого уровня текста.

Использование выражений для определения складок может помочь определить складки практически в любом структурированном тексте. Выражения обычно не так сложно задавать, особенно если начало и конец складки легко можно распознать.

Если вы используете метод "expr" для определения складок, но в итоге складки получаются не совсем на месте, то можно всегда переключиться в ручной метод ("manual"). При этом определённые складки не будут потеряны, так что вы сможете редактировать их так, как вам потребуется.


Следующая глава: Перемещение в программном коде
Авторские права: см. Авторские права