СПРАВОЧНИК ПО VIM - Брам Мооленаар

 

  1. Типы файлов
  2. Модули для типа файла
  3. Документация для основных модулей типа файла

Vi не имеет ни одной из обсуждаемых здесь команд.

1. Типы файлов

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

Для включения определения типа файла следует включить в сценарий настроек vimrc следующую команду:

:filetype on

Каждый раз при редактировании нового или существующего файла Vim будет пытаться опознать тип файла и настроить значение опции 'filetype' соответствующим образом. При этом срабатывает событие FileType, которое используется для настройки подсветки синтаксиса, значений опций и т.д.

ЗАМЕЧАНИЕ: Типы файла и включённая опция 'compatible' не осень хорошо сочетаются вместе, поскольку в Vi-совместимом режиме значения всех опций являются глобальными. Если вы ещё не отключили опцию 'compatible', то рекомендуется это сделать.

Подробности: Команда ":filetype on" загружает один из следующих сценариев:

Amiga $VIMRUNTIME/filetype.vim
Mac $VIMRUNTIME:filetype.vim
MS-DOS $VIMRUNTIME\filetype.vim
RiscOS Vim:Filetype
Unix $VIMRUNTIME/filetype.vim
VMS $VIMRUNTIME/filetype.vim
В этом сценарии определяются автокоманды для событий BufNewFile и BufRead. Если тип файла не определяется по имени, то для определения типа файла используется анализ содержимого файла при помощи сценария $VIMRUNTIME/scripts.vim.

О добавлении собственных типов файлов рассказывается в разделе |новый_тип_файла| ниже.

Если тип файла не определяется автоматически, или определяется неправильный тип файла, вы можете изменить значение опции 'filetype' вручную или добавить команду изменения типа файла в режимную строку в самом файле. Например, для файла IDL можно использовать команду

:set filetype=idl

или добавить в файл следующую |режимную_строку|:

/* vim: set filetype=idl : */

Для включения загрузки модулей, связанных с определёнными типами файлов, используйте команду

:filetype plugin on

При этом будет включено обнаружение типа файла, если это ещё не было сделано. Фактически при этом происходит загрузка сценария "ftplugin.vim" из каталога, указанного в значении опции 'runtimepath'. В результате при редактировании файла загружается соответствующий модуль типа файла (если такой существует). См. также |тип_файла-модули|.

Для отключения загрузки модулей типа файла используйте команду

:filetype plugin off

При этом обнаружение типа файла не отключается. Однако, модули также не будут загружаться и в том случае, если вы отключите обнаружение типа файла. Фактически при выполнении этой команды происходит загрузка сценария "ftplugof.vim" из каталога, указанного в значении опции 'runtimepath'.

Загрузка сценария настройки отступов для определённого типа файлов включается по команде

:filetype indent on

При этом будет включено обнаружение типа файла, если это ещё не было сделано. Фактически при этом происходит загрузка сценария "indent.vim" из каталога, указанного в значении опции 'runtimepath'. В результате при редактировании файла загружается соответствующий сценарий настройки отступов для данного типа файла (если такой существует).

См. также |отступы-выражения|.

Для отключения загрузки сценария настройки отступов используйте команду

:filetype indent off

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

Фактически при выполнении этой команды происходит загрузка сценария "indoff.vim" из каталога, указанного в значении опции 'runtimepath'.

Для отключения обнаружения типа файла используйте команду

:filetype off

Эта команда сохраняет состояние флагов "plugin" (для загрузки модулей типа файла) и "indent" (для загрузки сценариев настройки отступов), однако эти сценарии не будут работать до тех пор, пока не будет дана команда  ":filetype on", поскольку обнаружение типа файла происходить не будет.

Обзор:

команда обнаружение модули отступы
:filetype on вкл без изменений без изменений
:filetype off выкл без изменений без изменений
:filetype plugin on вкл вкл без изменений
:filetype plugin off без изменений выкл без изменений
:filetype indent on вкл без изменений вкл
:filetype indent off без изменений без изменений выкл
:filetype plugin indent on вкл вкл вкл
:filetype plugin indent off без изменений выкл выкл

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

:filetype

Её вывод может выглядеть примерно так:

filetype detection:ON  plugin:ON  indent:OFF

Типы файлов также применяются для настройки подсветки синтаксиса. Обнаружение типа файлов также включается при выполнении команды ":syntax on". Выполнение команды ":filetype on" не требуется после применения ":syntax on".

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

Для включения обнаружения типа файла используйте команду

:filetype detect

Вы можете использовать эту команду в том случае, если начинаете редактировать пустой файл и вводите некий текст, по которому становится возможным определить тип файла. Например, при вводе строки "#!/bin/csh" при редактировании сценария оболочки.

При отключенном обнаружении типа файла оно будет включено, как при использовании параметра "on", перед тем, как будет выполнено обнаружение.

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

имя файла переменная
*.asa g:filetype_asa
*.asp g:filetype_asp
*.asm g:asmsyntax
*.prg g:filetype_prg
*.pl g:filetype_pl
*.inc g:filetype_inc
*.w g:filetype_w
*.i g:filetype_i
*.p g:filetype_p
*.sh g:bash_is_sh

Чтобы избежать обнаружения типа файла в некоторых файлах, используйте переменную g:ft_ignore_pat. Её значение по умолчанию может иметь, например, такой вид:

:let g:ft_ignore_pat = '\.\(Z\|gz\|bz2\|zip\|tgz\)$'

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

Если необходимый вам тип файла не определяется, то в вашем распоряжении имеются три возможности добавить новый тип файла. В любом случае, лучше избежать редактирования файла $VIMRUNTIME/filetype.vim, поскольку он будет перезаписан при установке новой версии Vim.

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

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

    1. Создайте пользовательский каталог рабочей среды. Обычно для этой цели используется первый каталог из перечисленных в значении опции 'runtimepath'. После этого необходимо создать в этом каталоге подкаталог "ftdetect". Пример для Unix:

      :!mkdir ~/.vim
      :!mkdir ~/.vim/ftdetect
    2. Создайте файл, в котором содержится автокоманда для определения типа файла. Например:

      au BufRead,BufNewFile *.mine                set filetype=mine

      Обратите внимание, что вы не должны указывать команду "augroup", поскольку это уже будет сделано к моменту считывания вашего модуля определения типа файла. Вы также можете использовать шаблон имени файла "*", с тем, чтобы затем выполнить определение по содержанию файла. Сохраните этот файл под именем "mine.vim" в подкаталоге "ftdetect" в каталоге пользовательской рабочей среды. Например, для Unix:

      :w ~/.vim/ftdetect/mine.vim
    3. Для использования нового файла определения типа файла необходимо перезапустить Vim.

      Файлы в каталоге "ftdetect" используются после выполнения всех проверок по умолчанию, так что они могут приводить к переопределению раннее определённого типа файла.
  2. Метод, позволяющий определить тип файла после выполнения проверок, используемых по умолчанию.

    Этот метод работает как и вышеприведённый метод А, но вместо безусловного изменения опции 'filetype' используется команда ":setfiletype". Эта команда позволяет назначать тип файла только в том случае, если тип файла ещё не был определён. Например:

    au BufRead,BufNewFile *.txt             setfiletype text

    Вы можете также использовать в команде уже определённый тип файла. Например, для назначения типа файла "mypascal" в том случае, если был определён тип "pascal":

    au BufRead,BufNewFile *                if ft == 'pascal' | set ft=mypascal
                                                             | endif
  3. Метод, который применяется в тех случаях, когда тип файла определяется по имени файла.
    1. Создайте пользовательский каталог рабочей среды. Обычно для этой цели используется первый каталог из перечисленных в значении опции 'runtimepath'. Пример для Unix:

      :!mkdir ~/.vim
    2. Создайте файл, содержащий автокоманды для определения типа файла.

      Пример:

      " my filetype file
      if exists("did_load_filetypes")
        finish
      endif
      augroup filetypedetect
        au! BufRead,BufNewFile *.mine          setfiletype mine
        au! BufRead,BufNewFile *.xyz           setfiletype drawing
      augroup END

      Этот файл следует сохранить под именем "filetype.vim" в пользовательском каталоге рабочей среды. Например, в Unix:

      :w ~/.vim/filetype.vim
    3. Для использования обнаружения нового типа файла следует перезапустить Vim.

      Ваш собственный файл filetype.vim считывается до определения используемых по умолчанию автокоманд FileType. Иными словами, сначала будут отрабатываться ваши автокоманды, поэтому используется команда ":setfiletype", которая обеспечивает, что после её выполнения значение опции 'filetype' не будет изменено другими автокомандами.

  4. Метод используется в том случае, если тип файла может быть определён только путём анализа содержимого файла.
    1. Создайте пользовательский каталог рабочей среды. Обычно для этой цели используется первый каталог из перечисленных в значении опции 'runtimepath'. Пример для Unix:

      :!mkdir ~/.vim
    2. Создайте сценарий vim для выполнения поставленной задачи. Например:

      if did_filetype()        " тип файла уже определён...
      finish                " ...не выполнять указанные проверки
      endif
      if getline(1) =~ '^#!.*\<mine\>'
      setfiletype mine
      elseif getline(1) =~? '\<drawing\>'
      setfiletype drawing
      endif

      См. другие примеры в $VIMRUNTIME/scripts.vim.

      Сохраните этот файл под именем "scripts.vim" в пользовательском каталоге рабочей среды.  Например, в Unix:

      :w ~/.vim/scripts.vim
    3. Определение типа начнёт работать немедленно, вы можете не перезапускать Vim.

      Ваш собственный файл scripts.vim загружается до выполнения определённых по умолчанию проверок типа файла. Это значит, что ваши правила будут переопределять принятые по умолчанию в файле $VIMRUNTIME/scripts.vim.

Если тип файла определяется неверно, то следует использовать собственный сценарий filetype.vim или scripts.vim (см. выше). Вы можете изменить значение опции 'filetype' на несуществующее имя, чтобы избежать последующего изменения значения данной опции:

:set filetype=ignored

Если вы настраиваете многопользовательскую систему и не хотите, чтобы каждый пользователь добавлял или удалял одни и те же типы файлов, то поместите сценарии filetype.vim и scripts.vim в общесистемном рабочем каталоге. Имя каталога можно посмотреть в значении опции 'runtimepath'. Если общесистемный каталог рабочей среды не определён, то настройте значение опции 'runtimepath' в общесистемном файле настроек vimrc (см. |vimrc-системный_файл|). Будьте внимательны, чтобы сохранить значения каталогов по умолчанию!

На операционных системах, которые способны сохранять тип файла в самом файле можно указать автокоманду, которая должна исполняться только для определённых типов файла.

При этом проверка типа файла будет зависеть от операционной системы, на которой исполняется Vim; подробности см. в документации по операционной системе.

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

:au BufRead *.html,<&faf;HTML>  runtime! syntax/html.vim

Эта команда будет выполняться:

  • Для всех файлов с расширением `.html'.
  • Для всех файлов, тип которых имеет значение `&faf' или 'HTML', причём значение этих типов зависит от того, какая версия Vim используется. Неизвестные типы НЕ будут соответствовать такому шаблону.

Вы можете одновременно использовать и тип, и шаблон (в этом случае, для выполнения автокоманды должно удовлетворяться условие совпадения как типа, так и шаблона):

:au BufRead <&fff>diff*

Эта команда будет выполняться для файлов с типом `&fff', имена которых начинаются с `diff'.

Обратите внимание, что проверка типа файла средствами операционной системы будет пропускаться, если Vim скомпилирован без особенности |+osfiletype|.

Каталог "plugin" может находиться в любом каталоге, перечисленном в значении опции 'runtimepath'. Поиск и загрузка модулей происходит во всех перечисленных в значении данной опции каталогах. Например, если по команде

set runtimepath

выводится:

runtimepath=/etc/vim,~/.vim,/usr/local/share/vim/vim60

то Vim будет выполнять загрузку всех модулей в следующих каталогах:

/etc/vim/plugin/
~/.vim/plugin/
/usr/local/share/vim/vim60/plugin/

Обратите внимание, что в последнем случае выполняется подстановка значения $VIMRUNTIME.

Что делать, если есть подозрение, что ваш модуль не загружается? Вы можете установить, что именно происходит при запуске Vim с помощью ключа командной строки запуска |-V|:

vim -V1

Вы увидите много сообщений, среди которых будет также сообщение о загрузке модулей, которое начинается со строки:

Поиск "plugin/*.vim" в

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

2. Модули для типа файла

При включённой загрузке модулей типов файла |:filetype-plugin-on| будет выполняться настройка опций и определение привязок специально для данного типа. Все они являются местными по отношению к буферу и не используются для других файлов.

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

  1. Присвойте переменной "maplocalleader" последовательность нажатий кнопок, которая будет использоваться для начала привязки. Например,
    :let maplocalleader = ","

    Все привязки в этом случае будут начинаться с символа запятой вместо принятого по умолчанию символа обратной косой. См. также |<LocalLeader>|.

  2. Определите собственную привязку. Например:
    :map ,p <Plug>MailQuote

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

  3. Отключите определение привязок для определённого типа файла путём изменения значения переменной, содержащей имя типа файла. Для типа файла "mail" это может быть выполнено при помощи следующей команды:
    :let no_mail_maps = 1
  4. Отключите определение привязок для всех типов файлов с помощью изменения значения переменной:
    :let no_plugin_maps = 1

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

  1. Добавление нескольких настроек.

    Вы должны создать новый модуль типа файла в каталоге, который встречается в значении опции 'runtimepath' до общесистемного каталога. Например, в Unix можно использовать следующий файл:

    vim ~/.vim/ftplugin/fortran.vim

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

  2. Внесение изменений в копию существующего файла модуля. Копию следует поместить в каталоге, который встречается в значении опции 'runtimepath' до общесистемного каталога. Например, в Unix можно использовать такую команду:
    cp $VIMRUNTIME/ftplugin/fortran.vim ~/.vim/ftplugin/fortran.vim

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

    Недостатком указанного метода является то, что при улучшении модуля, включённого в поставку Vim, вам придётся вносить изменения в собственный модуль.

  3. Переопределение настроек, выполненных при загрузке общесистемного модуля. В данном случае вам потребуется создать новый модуль типа файла в каталоге, который находится ближе к концу в списке, заданном в значении опции 'runtimepath'. Например, в Unix можно использовать следующий файл:
    vim ~/.vim/after/ftplugin/fortran.vim

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

3. Документация для основных модулей типа файла.

CHANGELOG (Журнал изменений)

Этот модуль облегчает внесение новых записей в файлы типа Changelog (применяемые для ведения журнала изменений). В нём определяется несколько команд, привязок и переменных, достойных вашего внимания:

Опции:

'comments' пустая строка, чтобы не нарушать форматирование.
'textwidth' используется стандартное значение 78.
'formatoptions' добавляется флаг 't', позволяющий выполнять перенос при вставке текста.

Команды:

NewChangelogEntry Добавляет новую запись в журнал изменений Changelog в интеллектуальном режиме (см. ниже)

Местные привязки:

<Leader>o Начинает вставку новой записи в журнале изменений Changelog в не менее интеллектуальном режиме (см. ниже)

Глобальные привязки:

ЗАМЕЧАНИЕ: доступ к глобальным привязкам организуется путём предварительной загрузки файла ftplugin/changelog.vim, например по команде:

runtime ftplugin/man.vim

выполняемой из файла |.vimrc|.

<Leader>o Выполняется переход в буфер ChangeLog, открытый для рабочего каталога, либо открывает его в новом буфере, если тот уже существует в рабочем каталоге. После этого выполняются те же действия, что и для местной привязки <Leader>o, описанной выше.

Переменные:

g:changelog_timeformat Формат даты (и времени), применяемый в записях в журнале изменений ChangeLog.
Формат описывается тем же способом, что и для функции |strftime()|.
По умолчанию используется строка "%Y-%m-%d", которая является общепринятым форматом во многих журналах ChangeLog.
g:changelog_username Имя и адрес электропочты пользователя.
Значения по умолчанию берутся из переменных среды окружения и системных файлов. При этом выполняется поиск комментария для данного пользователя в файле /etc/passwd вплоть до первой запятой-разделителя, где часто содержится настоящее имя пользователя, затем проверяется значение переменной окружения $NAME, и наконец, проверяется вывод команд `whoami` и `hostname` для создания адреса электропочты. Окончательный формат значения переменной выглядит так:
Полное Имя  <пользователь@компьютер>
g:changelog_new_date_format Формат, который используется при создании новой записи даты. В строке могут быть использованы следующие спецэлементы:
%% одиночный символ '%'
%d дата, как описано выше
%u данные о пользователе, как описано выше
%c где поместить курсор после выполненияоперации

По умолчанию используется значение

"%d  %u\n\n\t* %c\n\n", 

которое приводит к созданию записи примерно следующего вида (| показывает, где будет находиться курсор, кроме начала строки, где этот символ используется для того, чтобы показать начало строки)

|2003-01-14  Полное Имя <пользователь@компьютер>
|
|        * |
g:changelog_new_entry_format Формат, который применяется при создании новой записи. В строке могут быть использованы следующие спецэлементы:
%c где поместить курсор после выполнения операции

По умолчанию используется значение

"\t*%c", 

которое приводит к созданию записи примерно следующего вида

|        * |
g:changelog_date_entry_search Шаблон, который используется при поиске даты внесения записи.
В шаблоне можно применять те же самые спецэлементы, что и для переменной g:changelog_new_date_format. По умолчанию используется значение
'^\s*%d\_s*%u',

которое позволяет находить строки следующего вида:

|2003-01-14  Полное Имя <пользователь@компьютер>

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

FORTRAN

Опции:

'expandtab' включено, чтобы избежать вставки символов табуляции, как это требуется правилами записи исходного кода на языке Fortran.
'textwidth' 72, при использовании жёсткого формата, требуемого стандартами языка Fortran, и 80 для свободного формата
'formatoptions' настраивается таким образом, чтобы разбивать строки кода и комментариев, но сохранять длинные строки. Для форматирования комментариев можно использовать команду |gq|.

Более подробно fortran_have_tabs и метод, который применяется для обнаружения формата исходного кода, обсуждаются в разделе |fortran-синтаксис|.

MAIL (Почтовое сообщение)

Опции:

'modeline' отключается, чтобы обезопасить пользователя от троянских коней в сообщении и предупредить появление сообщения об ошибке, которое могло бы выводиться в том случае, когда в строке заголовка темы (Subject) содержится строка "Vim:".
'textwidth' 72, это значение часто рекомендуется использовать в сообщениях электропочты.
'formatoptions' настраивается таким образом, чтобы разбивать строки текста и повторять первый символ комментария на новой строке, что позволяет повторять символ ">" при цитировании. Для форматирования цитируемого текста можно также использовать команду |gq|.

Местные привязки:

<LocalLeader>q или \\MailQuote Выполняет цитирование текста, выделенного в Визуальном режиме или от позиции курсора до конца файла в Обычном режиме. В начале каждой строки при этом вставляются символы "> "
MAN

Показывает страницу справочника man. См. также раздел Руководства пользователя |поиск_в_man|.

Чтобы начать пользоваться командой ":Man" перед первой загрузкой страницы справочника, выполните считывание соответствующего сценария из инициализационного файла vimrc:

runtime ftplugin/man.vim

Опции:

'iskeyword' Добавляется символ '.', чтобы позволить использование CTRL-] на имени страницы справочника.

Команды:

Man {имя} Показать страницу справочника с указанным {именем} в окне.
Man {номер} {имя} Показать страницу справочника с указанным {именем} из раздела с указанным {номером}.

Глобальная привязка:

<Leader>K Показать страницу справочника для имени в позиции курсора.

Местные привязки:

CTRL-] Перейти к странице справочник для слова в позиции курсора.
CTRL-T Вернуться к предыдущей странице справочника.

RPM SPEC

Описание этого модуля довольно длинное, поэтому оно помещено в отдельный файл: |pi_spec.txt|.