Всем привет, с Вами еженедельная рубрика "Секреты Вим", и сегодня научимся делать меню!
Меню расширяет возможности привязок вроде map, о которых мы уже говорили. Привязки хороши, но они позволяют привязать только одну команду к одной клавише, сочетанию или последовательности. А иногда хочется иметь некоторый выбор.
Например, включить проверку орфографии: для русского, английского или итальянского языка, или выключить вовсе.
Или выйти из Вим (☺☺☺): безопасно (не выходить, если файл не сохранен), сохранить, закрыть вкладку, закрыть все вкладки, выйти с потерей изменений...
Или выбрать кодировку файла: cp1251, utf8, KOI8R, ...
Или поставить визуальную закладочку с одним из нескольких идентификаторов?
Можно определять свои меню, для упрощения операций и чтоб не запоминать сложные комбинации и команды. Это делается в .vimrc
Команда menu вешает команду на пункт меню (вложенность задается точкой).
Например, menu Spell.en :setlocal spell spelllang=en<CR>
Теперь в меню Spell есть пункт en, который включает проверку орфографии на английском. Таких логично создать несколько (для разных языков или диалектов и чтоб отключить проверку), иначе проще повесить команду на клавишу.
Выполнить пункт меню можно с помощью команды emenu: emenu Spell.en
Но это пока не меню, а просто что-то вроде макроса. Удобное имя для сложной команды. Настоящее меню тоже можно сделать, но нужно совершить еще несколько действий.
Выставим флаг wildmenu в .vimrc (set wildmenu) --- он позволяет перемещаться по пунктам меню, а также зададим клавишу для этого: set wildcharm=<Tab>
Теперь команда emenu Spell.<Tab> включает менюшку, по которой можно перемещаться табуляцией и выбрать пункт клавишей ввода.
А эту команду логично повесить на клавишу, например на <F7>, или комбинацию, вроде <C-Q>.
Вот примеры. Мои.
F7 --- меню для проверки орфографии:
set wildmenu
set wcm=<Tab>
menu spell.en :setlocal spell spelllang=en <CR>
menu spell.ru :setlocal spell spelllang=ru <CR>
menu spell.ru :setlocal spell spelllang=it <CR>
menu spell.none :setlocal spell spelllang= <CR>
map <F7> :emenu spell.<Tab>
F8 --- кодировки и концы строк (об этом как-нибудь в другой раз):
menu Enc.cp1251 :e ++enc=cp1251<CR>
menu Enc.utf8 :e ++enc=utf-8<CR>
menu Enc.koi8 :e ++enc=koi8-r<CR>
menu Enc.ibm866 :e ++enc=ibm866<CR>
menu Enc.iso88595 :e ++enc=iso-8859-5<CR>
menu Enc.UNIXCR :set fileformat=unix
menu Enc.DOSCR :set fileformat=dos
map <F8> :emenu Enc.<Tab>
Если хотите меню для выхода из Вим (sacramento sacramento)))):
menu Exit.close_tab :q<CR>
menu Exit.discard_tab :q!<CR>
menu Exit.save_and_close :wq<CR>
menu Exit.close_vim :qa<CR>
menu Exit.discard_everything :qa!<CR>
map <F10> :emenu Exit.<Tab>
Кстати, если <CR> в конце не поставите --- придется нажимать enter самому. В строке появится команда и надо самому ее выполнить. Кстати, может быть полезно, если у вас там команда вроде "удалить все безвозвратно")))
Итак, можно повесить сложные команды на пункты меню. Лучше однотипные, но никто не мешает свалить в одну кучу много отдельных команд. Тогда надо помнить не сами команды, а клавишу, на которые повешено меню. Это еще один шаг к совершенству! Хотя лучше все-таки основные команды помнить, чтобы не оказаться беспомощным без своего любимого .vimrc!