Come definire un popup / menu personalizzato in vimrc


19

Assegnare ogni funzione utile a un tasto funziona bene per gli strumenti usati di frequente, ma ci sono alcune operazioni che uso così raramente, che preferirei assegnarle ad alcuni menu popup definiti nel mio vimrc.

Ho visto plugin come CtrlP aprire un elenco popup quindi questo dovrebbe essere possibile.

Quindi la mia domanda è:

Come definire un menu popup personalizzato che può eseguire vari comandi?


Nota: questo dovrebbe funzionare anche in un terminale.

Qualcosa come il plugin CtrlP o dmenu su X11 sarebbe l'ideale, dove puoi affinare le opzioni mentre digiti, ma sarebbe utile anche un diverso tipo di menu.

Risposte:


11

Fare questo out-of-the-box richiederebbe una discreta quantità di lavoro, ma penso che tu possa fare qualcosa di abbastanza semplice usando il plugin Unite.vim . Fornisce un'interfaccia di integrazione per la creazione di menu da varie fonti. (In effetti, alcuni hanno persino sostituito CtrlP con Unite .) Questo esempio nella documentazione di Unite (o dai un'occhiata a :help g:unite_source_menu_menus, una volta installato Unite) spiega come creare un menu di comandi di base.

Seguendo quella documentazione, ho trovato un semplice esempio che offre un menu di comandi. A scopo dimostrativo, l'ho impostato con i comandi per aprire NERDTree (dal plug-in NERDTree), mostrando una colpa git (dal plug-in fugitive.vim) e facendo il grepping per TODO in un progetto (usando il built-in :grep). Ho definito una mappatura con cui aprire il menu <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>

Puoi copiarlo nel tuo vimrce modificare l'elenco dei comandi definiti dall'array g:unite_source_menu_menus.my_commands.command_candidates. Ogni elemento dell'array è un array del modulo [Label, Command].

Nel mio esempio, my_commandsera un nome che ho scelto per identificare il mio menu. Puoi usare qualsiasi nome tu voglia.

Spero che sia di aiuto!

EDIT: aggiunti -start-inserte -ignorecaseopzioni alla mappatura per far iniziare il menu in modalità restringimento (come una ricerca fuzzy).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.