我正在定义一个Vim函数:
function! HelloWorld() range
echo "hello world"
endfunction
我用vim -u NONE filename.txt
打开一个有很多行的文本文件,用G
跳转到最后一行,用:%call HelloWorld()
调用HelloWorld()
。我注意到光标跳转到第一行。如何防止这种情况,即保持光标在当前行?非常感谢!
注:上面提到的函数只是一个最小的例子。我知道如果我删除range
并调用:call HelloWorld()
,问题就会消失,但在我的实际问题中需要它。
function! HelloWorld() range
let l:win_view = winsaveview()
echo "hello world"
call winrestview(l:win_view)
endfunction
行不通。
谢谢@Matt。我最终想出了以下解决方案。保持函数HelloWorld
不变,然后定义一个环绕函数调用的命令。这个想法是从vim-autoformat偷来的。
command! -range -bar HelloWorld
let s:winview=winsaveview() |
<line1>,<line2>call HelloWorld() |
call winrestview(s:winview)
现在调用:%HelloWorld
将回显文本,而不会移动光标。
不妨这样试试:
function! HelloWorld() range
" get current cursor position
let l = line('.')
let c = col('.')
echo "hello world"
" restore original cursor position
call cursor(l,c)
endfunction