onoremap yank 后如何返回到我以前的位置?

How do I go back to my previous position after onoremap yank?

更新:我找到了临时解决方案或永久解决方案....

function! QuoteCallBack(timer) abort
call winrestview(g:savePos4QuoteTextObj)
call timer_stop(a:timer)
endfunction

我有一个运算符函数可以抽出双引号或单引号,ciq 工作正常,因为我想在引号内但是当我做 yaq(抽出一个引号)时,我不想移动到报价是在。在猛拉之后回到上一个光标位置似乎是一件容易的事?我尝试了以下操作:

  1. 尝试使用 TextYankPost 设置光标位置。
  2. 尝试在实际映射中设置标记,可能不允许,因为它正在等待运动。
  3. 尝试使用 setpos() 从函数恢复光标位置。可能不起作用,因为它在函数内部。

这不起作用可能是因为它在函数内部。

let saveCur=getcurpos()
execute "normal! mz"
call setpos('.',saveCur)
 exe "normal! `z"
if a:operator == 'y' | call setpos('.',saveCur)  | endif

不太确定回调函数是否有效。跳转不起作用,因为 exe "normal 12lv" 不是跳转。这就是功能。我知道当我刚刚完成 exe normal! ?\% 时可能有点矫枉过正,但我​​从中学到了很多 vimscript。欢迎提出任何建议。谢谢

function! QuoteTextObject(whole) abort

let char=a:whole ? 'a' : 'i'
let regex= '\v("|' . "').{-}".'("|' . "')" 
let res=matchstrpos(strcharpart(getline('.'),col('.')-1),regex)
let backRes=matchstrpos(strcharpart(getline('.'),0),regex)
let [start,stop]=copy(res)->remove(1,2)
let [bstart,bstop]=copy(backRes)->remove(1,2)
let offset=stop-start-1
let boffset=bstop-bstart-1

"if nothing was found forward or backward return
if res == ['',-1,-1] && backRes == ['',-1,-1] |call feedkeys("\e")| return 0 | endif

"find match backwards
if res == ['',-1,-1]  
    echom 'no match found forward'
    execute "normal! 0"
    let start=bstart | let offset=boffset
endif

if char == 'a' | execute 'normal! '.start.'lv'.offset.'l' | return 0 |endif
let offset=  eval(offset-2) > 0 ? eval(offset-2).'l':''
let icmd='normal! '.eval(start+1).'lv'. offset
if char == 'i' | execute icmd | return 0 |endif

endfunction

onoremap <silent> <Plug>QuoteOperatorWhole :<C-U> call QuoteTextObject(1)<CR>
onoremap <silent> <Plug>QuoteOperatorInner :<C-U>call QuoteTextObject(0)<CR>
omap iq <Plug>QuoteOperatorInner
omap aq <Plug>QuoteOperatorWhole

处理它的是用 timer_start() 回调,延迟 1 毫秒以恢复光标位置。我找不到更多的答案,所以我就这么做了。