Vim脚本:在函数调用中保留光标位置和屏幕视图

JSB*_*ոգչ 22 vim

我有一些Vim函数可以更改文档格式.当我调用此函数时,我目前使用类似以下内容来保存和恢复我的光标位置:

func! Foo()
  :norm mz
  ...
  :norm `z
endf
Run Code Online (Sandbox Code Playgroud)

这样可以正确地保存光标位置,但有时会改变窗口位置,以便当前行从靠近屏幕顶部移动到靠近底部,反之亦然.有没有办法保留光标位置和线的屏幕位置?

das*_*ang 27

let l:winview = winsaveview()
" do stuff
call winrestview(l:winview)
Run Code Online (Sandbox Code Playgroud)

这应该完全按照你想要它做的,可能除了光标上方的行数改变(我怀疑光标上方的删除行会产生向下移动光标的效果).


hcs*_*s42 6

您可以为窗口中显示的第一个屏幕行保存标记,并将其还原.g?在整个缓冲区上执行命令并恢复两个位置的示例:

:noremap <F11> mkHmlggg?G`lzt`k
Run Code Online (Sandbox Code Playgroud)

走过命令:

  • mk:k为当前位置设置标记
  • H:转到屏幕上的第一行
  • ml:l为此位置设置标记
  • ggg?G:执行命令
  • ``l : jump to markl`
  • zt:将此行设置为第一个屏幕行
  • ``k : jump to markk`


Max*_*Kim 6

只是:h getpos()

let save_cursor = getpos(".")
" MoveTheCursorAround
call setpos('.', save_cursor)
Run Code Online (Sandbox Code Playgroud)