Execute a ação após invocar um comando <Plug>

Aug 20 2020

Eu uso o seguinte mapeamento para enviar código a um REPL usando vim-slime e tmux:

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

Como posso executar uma ação após invocar esse mapeamento ?. Por exemplo, eu gostaria de descer uma linha ( j) depois que o <Plug>SlimeLineSendfor executado. Isso não funciona:

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

Respostas

3 filbranden Aug 20 2020 at 06:14

Isso quase funciona para mim:

nmap <buffer> <S-CR> <Plug>SlimeLineSendj

O motivo pelo qual isso realmente não funciona é que meu terminal Vim na verdade não reconhece a <S-CR>sequência como diferente de um simples <CR>, então sempre que pressiono <S-CR>Vim, apenas move para a próxima linha e realmente não aciona o mapeamento ... Se eu faça o mesmo usando um gatilho diferente, funciona bem:

nmap <buffer> <LocalLeader>s <Plug>SlimeLineSendj

Sempre que expandir um mapeamento, o Vim procurará a sequência de caracteres mais longa que corresponde a um mapeamento. Neste caso, será <Plug>SlimeLineSend, o que irá desencadear a ação. O jainda está no buffer, então o Vim usará este comando como um movimento para descer uma linha.

(Muitos plug-ins criam seus <Plug>mapeamentos com um conjunto de parênteses ao redor da parte "comando", para que fique claro onde ele termina. Além disso, isso permite que eles criem comandos que são prefixos de outros comandos. Por exemplo, emmet.vim tem <Plug>(emmet-toggle-comment), Command-T tem <Plug>(CommandT), etc.)

mroavi Aug 20 2020 at 06:14

Eu encontrei uma solução com base nesta resposta: https://stackoverflow.com/a/18547013/1706778

nmap <buffer> <S-CR> :execute "normal \<Plug>SlimeLineSend"<CR>j