Найти тему
Блокнот математика

Рубрика "Секреты Вим". Создание своих :команд

Привет, коллеги. Вим позволяет создавать новые 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" — сосчитает число строк в диапазоне.

Удачи, коллеги!

Научно-популярные каналы на Дзене: путеводитель
Новости популярной науки12 марта 2022