如何使 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