СПРАВОЧНИК ПО VIM - Брам Мооленаар
В Vim имеется набор внутренних переменных и переключателей, которые позволяют достигать самых разных результатов. Такие опции могут быть трёх видов:
булево | может быть включено или выключено |
число | имеет числовое значение |
строка | имеет строковое значение |
1. Настройка опций
Команда ":set" позволяет задавать несколько {опций}. Например:
:set ai nosi sw=3 ts=3
При этом, если в одном из аргументов будет допущена ошибка при определении значения опции, то будет выдано соответствующее сообщение и последующие аргументы будут проигнорированы.
Если значение опции 'verbose' не равно нулю, то отображение значения опции также приводит к выводу информации о том, каким образом значение данной опции было последний раз изменено. Например:
:verbose set shiftwidth cindent?
shiftwidth=4
Последний раз установлено из modeline
cindent
Последний раз установлено из /usr/local/share/vim/vim60/ftplugin/c.vim
Эта информация выводится только в том случае, когда выполняется просмотр значения определённой опции, но не для команды ":set all" или ":set" без аргумента.
Если значение опции устанавливается вручную, то сообщение о последнем изменении не выводится. Для всех локальных опций с одним и тем же именем выводится только одно значение, поэтому сообщение относится прежде всего к имени опции, а не к её значению. Если значение опции было изменено во время выполнения функции, пользовательской команды или автокоманды, то выводится путь к сценарию, в котором было определено такое изменение. Обратите внимание, что значение опции может также измениться при включении опции 'compatible' в качестве побочного эффекта.
Доступно только в том случае, если Vim скомпилирован с особенностью |+eval|.
В качестве {опции} может быть также использовано имя в формате "t_xx" для установки опции терминала termcap. В этом случае указанное значение будет переопределять значение, заданное в определении терминала в termcap. После этого соответствующие символы можно использовать в привязках. Если "xx" содержит специальный символ, то следует использовать формат <t_xx>:
:set <t_#4>=^[Ot
Это также может быть полезно для перевода специального кода в обычный символ. Например, если Alt-b приводит к вводу <Esc>b, то следует использовать такую настройку опции:
:set <M-b>=^[b
(здесь ^[ это настоящий символ <Esc>, для его ввода следует пользоваться CTRL-V <Esc>). Преимущество такого метода над привязкой состоит в том, что он работает во всех ситуациях.
Вывод команды ":set" отличается от вывода аналогичной команды в Vi. Длинные строковые опции помещаются в конце списка. Количество опций довольно большое, поэтому вывод команды "set all" скорее всего не поместится на одном экране и Vim выведет сообщение |продолжение_следует|.
Чтобы включить в значение опции пробел, он должен предваряться символом обратной косой черты. Для включения в значение опции символа обратной косой черты следует использовать два символа обратной косой черты. Количество символов обратной косой черты в значении опции, таким образом, сокращается вдвое.
Вот несколько примеров:
:set tags=tags\ /usr/tags задаёт значение "tags /usr/tags"
:set tags=tags\\,file задаёт значение "tags\,file"
:set tags=tags\\\ file задаёт значение "tags\ file"
Символ "|" отделяет команду ":set" от последующей команды. Чтобы включить символ "|" в значение опции следует использовать "\|". В следующем ниже примере мы устанавливаем значение опции 'titlestring' равным строке "привет|буфет":
:set titlestring=привет\|буфет
А теперь установим значение опции 'titlestring' равным строке "привет", а значение опции 'iconstring' равным строке "буфет":
:set titlestring=привет|set iconstring=буфет
В MS-DOS и WIN32 символы обратной косой черты в именах файлов как правило не убираются, а именно: в тех опциях, значением которых является имя файла (и в которых может происходить подстановка значения переменной окружения), символ обратной косой черты перед обычным символом имени файла не будет удалён, а символ обратной косой черты перед специальным символом (пробелом, обратной косой чертой, запятой и т.п.) будет обрабатываться так, как это описано выше.
Особая ситуация возникает в тех случаях, когда значение начинается с символов "\\":
:set dir=\\компьютер\путь задаёт значение "\\компьютер\путь"
:set dir=\\\\компьютер\\путь задаёт значение "\\компьютер\путь"
:set dir=\\путь\\файл задаёт значение "\\путь\файл" (ошибка!)
В первом случае двойной символ косой черты сохраняется, а во втором случае двойной символ заменяется одинарным. Это позволяет обеспечить работоспособность как в том случае, когда вы ожидаете, что двойные символы обратной косой черты будут сокращены, так и в том случае, когда вы ожидаете, что двойные символы сокращаться не будут. Третий пример приводит, вероятно, к ошибочному результату.
Некоторые опции представляют собой список флагов. Если вы хотите добавить флаг к такой опции, без изменения существующих флагов, то это можно сделать следующим образом:
:set guioptions+=a
Удаление флага из опции происходит так:
:set guioptions-=a
В данном случае удаляется флаг 'a' из опции 'guioptions'. Обратите внимание, что следует добавлять и удалять флаги по одному. Если значение опции 'guioptions' -- "ab", то команда "set guioptions-=ba" не сработает, поскольку в значении опции не встречается строка "ba".
В большинстве строковых опций выполняется подстановка значений переменных окружения. Если переменная окружения существует, то символ '$' и следующее за ним имя переменной заменяются на значение переменной. Если указанная переменная окружения не существует, то символ '$' и следующее за ним имя остаются без изменений. После имени переменной окружения может следовать любой неименной символ (т.е. не буква, не цифра и не '_'). Этот символ и любые последующие символы добавляются к значению переменной окружения. Примеры:
:set term=$TERM.new
:set path=/usr/$INCLUDE,$HOME/include,.
При добавлении или удалении строки из значения опции с помощью ":set opt-=val" или :set opt+=val" подстановка значения переменной выполняется до выполнения операции добавления или удаления.
Работа с местными опциями
Некоторые опции применяются только к окну или к буферу. Каждое окно или буфер имеет собственную копию такой опции, независимую от других окон или буферов. Это позволяет, например, включить опцию 'list' для одного окна и отключить её для другого, или установить значение опции 'shiftwidth' равным 3 в одном буфере и 4 в другом буфере.
Ниже поясняется, что происходит с такими местными опциями в определённых ситуациях. Обычно вам не требуется знать это, поскольку Vim как правило использует как раз те значения опций, которые и ожидает пользователь. К сожалению, иногда выполнение ожидаемых пользователем действий является достаточно сложным процессом...
При разделении окна значения местных опций копируются в новое окно. Сразу после разделения окна содержимое обоих окон выглядит одинаково.
При редактировании нового буфера значения местных опций должны быть инициализированы. Поскольку местные опции текущего буфера могут быть определены специально для данного буфера, их значения не используются. Вместо этого используется глобальное значение для каждой из местных по отношению к буферу опций, которое применяется ко всем вновь созданным буферам. Команда ":set" изменяет как местное значение опции, так и глобальное значение, а команда ":setlocal" изменяет только местное значение, которое не будет использоваться при редактировании нового буфера.
При редактировании буфера, который редактировался до этого, используются опции для последнего использованного этим буфером окна. Если буфер редактировался в этом же окне, то используются те значения опций, которые были в силе в момент редактирования буфера. Если буфер редактировался раннее в другом окне, то используются значения опций того окна, где буфер редактировался в последний раз.
Опция, значение которой является местным по отношению к окну, может быть задана конкретно для определённого буфера. При редактировании другого буфера в том же самом окне вам скорее всего не захочется вновь использовать те же самые значения опций. Поэтому, Vim сохраняет глобальные значения всех опций, которые могут быть определены локально по отношению к данному окну, которые и используются при редактировании нового буфера. В каждом окне хранятся собственные копии этих значений. Такие значения являются местными по отношению к окну, но глобальными по отношению ко всем буферам в данном окне. Например, если выполнить команды
:e one
:set list
:e two
то опция 'list' будет включена при редактировании "two", поскольку по команде ":set list" было изменено также и глобальное значение.
:set nolist
:e one
:setlocal list
:e two
В этом случае опция 'list' не будет включена, поскольку ":set nolist" выключает глобальное значение, а ":setlocal list" изменяет только локальное значение и при выполнении ":e two" применяется глобальное значение. Обратите внимание, что если затем выполнить команду
:e one
то опция 'list' не будет включена, как это было при последнем редактировании файла "one" в данном окне. Опции, которые являются местными по отношению к окну, не запоминаются для каждого буфера в отдельности.
Для опций, местных по отношению к окну или буферу:
Команда | глобальное значение | местное значение |
:set опция=значение | изменяется | изменяется |
:setlocal опция=значение | - | изменяется |
:setglobal опция=значение | изменяется | - |
:set опция? | - | отображается |
:setlocal опция? | - | отображается |
:setglobal опция? | отображается | - |
Глобальные опции с местным значением
Опция является глобальной в тех случаях, когда для всех буферов используется одно и то же значение. Иногда полезно сделать так, чтобы какая-либо глобальная опция имела местное значение, которое отличалось бы от глобального. Установить такое местное значение можно при помощи команды ":setlocal", после выполнения которой текущий буфер станет использовать местное значение опции, а все остальные буферы будут по прежнему использовать глобальное значение.
Например, представьте, что у вас есть два окна, в каждом из которых открыты файлы с исходным текстом программ на языке C. Оба окна используют глобальную опцию 'makeprg'. Если в одном из окон выполнить команду
:set makeprg=gmake
то другое окно также станет использовать изменённое значение опции. Таким образом, изменять значение опции 'makeprg' в другом окне на "gmake" не требуется.
Предположим, однако, что в новом окне мы открываем файл с программой на языке Perl. В этом случае нам потребуется использовать другую программу 'makeprg', но изменять значение этой опции в двух других окнах, где открыты файлы с программами на языке C, нам бы не хотелось. В этом случае можно воспользоваться такой командой:
:setlocal makeprg=perlmake
Переключиться на использование глобального значения опции можно путём очистки местного значения:
:setlocal makeprg=
Это будет работать для строковой опции. Для булевой опции необходимо использовать флаг "<", например:
:setlocal autoread<
Обратите внимание, что остальные опции, кроме булевых, используют "<" для копирования глобального значения в местное значение, но не переключают окно на использование глобального значения опции (это имеет значение при последующем изменении глобального значения).
Замечание: В будущем количество глобальных опций, которые могут быть глобальными-местными, расширится. Использование команды ":setlocal" для глобальной опции в этом случае может работать иначе.
Настройка типа файла
Символ "~" в начале значения опции и после пробела или запятой равноценен использованию переменной окружения "$HOME".
В Unix-системах также можно использовать форму "~user", которая приводится к значению домашнего каталога пользователя "user". Например:
:set path=~mool/include,/usr/include,.
Кроме того, на Unix-системах можно также использовать форму "${HOME}". Имя в фигурных скобках в этом случае может содержать неименные символы. Обратите внимание, что если вы желаете использовать это для команды "gf", то необходимо добавить символы '{' и '}' в значение опции 'isfname'.
ЗАМЕЧАНИЕ: подстановка переменных окружения и "~/" выполняется только в команде ":set", но не при изменении значения опции по команде ":let".
Обратите внимание, что максимальная длина опции после подстановки переменной ограничена. Величина ограничения зависит от операционной системы, как правило это 256 или 1024 символов.
2. Автоматическая настройка опций
Помимо изменения значений опций при помощи команды ":set" имеется три альтернативных метода автоматического изменения значений опций для одного или нескольких файлов:
- При запуске Vim инициализация опций выполняется из нескольких сценариев. См. раздел |инициализация|. Большинство операций по инициализации выполняется для всех последующих сеансов редактирования, а значение некоторых опций зависит от рабочего каталога, из которого был запущен Vim. Инициализационные файлы можно создать при помощи команд |:mkvimrc|, |:mkview| и |:mksession|.
- В начале редактирования нового файла также выполняются автоматические команды. Этим можно воспользоваться для установки опций для файлов, соответствующих шаблонам регулярных выражений, а также многих иных вещей. Подробнее об этом смотрите раздел |автокоманда|.
- Если в начале редактирования нового файла включена опция 'modeline', то ряд строк в начале и конце файла проверяется на наличие режимной строки. Подробности объясняются ниже.
Существует две формы режимной строки. Первая форма выглядит так:
[текст]{пробел}{vi:|vim:|ex:}[пробел]{опции}
[текст] | любой текст или его отсутствие |
{пробел} | по крайней мере один пробельный символ (<Space> или <Tab>) |
{vi:|vim:|ex:} | строка "vi:", "vim:" или "ex:" |
[пробел] | необязательный пробел |
{опции} | список опций и их значений, разделённых пробелами или символом ':', где каждая часть между символами ':' является аргументом команды ":set". |
Пример:
vi:noai:sw=3 ts=6
Вторая форма режимной строки совместима с некоторыми версиями Vi:
[текст]{пробел}{vi:|vim:|ex:}[пробел]se[t] {опции}:[текст]
[текст] | любой текст или его отсутствие |
{пробел} | по крайней мере один пробельный символ (<Space> или <Tab>) |
{vi:|vim:|ex:} | строка "vi:", "vim:" или "ex:" |
[пробел] | необязательный пробел |
se[t] | строка "set " или "se " (обратите внимание на пробел) |
{опции} | список опций и их значений, разделённых пробелами, где каждая часть является аргументом команды ":set". |
: | двоеточие |
[text] | любой текст или его отсутствие |
Пример:
/* vim: set ai tw=75: */
Пробел перед {vi:|vim:|ex:} является обязательным. Это уменьшает шанс, что обычное слово, например "lex:", будет ошибочно принято за начало режимной строки. Имеется одно исключение: "vi:" и "vim:" может также быть в самом начале строки (для совместимости с версией 3.0). Использование "ex:" в начале строки будет игнорироваться (поскольку это может быть сокращением английского слова "example:").
Опции из режимной строки устанавливаются так, как если бы их значения изменялись при помощи команды ":setlocal": новые значения применяются только к буферу, который содержит данное окно. Хотя режимная строка и позволяет изменять значения глобальных опций, такое использование весьма необычно. Если у вас открыто два окна и файлы, которые в них загружены, изменяют значения глобальных опций отлично друг от друга, то результат в конечном итоге зависит от того, какой файл был открыт в последнюю очередь.
Если режимная строка может быть использована не во всех версиях Vim, то вместо "vim:" можно указать версию редактора, в котором данная режимная строка применима:
vim{версия}: | версия с номером {версия} или более поздняя |
vim<{версия}: | версия более ранняя, чем {версия} |
vim={версия}: | версия {версия} |
vim>{версия}: | версия после указанной {версии} |
{версия} для Vim 6.0 записывается числом 600 (основная версия умноженная на 100 плюс подверсия).
Например, следующая режимная строка используется только в Vim 6.0 и более поздних версиях:
/* vim600: set foldmethod=marker: */
Чтобы использовать режимную строку только в версиях Vim перед 5.7:
/* vim<570: set sw=4: */
Между "vim" и ":" не должно быть пробелов.
Число строк, которые проверяются на наличие режимной строки задаётся опцией 'modelines'. Если опция 'modelines' выключена или значение опции 'modelines' равно 0, то файл не проверяется на наличие режимной строки.
Обратите также внимание, что в первой форме режимной строки используются все символы вплоть до конца строки, поэтому строка наподобие
/* vi:ts=4: */
приведёт к сообщению об ошибке, поскольку на хвосте строки имеются лишние символы "*/". Правильной строкой в таком случае будет
/* vi:set ts=4: */
При обнаружении ошибки во время разбора режимной строки оставшаяся часть строки игнорируется.
Если вы желаете включить в аргумент команды set символ ':', то его надо предварять символом '\'. Обратная косая черта перед символом ':' будет подавляться. Например:
/* vi:set dir=c\:\tmp: */
Эта команда задаёт значение опции 'dir' равным "c:\tmp". Удаляется только один символ перед символом ':', поэтому чтобы включить последовательность символов "\:" необходимо писать "\\:".
В режимной строке поддерживается использование только команды "set", что продиктовано соображениями безопасности: в противном случае вам могли бы подкинуть текстовый файл-троян, который бы использовал возможности режимной строки.
Совет: если вы хотите делать что-то ещё помимо изменения значений опций, то можно определить автокоманду, которая проверяет файл на наличие определённой строки. Например:
au BufReadPost * if getline(1) =~ "VAR" | call SetVar() | endif
После этого нужно определить функцию SetVar(), которая бы изменяла тем или иным образом строку, содержащую "VAR".
3. Список опций
В списке, который приводится ниже, все опции упоминаются как с полным, так и с сокращённым именем, если такое имеется. Вы можете использовать любую форму по своему усмотрению.
В этом документе подразумевается, что если булева опция включена, то это значит, что была введена команда ":set option". Если говорится, что опция выключена, то это значит была введена команда ":set nooption".
Некоторые опции имеют два значения по умолчанию: "по умолчанию Vim", которое используется, если опция 'compatible' выключена, и "по умолчанию Vi", которое используется при включённой опции 'compatible'.
Большая часть опций имеет одинаковое значение во всех окнах и буферах, за исключением ряда опций, которые относятся к отображению текста в окне. Такие опции могут иметь отдельное значение для каждого окна. Например, опция 'list' может быть включена в одном окне и выключена в другом для одного и того же текста, предоставляя возможность одновременно получить оба представления. Некоторые опции могут иметь значения, которые настраиваются отдельно для каждого файла. Например, опция 'textwidth' может иметь значение 78 для обычного текстового файла и 0 для файла с исходным текстом программы на языке C.
глобальная | одна опция для всех окон и буферов |
местная для окна | каждое окно использует собственную копию опции |
местная для буфера | каждый буфер использует собственную копию опции |
При создании нового окна значения опций из текущего окна используются в качестве значений по умолчанию для опций, которые определяются для каждого окна в отдельности. Что касается опций, которые определяются для каждого отдельного буфера, то поведение редактора зависит от флагов 's' и 'S' в значении опции 'cpoptions'. Если в значении этой опции указан флаг 's' (по умолчанию), то значения буферных опций копируются из текущего буфера перед первоначальной загрузкой буфера. Если указан флаг 'S', то эти значения копируются при каждом переходе к данному буферу, т.е. практически поведение ничем не отличается от использования глобальных опций. Если же флаги 's' и 'S' не указаны в значении опции 'cpoptions', то опции копируются из текущего буфера при создании нового буфера.
Не все опции поддерживаются во всех версиях. Для проверки возможности использования некой опции "foo" в команде ":set" можно использовать функцию "exists('&foo')". Это, однако, не означает, что значение действительно можно присваивать той или иной опции. Некоторые опции являются скрытыми, поэтому присваиваемые им значения не запоминаются. Для проверки действительной поддержки той или иной опции в данной версии редактора используйте функцию "exists('+foo')".
Список всех опций с короткими описания и ссылками для перехода к более подробной информации можно посмотреть в Краткий справочник (Опции).
Опции: A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,R,S,T,U,V,W
Примечание к русскому переводу:
Пример языковой раскладки 'langmap' для греческого языка в русском справочнике заменён на аналогичный пример для русского языка.
См. |русская_раскладка_langmap|.