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,

Другие вопросы по тегам