Vim Script: возможно ли сделать собственное движение неповторяемым?
Я пытаюсь написать пользовательскую функцию янки, но не могу понять, как сделать ее неповторяемой (как обычная янка). У меня есть что-то похожее на следующее:
function! s:YankMotion(type)
if a:type ==# 'line'
normal! `[V`]y
elseif a:type ==# 'char'
normal! `[v`]y
else
echom "Unexpected selection type"
return
endif
endfunction
nnoremap y :set opfunc=<sid>YankMotion<cr>g@
Проблема в том, что если вы делаете операцию, которая повторяется (например, cw
) затем дерните что-нибудь, затем выполните повтор, снова нажав .
, вы ожидаете, чтобы вызвать cw
но вместо этого он пытается сделать рывок снова.
Можно ли это исправить?
1 ответ
Вим повторит g@
команда. К сожалению, нет никакого способа обойти это, и поскольку вы также не можете получить доступ к внутренней истории команд, восстановить ранее введенную команду невозможно. (Вы можете взломать что-нибудь вместе для пользовательских отображений, которые полагаются на repeat.vim, но это не будет работать для встроенных команд.)
Единственный обходной путь, который я могу придумать, - это изменить отображение, чтобы использовать обычный y
команда, а затем запустить все, что является частью вашего "пользовательского янки", например, с помощью :autocmd
на CursorMoved,CursorHold
,