Realizar una acción después de invocar un comando <Plug>
Utilizo el siguiente mapeo para enviar código a un REPL usando vim-slime y tmux:
nmap <buffer> <S-CR> <Plug>SlimeLineSend
¿Cómo puedo realizar una acción después de invocar esta asignación? Por ejemplo, me gustaría bajar una línea ( j
) después de que <Plug>SlimeLineSend
se ejecute. Esto no funciona:
nmap <buffer> <S-CR> <Plug>SlimeLineSend j
Respuestas
Esto casi funciona para mí:
nmap <buffer> <S-CR> <Plug>SlimeLineSendj
La razón por la que en realidad no funciona es que mi terminal Vim en realidad no reconoce la <S-CR>
secuencia como diferente de una simple <CR>
, así que cada vez que <S-CR>
presiono Vim simplemente pasa a la siguiente línea y realmente no activa el mapeo ... haz lo mismo con un disparador diferente, funciona bien:
nmap <buffer> <LocalLeader>s <Plug>SlimeLineSendj
Siempre que expanda un mapeo, Vim buscará la secuencia más larga de caracteres que coincida con un mapeo. En este caso, esto será <Plug>SlimeLineSend
lo que desencadenará la acción. El j
todavía está en el búfer, por lo que Vim usará este comando como un movimiento para bajar una línea.
(Muchos complementos crean sus <Plug>
asignaciones con un conjunto de paréntesis alrededor de la parte "comando", de modo que quede claro dónde termina. Además, eso les permite crear comandos que son prefijos de otros comandos. Por ejemplo, emmet.vim tiene <Plug>(emmet-toggle-comment)
, Command-T tiene <Plug>(CommandT)
, etc.)
Se me ocurrió una solución basada en esta respuesta: https://stackoverflow.com/a/18547013/1706778
nmap <buffer> <S-CR> :execute "normal \<Plug>SlimeLineSend"<CR>j