保留VIM中的最后编辑位置

Dmi*_*oda 27 vim

当我退出VIM并再次打开同一个文件时,我位于文件的开头.如何保留最后一个光标位置?

Met*_*aEd 21

"开箱即用" .vimrc通过以下声明实现:

source $VIMRUNTIME/vimrc_example.vim
Run Code Online (Sandbox Code Playgroud)

您可能只需要在您的帐户中恢复此声明.vimrc.在任何情况下,请参阅vimrc_example.vim并查看Vim手册中line()功能,以了解其工作原理.

  • 这也做了很多其他事情:https://github.com/vim/vim/blob/master/runtime/vimrc_example.vim (3认同)

小智 18

摘自http://amix.dk/vim/vimrc.html

" Return to last edit position when opening files (You want this!)
autocmd BufReadPost *
     \ if line("'\"") > 0 && line("'\"") <= line("$") |
     \   exe "normal! g`\"" |
     \ endif
Run Code Online (Sandbox Code Playgroud)

  • 我不知道为什么 `zv` 部分......结果它“展开”当前行。哇,即使您知道如何退出 Vim,也总是有更多东西需要学习。 (4认同)
  • 啊,如果文件在vim之外被截断,并且vim的标记在不再存在的行上,则vim会抛出错误.修复了`autocmd BufReadPost*无声!正常!克\`"zv` (3认同)
  • 你能解释一下“if”语句在这里的作用吗?我将其读为“仅在光标位于第一行之后或最后一行之前时恢复光标”,我不清楚这有什么区别。我目前添加了 `autocmd BufReadPost * 正常!g\`"zv` 到我的 vimrc 中,它似乎有效,但我想我不明白无条件标记恢复的潜在陷阱。 (2认同)

Kaz*_*sho 16

对于正在寻找纯 Lua 版本的 Neovim 用户:

-- Restore cursor position
vim.api.nvim_create_autocmd({ "BufReadPost" }, {
    pattern = { "*" },
    callback = function()
        vim.api.nvim_exec('silent! normal! g`"zv', false)
    end,
})
Run Code Online (Sandbox Code Playgroud)


thi*_*wfx 13

当前接受的答案的更新版本:

silent! source $VIMRUNTIME/defaults.vim
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案 (2认同)

Dev*_*lar 9

最后一个编辑位置由Vim自动保存,可用作"特殊"跳转标记..其他特殊标志包括"(位置所储存)和'(位置,你跳了).

您可以通过键入来跳转到标记'<mark>,这样'.您将转到上次编辑的位置,''将您带回到原来'"的位置,并将您带到保存文件的位置.

Vim.Wikia的 Vim标志更多.

  • @Rainning:根据链接的 Wikia 页面,这将是 &lt;backtick&gt;-&lt;mark&gt;。 (2认同)

And*_*ley 6

确保~/.viminfo运行 vim 的用户可读和可写。不知何故,我在我的标准用户主目录中得到了一个只能由 root 读取的副本,这意味着无法存储最后一个光标位置。


gsk*_*llz 6

我正在向 @Mariano 回答/sf/answers/1011463911/添加更完整的示例,并进行一些额外的检查

" Only do this part when compiled with support for autocommands
if has("autocmd")
  augroup redhat
  autocmd!
  " When editing a file, always jump to the last cursor position
  autocmd BufReadPost *
  \ if line("'\"") > 0 && line ("'\"") <= line("$") |
  \   exe "normal! g'\"" |
  \ endif
  augroup END
endif
Run Code Online (Sandbox Code Playgroud)


Gre*_*che 5

有一个名为vim-lastplace的插件(我是作者)将智能地返回到您所做的最后一次编辑.

它还有一个配置选项来忽略某些文件类型.默认情况下,它将忽略git,svn和mercurial的提交消息.对于这些文件类型,它将在第一行开始光标.上面的代码片段将跳转到您的提交消息文件的中间(您在之前的提交中停止了),即使这可能不是您想要的.vim-lastplace解决了这个问题.