Выполнить действие после вызова команды <Plug>
Я использую следующее сопоставление для отправки кода в REPL с помощью vim-slime и tmux:
nmap <buffer> <S-CR> <Plug>SlimeLineSend
Как я могу выполнить действие после вызова этого сопоставления ?. Например, я хотел бы переместиться на одну строку вниз ( j
) после <Plug>SlimeLineSend
выполнения. Это не работает:
nmap <buffer> <S-CR> <Plug>SlimeLineSend j
Ответы
У меня это почти работает:
nmap <buffer> <S-CR> <Plug>SlimeLineSendj
Причина, по которой это на самом деле не работает, заключается в том, что мой терминал Vim фактически не распознает <S-CR>
последовательность как отличную от простой <CR>
, поэтому всякий раз, когда я <S-CR>
нажимаю Vim, просто переходит к следующей строке и на самом деле не запускает сопоставление ... Если я сделайте то же самое, используя другой триггер, он отлично работает:
nmap <buffer> <LocalLeader>s <Plug>SlimeLineSendj
При развертывании сопоставления Vim будет искать самую длинную последовательность символов, соответствующую отображению. В данном случае это будет <Plug>SlimeLineSend
, что запустит действие. Объект j
все еще находится в буфере, поэтому Vim будет использовать эту команду как движение для перехода на одну строку вниз.
(Многие подключаемые модули создают свои <Plug>
сопоставления с набором скобок вокруг части «команды», чтобы было ясно, где она заканчивается. Кроме того, это позволяет им создавать команды, которые являются префиксами других команд. Например, emmet.vim имеет <Plug>(emmet-toggle-comment)
, Command-T и <Plug>(CommandT)
т. Д.)
Я придумал решение, основанное на этом ответе: https://stackoverflow.com/a/18547013/1706778
nmap <buffer> <S-CR> :execute "normal \<Plug>SlimeLineSend"<CR>j