如何实现Vim autoread且不改变光标位置?
解决Vim autoread重载时光标位置跳转的问题
这个问题我之前折腾过好一阵子,autoread自动同步外部修改确实好用,但重载时光标乱跑真的很影响效率。咱们可以通过在文件重载前后保存并恢复窗口视图状态来解决这个问题,具体修改你的配置如下:
set autoread au CursorHold,FocusGained,BufEnter * let save_view = winsaveview() | checktime | call winrestview(save_view)
原理说明:
winsaveview():这个Vim内置函数会保存当前窗口的完整视图状态,包括光标所在的行/列、滚动位置、折叠状态等所有和窗口显示相关的信息。checktime:就是你原来用来触发文件检查和重载的命令。winrestview(save_view):把之前保存的视图状态恢复回去,这样不管文件怎么被外部修改,重载后都会回到你之前的光标位置和窗口状态。
额外优化建议:
- 如果担心频繁触发(比如
CursorHold可能会经常触发),可以加个判断,只有文件确实被修改了才执行恢复:
这里set autoread au CursorHold,FocusGained,BufEnter * let save_view = winsaveview() | if checktime() | call winrestview(save_view) | endifchecktime()会返回1表示文件被修改重载,0表示没有变化,这样只有真正重载时才恢复视图,减少不必要的操作。 - 要是遇到文件被大量修改(比如删除了很多行),原光标位置可能已经不存在了,这时候Vim会自动跳到最近的有效位置,这是合理的行为,毕竟原位置已经没了。
内容的提问来源于stack exchange,提问作者matrixel
相关产品推荐
相关产品推荐

