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(抽出一个引号)时,我不想移动到报价是在。在猛拉之后回到上一个光标位置似乎是一件容易的事?我尝试了以下操作:
- 尝试使用 TextYankPost 设置光标位置。
- 尝试在实际映射中设置标记,可能不允许,因为它正在等待运动。
- 尝试使用 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 毫秒以恢复光标位置。我找不到更多的答案,所以我就这么做了。
更新:我找到了临时解决方案或永久解决方案....
function! QuoteCallBack(timer) abort
call winrestview(g:savePos4QuoteTextObj)
call timer_stop(a:timer)
endfunction
我有一个运算符函数可以抽出双引号或单引号,ciq 工作正常,因为我想在引号内但是当我做 yaq(抽出一个引号)时,我不想移动到报价是在。在猛拉之后回到上一个光标位置似乎是一件容易的事?我尝试了以下操作:
- 尝试使用 TextYankPost 设置光标位置。
- 尝试在实际映射中设置标记,可能不允许,因为它正在等待运动。
- 尝试使用 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 毫秒以恢复光标位置。我找不到更多的答案,所以我就这么做了。