由于某种原因,vim不能保存当前缓冲区的光标位置。例如,如果我有3个缓冲区(选项卡)打开
foo | bar* | foobar
和“ bar”被选中,在退出vim时将光标位置保存到"
标记的“ foo”和“ foobar”而不是“ bar”。无论是否存在其他缓冲区,它始终是退出前当前选择的缓冲区。这是一个~/.local/share/shada/main.shada
文件在关闭vim会话后的样子的示例:
Local mark with timestamp 2019-07-27T21:29:30:
% Key Description Value
+ f file name "/home/damage/tmp/foo"
+ n name '"'
+ l line number 10
+ c column 0
Local mark with timestamp 2019-07-27T21:29:30:
% Key Description Value
+ f file name "/home/damage/tmp/bar"
+ n name '"'
+ l line number 1
+ c column 0
Local mark with timestamp 2019-07-27T21:29:30:
% Key Description Value
+ f file name "/home/damage/tmp/foobar"
+ n name '"'
+ l line number 20
+ c column 0
当前缓冲区的标记"
始终为1。当我用命令"
强制vim将光标位置明确保存到m"
标记时,此信息在退出时丢失。不知道从哪里开始。
shada=!,'10,/100,:100,<0,@1,f1,h,s1,%10
答案 0 :(得分:1)
问题是由我使用的会话管理器引起的。更具体地说,这行。
autocmd VimLeavePre * execute s:isActiveSession() && s:saveSession()
我用VimLeave
替换了此事件,该事件在写入shada
文件之后被调用。
autocmd VimLeave * execute s:isActiveSession() && s:saveSession()
UPD :为了追求更小的代码库,我忘记了使用:n
命令来移动光标。无论表达式将被计算为什么结果,光标都将放置在第一行(:0
的作用与:1
相同)。因此,我应该编写另一个函数或将其替换为以下内容。
autocmd VimLeave * if s:isActiveSession() | call s:saveSession() | endif