Como definir um pop-up / menu personalizado no vimrc


19

A atribuição de todas as funções úteis a uma tecla funciona bem para ferramentas usadas com freqüência, mas existem algumas operações que eu uso tão raramente, que eu preferiria atribuí-las a algum menu pop-up definido no meu vimrc.

Eu vi plugins como CtrlP abrir uma lista pop-up, então isso deve ser possível.

Então, minha pergunta é:

Como definir um menu pop-up personalizado que pode executar vários comandos?


Nota: isso também deve ser executado em um terminal.

Algo como o plugin CtrlP ou o dmenu no X11 seria ideal, onde você pode refinar as opções enquanto digita, mas um tipo diferente de menu também seria útil.

Respostas:


11

Fazer isso imediatamente exigiria uma quantidade considerável de trabalho, mas acho que você pode fazer algo bastante simples usando o plug-in Unite.vim . Ele fornece uma interface de integração para criar menus de várias fontes. (De fato, alguns até substituíram CtrlP por Unite .) Este exemplo na documentação do Unite (ou dê uma olhada :help g:unite_source_menu_menus, depois de instalar o Unite) detalha como criar um menu básico de comandos.

Após essa documentação, criei um exemplo simples que oferece um menu de comandos. Para fins de demonstração, configurei-o com comandos para abrir o NERDTree (do plug-in NERDTree), mostrando uma culpa git (do plug-in fugitive.vim) e grepping para TODOs em um projeto (usando o built-in :grep). Eu defini um mapeamento para abrir o 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>

Você pode copiar isso no seu vimrce editar a lista de comandos definidos pela matriz g:unite_source_menu_menus.my_commands.command_candidates. Cada item da matriz é uma matriz do formulário [Label, Command].

No meu exemplo, my_commandsfoi um nome que escolhi para identificar meu menu. Você pode usar qualquer nome que desejar.

Espero que isto ajude!

EDIT: Adicionado -start-inserte -ignorecaseopções ao mapeamento para iniciar o menu no modo de restrição (como uma pesquisa difusa).

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.