如何使vim恢复当前缓冲区的当前光标位置?

时间:2019-07-27 18:48:18

标签: vim neovim

由于某种原因,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

1 个答案:

答案 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