防止Vim在调用% range函数时跳到开头

eanckbw9  于 2022-11-11  发布在  其他
关注(0)|答案(2)|浏览(138)

我定义了一个Vim函数:

function! HelloWorld() range
  echo "hello world"
endfunction

我用vim -u NONE filename.txt打开一个多行的文本文件,用G跳转到最后一行,用:%call HelloWorld()调用HelloWorld(),我注意到光标跳到第一行。如何防止这种情况,即保持光标在当前行?非常感谢!
P.S.上面提到的函数只是一个最小的例子。我知道如果我删除range并调用:call HelloWorld(),问题就会消失,但在我的实际问题中需要它。
编辑:

function! HelloWorld() range
  let l:win_view = winsaveview()
  echo "hello world"
  call winrestview(l:win_view)
endfunction

行不通的。

des4xlb0

des4xlb01#

感谢@Matt。我最终想出了以下解决方案。保持函数HelloWorld不变,然后定义一个命令来 Package 函数调用。这个想法是从vim-autoformat那里剽窃来的。

command! -range -bar HelloWorld 
            \ let winview=winsaveview() |
            \ <line1>,<line2>call HelloWorld() |
            \ call winrestview(winview)

现在,调用:%HelloWorld将回显文本,并且不会移动光标。
我唯一关心的是变量winview的全局作用域,但到目前为止我还没有看到任何令人不快的副作用。

hc8w905p

hc8w905p2#

也许可以试试这个办法:

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

相关问题