我正在尝试编写一个自定义 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”的任何部分,例如通过:autocmd
on CursorMoved,CursorHold
。