如何使 vim 恢复当前缓冲区的最后一个光标位置?
How to make vim restore last cursor position for CURRENT buffer?
由于某些原因 vim 没有保存当前缓冲区的光标位置。例如,如果我打开了 3 个缓冲区(选项卡)
foo | bar* | foobar
选择了 和 "bar",退出时 vim 将光标位置保存到 "
标记 "foo" 和 "foobar" 但不是 "bar" .退出前总是当前选择的缓冲区,不管是否有其他缓冲区。这是我关闭 vim 会话后 ~/.local/share/shada/main.shada
文件的外观示例:
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。当我使用命令 m"
强制 vim 将光标位置显式保存到 "
标记时,此信息丢失在退出。不知道从哪里开始。
shada=!,'10,/100,:100,<0,@1,f1,h,s1,%10
问题是由我使用的会话管理器引起的。更具体地说,这一行。
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
由于某些原因 vim 没有保存当前缓冲区的光标位置。例如,如果我打开了 3 个缓冲区(选项卡)
foo | bar* | foobar
选择了 和 "bar",退出时 vim 将光标位置保存到 "
标记 "foo" 和 "foobar" 但不是 "bar" .退出前总是当前选择的缓冲区,不管是否有其他缓冲区。这是我关闭 vim 会话后 ~/.local/share/shada/main.shada
文件的外观示例:
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。当我使用命令 m"
强制 vim 将光标位置显式保存到 "
标记时,此信息丢失在退出。不知道从哪里开始。
shada=!,'10,/100,:100,<0,@1,f1,h,s1,%10
问题是由我使用的会话管理器引起的。更具体地说,这一行。
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