Як визначити спеціальне спливаюче меню / меню у vimrc


19

Призначення кожної корисної функції клавіші працює добре для часто використовуваних інструментів, але є деякі операції, які я використовую так рідко, що я вважаю за краще призначити їх деякому спливаючому меню, визначеному в моєму vimrc.

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

Отже, моє запитання:

Як визначити спеціальне спливаюче меню, яке може виконувати різні команди?


Примітка. Це також має працювати в терміналі.

Щось на зразок плагіна CtrlP або dmenu на X11 було б ідеально, де ви можете уточнити параметри під час введення, але меню інших типів теж буде корисним.

Відповіді:


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параметри відображення, щоб зробити меню запуск у режимі звуження (як нечіткий пошук).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.