Cómo definir un menú / ventana emergente personalizado en vimrc

19

Asignar todas las funciones útiles a una tecla funciona bien para las herramientas utilizadas con frecuencia, pero hay algunas operaciones que uso tan raramente que preferiría asignarlas a algún menú emergente definido en mi vimrc.

He visto complementos como CtrlP abrir una lista emergente, por lo que esto debería ser posible.

Entonces mi pregunta es:

¿Cómo definir un menú emergente personalizado que puede ejecutar varios comandos?


Nota: esto también debería ejecutarse en una terminal.

Algo como el complemento CtrlP o el menú en X11 sería ideal, donde puede refinar las opciones a medida que escribe, pero también sería útil un tipo diferente de menú.

ideasman42
fuente

Respuestas:

11

Hacer esto de forma inmediata requeriría una gran cantidad de trabajo, pero creo que puede hacer algo bastante sencillo utilizando el complemento Unite.vim . Proporciona una interfaz de integración para crear menús de varias fuentes. (De hecho, algunos incluso han reemplazado CtrlP con Unite ). Este ejemplo en la documentación de Unite (o eche un vistazo :help g:unite_source_menu_menus, una vez que haya instalado Unite) detalla cómo crear un menú básico de comandos.

Siguiendo esa documentación, se me ocurrió un ejemplo simple que ofrece un menú de comandos. Para fines de demostración, lo configuré con comandos para abrir NERDTree (desde el complemento NERDTree), mostrando una culpa git (desde el complemento fugitive.vim) y grepping para TODOs en un proyecto (usando el incorporado :grep). He definido una asignación para abrir el menú con <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>

Puede copiar esto en su vimrcy editar la lista de comandos definidos por la matriz g:unite_source_menu_menus.my_commands.command_candidates. Cada elemento de la matriz es una matriz del formulario [Label, Command].

En mi ejemplo, my_commandsfue un nombre que elegí para identificar mi menú. Puedes usar cualquier nombre que quieras.

¡Espero que esto ayude!

EDIT: Agregado -start-inserty -ignorecaseopciones para el mapeo para hacer que el menú de inicio en el modo (como un difuso-búsqueda) estrechamiento.

tommcdo
fuente