Vim 脚本:是否可以使自定义动作不可重复?

Vim 脚本:是否可以使自定义动作不可重复?

我正在尝试编写一个自定义 yank 函数,但无法弄清楚如何使其不可重复(就像正常的 yank 一样)。我有类似以下内容的内容:

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

Vim 将重复该g@命令。不幸的是,没有办法解决这个问题,而且由于您也无法访问内部命令历史记录,因此无法恢复之前发出的命令。(您可以为依赖于 repeat.vim 的自定义映射做一些调整,但它不适用于内置命令。)

我能想到的唯一解决方法是更改​​映射以使用正常y命令,然后触发“自定义 yank”的任何部分,例如通过:autocmdon CursorMoved,CursorHold

相关内容