РУКОВОДСТВО ПОЛЬЗОВАТЕЛЯ VIM - Брам Мооленаар

Добавление новых меню

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

42.1    Введение
42.2    Команды меню
42.3    Разное
42.4    Панель инструментов и всплывающие меню

Следующая глава: Использование типов файлов
Предыдущая глава: Написание сценариев Vim
Содержание: Руководство пользователя Vim


42.1 Введение

Меню, используемые в Vim, определены в файле "$VIMRUNTIME/menu.vim". Если вы хотите написать свои собственные меню, то прежде всего взгляните на этот файл

Для определения элемента меню пользуйтесь командой ":menu". Общий вид этой команды такой:

:menu {элемент-меню} {последовательность-нажатий}

{элемент-меню} указывает, где должен быть помещён данный пункт меню. Типичный пример {элемента-меню} -- "Файл.Сохранить", описывающий пункт "Сохранить" в меню "Файл". Для разделения нескольких имён используется точка. Пример:

:menu Файл.Сохранить  :update<CR>

Команда ":update" записывает содержимое буфера на диск в том случае, если оно было изменено.

Вы можете добавить дополнительный уровень в меню: "Редактировать.Настройки.Ширина\ сдвига" определяет подменю "Настройки" в меню "Редактировать" с элементом "Ширина сдвига". Можно использовать и более глубокие уровни меню, главное следить, чтобы этим было удобно пользоваться.

Команда ":menu" очень похожа на команду ":map": в левой части указывается как вызвать команду, указанную в правой части. {последовательность-нажатий} это символы, которые будут использованы точно так же, как если бы вы их набирали с клавиатуры. Поэтому, если в режиме Вставки {последовательность-нажатий} будет вставлена непосредственно в текст.

БЫСТРЫЕ КНОПКИ

Чтобы указать кнопку для быстрого вызова меню используйте символ амперсанда (&) перед необходимым символом в меню. Например, для выбора меню "Файл" можно использовать Alt-Ф, а затем выбрать команду "Сохранить" с помощью "С" (такое поведение может быть отменено с помощью опции 'winaltkeys'!). Иными словами, {элемент-меню} может задаваться как "&Файл.&Сохранить". Кнопка быстрого доступа в меню будет подчёркнута.

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

ПРИОРИТЕТЫ

В действительности определение элемента Файл.Сохранить выглядит так:

:menu 10.340 &Файл.&Сохранить<Tab>:w  :confirm w<CR>

Число 10.340 называется числом приоритета. Оно используется редактором для определения местоположения меню. Первый номер, (10) указывает на положение в строке меню. Меню с меньшими числами расположены слева, с большими -- справа.

Вот приоритеты, которые используются для стандартных меню:

  10      20            40           50         60      70    9999
+-----------------------------------------------------------------------+
| Файл    Редактировать Инструменты  Синтаксис  Буферы  Окно  Справка |
+-----------------------------------------------------------------------+

Обратите внимание, что для меню Справка используется очень большое число, с тем, чтобы оно появлялось справа.

Второе число (340) определяет положение элемента внутри меню. Меньшие числа соответствуют более высокому положению меню, большие -- более низкому. Вот приоритеты элементов в меню "Файл":

          +-----------------------------------+
10.310    |Открыть...                        |
10.320    |Разделить и открыть...             |
10.325    |Новый                            |
10.330    |Закрыть                    |
10.335    |---------------------------------- |
10.340    |Сохранить                    |
10.350    |Сохранить как...                |
10.400    |---------------------------------- |
10.410    |Сравнить с...                      |
10.420    |Сравнить с изменённым заплаткой... |
10.500    |---------------------------------- |
10.510    |Печать                            |
10.600    |---------------------------------- |
10.610    |Записать и выйти                |
10.620    |Выход                            |
       +-----------------------------------+

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

При создании подменю вы можете добавить другое ".число" к приоритету. Таким образом, каждый элемент в {элемент-меню} имеет собственный приоритет.

СПЕЦИАЛЬНЫЕ СИМВОЛЫ

В нашем примере {элементом-меню} является "&Файл.&Сохранить<Tab>:w". Это приводит к необходимости сделать важное замечание: {элемент-меню} должен быть одним словом. Если вы хотите поместить точку, пробелы или символ табуляции в названии меню, то вы должны либо использовать соглашение о <> (<Space> и <Tab>, например), либо экранировать эти символы при помощи обратной косой черты (\). >

:menu 10.350 &Файл.&Сохранить\ &как\.\.\. :browse confirm saveas<CR>

В этом примере определён элемент меню "Сохранить как...", содержащий пробел и выполняющий команду ":browse confirm saveas<CR>".

Символ <Tab> в имени элемента меню используется для разделения собственно имени от подсказки для пользователя. Часть, которая в имени следует после <Tab> выравнивается по правому краю меню. В меню Файл.Сохранить используется имя "&Файл.&Сохранить<Tab>:w". Иными словами, имя меню "Файл.Сохранить", а подсказка -- ":w".

РАЗДЕЛИТЕЛИ

Разделители, используемые для группировки связанных по смыслу пунктов меню, определяются при помощи имён, которые начинаются с '-' и заканчиваются также на '-'. Например, "-sep-". При использовании нескольких разделителей, их имена должны быть различными. Во всех остальных отношениях имя не имеет значения.

Команда, указанная в разделителе никогда не выполняется, но все равно должна быть указана. Достаточно указать двоеточие. Пример:

:amenu 20.510 Редактировать.-sep3- :

42.2 Команды меню

Вы можете определять элементы меню для конкретных режимов редактора. Имена команд похожи на варианты команды ":map":

:menu Обычный, Визуальный и режим ожидания оператора
:nmenu Обычный режим
:vmenu Визуальный режим
:omenu Режим ожидания оператора
:menu! Режимы Вставки и Командной строки
:imenu Режим Вставки
:cmenu Режим Командной строки
:amenu Все режимы

Чтобы избежать использования привязок внутри команд меню, пользуйтесь командами ":noremenu", ":nnoremenu", ":anoremenu" и т.д.

ИСПОЛЬЗОВАНИЕ :AMENU

Команда ":amenu" немного отличается от остальных. Дело в том, что она предполагает, что указанная вами {последовательность-нажатий} выполняется в Обычном режиме. Если Vim находится в Визуальном режиме или в режиме Вставки, то при использовании этого меню Vim прежде всего перейдёт в Обычный режим. ":amenu" само подставляет для вас CTRL-C или CTRL-O. Например, если вы введёте команду:

:amenu  90.100 Моё.Найти\ слово  *

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

Обычный режим: *
Визуальный режим: CTRL-C *
Режим ожидания оператора: CTRL-C *
Режим Вставки: CTRL-O *
Режим Командной строки: CTRL-C *

В режиме Командной строки CTRL-C прерывает набранную команду. В Визуальном режиме и в режиме ожидания оператора CTRL-C прекращает текущий режим. CTRL-O в режиме вставки выполняет одну команду и возвращается в режим Вставки.

CTRL-O работает только для одной команды. Если вам надо использовать несколько команд, то поместите их в функцию и используйте вызов этой функции. Пример:

:amenu  Моё.Следующий\ файл  :call <SID>NextFile()<CR>
:function <SID>NextFile()
:  next
:  1/^Code
:endfunction

Данное меню позволяет перейти к следующему файлу в списке аргументов по команде ":next". Затем происходит поиск строки, начинающейся с "Code".

<SID> перед именем функции это идентификатор сценария. Это позволяет сделать данную функцию локальной для данного файла сценария Vim и избежать проблем, связанных с объявлением функции с тем же именем в другом файле сценария. См. |<SID>|.

НЕМЫЕ МЕНЮ

Меню выполняет {последовательность-нажатий} так, как будто вы набирали бы её сами. Для команд ":" это означает, что вы увидите команду в командной строке. Для длинных команд появится запрос на нажатие Enter, что может быть очень некрасиво.

Чтобы этого избежать, сделайте ваше меню "немым". Этого можно добиться с помощью аргумента <silent>. Например, в предыдущем примере используется вызов функции NextFile(). При выборе этого пункта меню в командной строке появится:

:call <SNR>34_NextFile() ~

Чтобы избежать появления этого текста в командной строке, вставьте аргумент "<silent>":

:amenu <silent> Моё.Следующий\ Файл :call <SID>NextFile()<CR>

Не используйте "<silent>" слишком часто. Для коротких команд в нём нет необходимости. Если ваше меню использует кто-то другой, то отображение команды в строке также даёт некоторую подсказку о том, что пришлось бы набирать пользователю вручную вместо использования меню.

СПИСОК МЕНЮ

Если команда меню используется без {последовательности-нажатий}, то она выводит список уже определённых меню. Вы можете указать {элемент-меню} или его часть, чтобы вывести список только некоторых меню. Пример:

:amenu

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

:amenu Редактировать

Эта команда покажет только элементы меню "Редактировать" для всех режимов. Чтобы посмотреть только определённый элемент для режима Вставки:

:imenu Редактировать.Отмена

Будьте внимательны при вводе имени. Регистр имеет значение, но можно не указывать '&' для быстрых кнопок, а также можно опускать <Tab> и всё, что следует после него.

УДАЛЕНИЕ МЕНЮ

Для удаления меню применяется та же команда, что и для показа списка, только вместо "menu" используется "unmenu". Иными словами, ":menu" становится ":unmenu", ":nmenu" становится ":nunmenu" и т.д. Для удаления элемента "Инструменты.Сделать" в режиме Вставки:

:iunmenu Инструменты.Сделать

Вы можете полностью удалить всё меню целиком:

:aunmenu Синтаксис

Это удаляет всё меню Синтаксис вместе со всеми его элементами.


42.3 Разное

Вы можете изменять вид меню при помощи флагов опции 'guioptions'. По умолчанию включаются все флаги. Удалить тот или иной флаг можно при помощи команды вроде

:set guioptions-=m
m Если флага нет, то меню не показывается.
M Если флага нет, то стандартные меню не загружаются.
g Если флага нет, то неактивные элементы удаляются из списка вместо использования серого цвета (работает не во всех системах).
t Если флага нет, то меню нельзя "оторвать".

Пунктирная строка в самом верху любого меню это не разделитель. При выборе этого элемента меню становится "оторванным": его элементы показываются в отдельном окне. Удобно, если часто использовать одно и то же меню.

О переводе элементов меню на другие языки см. |:menutrans|.

Поскольку для выбора меню используется мышь, то неплохая идея для выбора файла использовать диалог выбора файла, вызываемый по команде ":browse", а вместо вывода сообщения об ошибке, например при несохранённых изменениях в текущем буфере, выводить диалог при помощи команды ":confirm". Эти команды можно объединять вместе:

:amenu Файл.Открыть  :browse confirm edit<CR>

Команда ":browse" вызывает диалог для выбора файла, а команда ":confirm" диалог для подтверждения выбора при наличии в буфере несохранённых изменений. У вас в этом случае есть возможность (не)сохранения изменений или отказа от выполнения команды.

Для более сложных вещей можно использовать функции confirm() и inputdialog(). В стандартных меню есть примеры использования этих функций.


42.4 Панель инструментов и всплывающие меню

Имеется также два специальных меню: ToolBar и PopUp. Элементы, которые начинаются с этих имён, не появляются в обычной строке меню.

ПАНЕЛЬ ИНСТРУМЕНТОВ

Панель инструментов отображается только в том случае, если в опции 'guioptions' указан флаг "T".

Панель инструментов использует для отображения команды значки вместо текста. Например, {элемент-меню} с именем "ToolBar.Новый" приводит к появлению значка "Новый" на панели инструментов.

В редакторе Vim имеется 28 встроенных значков. Полная таблица показана здесь: |встроенные+инструменты|. Большая их часть используется в стандартной панели инструментов. Вы можете переопределить значение этих элементов.

Вы также можете добавить в панель инструментов собственную картинку. Или определить новый элемент панели инструментов с тем или иным значком. Например, определим новый элемент панели инструментов при помощи следующих команд:

:tmenu ToolBar.Compile  Компилировать текущий файл
:amenu ToolBar.Compile  :!cc % -o %:r<CR>

Теперь вам потребуется создать значок. Для MS-Windows картинка должна быть в формате BMP, имя файла в данном случае "Compile.bmp". В Unix используется формат XPM, имя файла будет "Compile.xpm". Размер картинки должен быть 18 на 18 пикселов. На MS-Windows можно использовать и другой размер, но это будет некрасиво выглядеть.

Картинку следует поместить в каталог "bitmaps" в одном из каталогов, указанных в 'runtimepath'. Например, для Unix это может быть "~/.vim/bitmaps/Compile.xpm".

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

:tmenu ToolBar.Make  Запуск make в текущем каталоге

Замечание: Обращайте внимание на используемый регистр символов. "Toolbar" и "toolbar" это обычные элементы меню, для панели инструментов нужно использовать именно "ToolBar"!

Для удаления подсказки используйте команду |:tunmenu|.

Опция 'toolbar' позволяет показывать вместо картинки текст, или использовать текст вместе с картинкой. Большинство людей, однако, пользуются только картинками, поскольку текст занимает место на экране.

ВСПЛЫВАЮЩЕЕ МЕНЮ

Всплывающее меню появляется под указателем мыши. На MS-Windows оно вызывается по нажатию на правую кнопку мыши. Затем вы можете выбрать необходимый элемент с помощью левой кнопки. На Unix всплывающее меню вызывается и используется при помощи нажатия и удерживания правой кнопки мыши.

Всплывающее меню появляется только в том случае, если значением опции 'mousemodel' является "popup" или "popup_setpos". Различие между этими двумя значениями состоит в следующем: "popup_setpos" перемещает курсор в позицию указателя мыши при нажатии. Если нажатие происходит в выделенной области, то эта область будет использоваться без изменений, но если вы нажимаете за пределами выделенной области, то область выделения будет удалена.

Для каждого режима существует отдельное меню, поэтому во всплывающем меню никогда не бывает неактивных элементов, в отличие от обычного меню.

В чём смысл жизни, Вселенной и вообще всего на свете?

Дуглас Адамс, единственный человек, который понимал, о чем именно этот вопрос, уже, к сожалению, умер. Так что вы можете спросить себя: а в чём смысл смерти?...

 


 

Следующая глава: Использование типов файлов
Авторские права: см. Авторские права