Как определить собственное всплывающее окно / меню в vimrc

19

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

Я видел плагины, такие как CtrlP, открывающие всплывающий список, так что это должно быть возможно.

Итак, мой вопрос:

Как определить собственное всплывающее меню, которое может запускать различные команды?


Примечание: это должно работать и в терминале.

Было бы идеально использовать что-то вроде плагина CtrlP или dmenu на X11, где вы можете уточнить параметры по мере ввода, но было бы полезно и другое меню.

ideasman42
источник

Ответы:

11

Выполнение этого из коробки потребовало бы значительного объема работы, но я думаю, что вы можете сделать что-то довольно простое, используя плагин Unite.vim . Он предоставляет интерфейс интеграции для создания меню из различных источников. (На самом деле, некоторые даже заменили CtrlP на Unite .) Этот пример в документации Unite (или посмотрите :help g:unite_source_menu_menus, как только вы установили Unite) подробно описывает, как создать базовое меню команд.

Следуя этой документации, я привел простой пример, который предлагает меню команд. В демонстрационных целях я установил его с помощью команд для открытия NERDTree (из плагина NERDTree), показа git-вины (из плагина fugitive.vim) и поиска в TODO в проекте (используя встроенный модуль :grep). Я определил отображение, чтобы открыть меню с <Leader>c.

# Initialize Unite's global list of menus
if !exists('g:unite_source_menu_menus')
    let g:unite_source_menu_menus = {}
endif

# Create an entry for our new menu of commands
let g:unite_source_menu_menus.my_commands = {
\    'description': 'My Commands'
\ }

# Define the function that maps our command labels to the commands they execute
function! g:unite_source_menu_menus.my_commands.map(key, value)
    return {
    \   'word': a:key,
    \   'kind': 'command',
    \   'action__command': a:value
    \ }
endfunction

# Define our list of [Label, Command] pairs
let g:unite_source_menu_menus.my_commands.command_candidates = [
\   ['Open/Close NERDTree', 'NERDTreeToggle'],
\   ['Git Blame', 'Gblame'],
\   ['Grep for TODOs', 'grep TODO']
\ ]

# Create a mapping to open our menu
nnoremap <Leader>c :<C-U>Unite menu:my_commands -start-insert -ignorecase<CR>

Вы можете скопировать это в свой vimrcи отредактировать список команд, определенных массивом g:unite_source_menu_menus.my_commands.command_candidates. Каждый элемент массива является массивом формы [Label, Command].

В моем примере это my_commandsбыло имя, которое я выбрал для идентификации своего меню. Вы можете использовать любое имя, какое захотите.

Надеюсь это поможет!

РЕДАКТИРОВАТЬ: Добавлены -start-insertи -ignorecaseопции для отображения, чтобы меню запускалось в режиме сужения (например, нечеткого поиска).

tommcdo
источник