2

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

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 ответ1

2

Vim повторит команду g@ . К сожалению, нет никакого способа обойти это, и поскольку вы также не можете получить доступ к внутренней истории команд, невозможно восстановить ранее введенную команду. (Вы можете взломать что-нибудь вместе для пользовательских отображений, которые полагаются на repeat.vim, но это не будет работать для встроенных команд.)

Единственный обходной путь, о котором я могу подумать, - это изменить отображение, чтобы использовать обычную команду y , и впоследствии запускать то, что является частью вашего "пользовательского возврата", например, с помощью :autocmd on CursorMoved,CursorHold .

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .