Realizar una acción después de invocar un comando <Plug>

Aug 20 2020

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>SlimeLineSendse ejecute. Esto no funciona:

nmap <buffer> <S-CR> <Plug>SlimeLineSend j

Respuestas

3 filbranden Aug 20 2020 at 06:14

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>SlimeLineSendlo que desencadenará la acción. El jtodaví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.)

mroavi Aug 20 2020 at 06:14

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