Eseguire l'azione dopo aver richiamato un comando <Plug>

Aug 20 2020

Uso la seguente mappatura per inviare il codice a un REPL usando vim-slime e tmux:

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

Come posso eseguire un'azione dopo aver invocato questa mappatura ?. Ad esempio, vorrei spostarmi in basso di una riga ( j) dopo che <Plug>SlimeLineSendè stato eseguito. Questo non funziona:

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

Risposte

3 filbranden Aug 20 2020 at 06:14

Questo funziona quasi per me:

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

Il motivo per cui in realtà non funziona è che il mio terminale Vim in realtà non riconosce la <S-CR>sequenza come diversa da una semplice <CR>, quindi ogni volta che premo <S-CR>Vim si sposta semplicemente alla riga successiva e non attiva realmente la mappatura ... fai lo stesso usando un trigger diverso, funziona bene:

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

Ogni volta che si espande una mappatura, Vim cercherà la sequenza di caratteri più lunga che corrisponde a una mappatura. In questo caso, sarà questo <Plug>SlimeLineSendche attiverà l'azione. Il jè ancora nel buffer, quindi Vim userà questo comando come un movimento a scendere di una riga.

(Molti plug-in creano le loro <Plug>mappature con una serie di parentesi intorno alla parte "comando", in modo che sia chiaro dove finisce. Inoltre, ciò consente loro di creare comandi che sono prefissi di altri comandi. Ad esempio, emmet.vim ha <Plug>(emmet-toggle-comment), Comando-T ha <Plug>(CommandT), ecc.)

mroavi Aug 20 2020 at 06:14

Ho trovato una soluzione basata su questa risposta: https://stackoverflow.com/a/18547013/1706778

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