Привет, коллеги. Вим позволяет создавать новые ex-команды, то есть команды командной строки (которые вызываются через двоеточие). Это сложная тема, поскольку команда такая может иметь параметры, получать диапазон строк, а параметры еще и могут иметь какой-то смысл (имена файлов и т.п.) и автодополняться, как и встроенные команды Вим.
Лично я пока этой возможностью не пользовался, но полезно о ней знать. Может и пригодиться.
Ограничение: пользовательские команды начинаются с заглавной буквы. План завести команду tabnwe (частая опечатка) нерабочий(( Впрочем, можно завести Tabnew и Tabnwe, и пользоваться ими.
Все команды Вим, кроме двух, начинаются с строчной буквы. Исключения: Next и X. Еще есть Print, но она устаревшая и ее можно переопредлять.
Цифры в имени использовать можно (не первой, конечно), но надо иметь в виду, что My4 может означать My 4, так что не стоит создавать одновременно команды My и My4.
Созданная команда может сокращаться при применении, как и обычная. То есть, MyCommand можно вызвать как MyC или даже My. Если у вас нет команды Myrr.
В случае двусмысленности правила такие: если неразличимы две пользовательские команды — это ошибка, пусть пользователь разбирается. Если же пользовательская и встроенная имеют одно сокращение, выполняется встроенная.
Создаются команды командой command. Без параметров она покажет все созданные команды. С одним параметром покажет все, которые начинаются с данной последовательности символов.
Если параметров два или более, создается новая команда:
command имя текст_команды
Если указан восклицательный знак, существующая команда перезаписывается. Если нет, существование команды является ошибкой: можно создавать только новые. Аналогично записи файлов.
Удалить команду можно с помощью delcommand. Можно удалить вообще всё, что наворотили: comclear.
Теперь мы можем создавать команды, которые что-то делают, раз навсегда фиксированное. Теперь обсудим аргументы разного рода.
Перед именем новой команды можно задать атрибуты, похожие на ключи командной строки UNIX. В их числе, например, -nargs=, после знака равенства может быть 0 (аргументы не нужны, так по умолчанию), 1, * (любое число аргументов, в том числе ни одного), ? (аргументов нет или один), + (аргументов больше нуля). Аргументы разделяются пробелами или табуляциями — как обычно.
Можно указать, какой смысл имеют аргументы, чтобы Вим мог их автодополнять. Для этого предусмотрен атрибут -complete=, у которого много значений. В их числе file (имена файлов и каталогов), dir (каталоги), expression (выражения), environment (переменные окружения), buffer (имена открытых файлов), shellcmd (команды оболочки), user (имена пользователей) и многое другое.
Можно сделать и свою дополнялку: см. Справку.
Далее, пользовательские команды по умолчанию не принимают диапазон строк. Но могут и принимать: для этого есть свой атрибут -range, который может просто быть (диапазон возможен, по умолчанию текущая строка), а может иметь вид -range=% (по умолчанию весь файл).
Еще можно сделать команду, принимающую числовой повторитель перед ней (а не диапазон). Для них предусмотрен вариант -range=N (указывается повторитель, по умолчанию N). Можно указать -count=N, тогда повторитель, по умолчанию N, может быть указан перед командой или как первый аргумент. При этом -count означает -count=0.
Переданный команде диапазон может относиться к строкам, но это необязательно. Вы можете уточнить это: -addr= со значениями lines (строки, по умолчанию), windows (окна), tabs (вкладки), buffers (открытые файлы) и еще кое-что.
Еще можно разрешить команде принимать восклицательный знак (-bang), быть частью составной команды (-bar, тогда символ | считается разделителем команд — в противном случае он идет аргументом команды). Можно указать атрибут -register (первый аргумент может быть регистром, как у команды :del) и -buffer (команда локальна для данного буфера).
Теперь как этим всем воспользоваться в определяемой команде? Для этого есть специальные последовательности в уголках: <...>.
Чтобы использовать символ <, вставляйте его как <lt>.
Эти последовательности дают доступ ко всем аргументам команды:
<line1> — номер первой строки диапазона.
<line2> — номер последней строки диапазона.
<bang> — превратится в восклицательный знак, если он был указан.
<count> — значение повторителя, если он указан.
<reg> — регистр, если указан
<args> — аргументы команды
<lt> — как уже сказано, литерально символ <
Если между открывающим уголком и первым символом вставить q-, то значение будет "закавычено" так, чтобы быть пригодным для выражения.
Если же указать f-, то соответствующий текст будет преобразован в список аргументов функции: разделится на элементы по пробелам, они сложатся в список, разделенный запятыми, заменит пары слешей \\ на один слеш, и все в таком роде.
Пример: command -nargs=1 Add42 echo <q-args>+42
Пример из следующей заметки (про плагин justify):
command! -range -nargs=* Justify <line1>,<line2>call Justify(<f-args>)
Еще примеры из Справки:
:com Ddel +,$d — удалит все до конца файла
:com -nargs=1 -bang -complete=file Ren file <args>|w<bang> — переименует текущий буфер.
:com! -range -nargs=0 Lines echo <line2> - <line1> + 1 "lines" — сосчитает число строк в диапазоне.
Удачи, коллеги!