Vim Script: возможно ли сделать собственное движение неповторяемым?

391
Steve Vermeulen

Я пытаюсь написать пользовательскую функцию янки, но не могу понять, как сделать ее неповторяемой (как обычная янка). У меня есть что-то похожее на следующее:

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но вместо этого он пытается снова выполнить восстановление.

Можно ли это исправить?

2
То, что вы делаете, больше не является обычным рывком: теперь это команда нормального режима и, следовательно, повторяется с `.`. romainl 10 лет назад 0
Да, по умолчанию это имеет смысл, но в этом случае я не хочу такого поведения. Steve Vermeulen 10 лет назад 0

1 ответ на вопрос

2
Ingo Karkat

Vim will repeat the g@ command. Unfortunately, there's no way around this, and as you also cannot access the internal command history, it's impossible to restore the previously issued command. (You could hack something together for custom mappings that rely on repeat.vim, but it won't work for built-in commands.)

The only workaround I can think of is to change the mapping to use the normal y command, and trigger whatever is part of your "custom yank" afterwards, e.g. via :autocmd on CursorMoved,CursorHold.