代码之家  ›  专栏  ›  技术社区  ›  poke

VIM恢复光标位置;排除特殊文件

vim
  •  9
  • poke  · 技术社区  · 15 年前

    以下代码在我的 .vimrc 通常恢复用vim打开的文件的最后一个光标位置:

    autocmd BufReadPost *
      \ if line("'\"") > 1 && line("'\"") <= line("$") |
      \   exe "normal! g`\"" |
      \ endif
    

    我真的很喜欢这个功能,想把它打开, 除了一个文件 :使用git提交时,vim会被激发,我可以用它编辑提交消息。但是,提交消息文件在vim启动之前就存在(并且是预先填充的),因此vim将其视为一个现有文件,并恢复最后一个光标位置(通常不是我要开始键入的位置)。

    因此,是否有可能修改上述脚本以排除 COMMIT_EDITMSG 文件?

    5 回复  |  直到 12 年前
        1
  •  8
  •   poke    15 年前

    在阅读了有关自动命令的手册之后,我注意到,似乎不可能以排除特殊模式的方式定义它们匹配的模式。我也不能使用包含当前文件名的变量,所以我只需扩展现有的if来排除文件。

    但是,根据Pavel Shved的评论(关于 gg 移动到文件的顶部)我认为以同样的方式,应该可以简单地 覆盖 位置恢复的效果,只需将其移动到顶部 后来 再一次。所以我想到了这个:

    autocmd BufReadPost COMMIT_EDITMSG
      \ exe "normal! gg"
    

    把这个放在前一个后面 autocmd BufReadPost 只需链接事件执行,所以vim在执行第一个并恢复位置后,读取并在 排除的文件名 并使用 GG 要将光标移到顶部,基本上覆盖了原始autoCmd的效果。

    那就行了:)

        2
  •  3
  •   Robert Wahler    14 年前

    我知道你已经想出了一个解决方案,但我也有同样的问题,并提出了一个不需要链接的替代方案。

    function! PositionCursorFromViminfo()
      if !(bufname("%") =~ '\(COMMIT_EDITMSG\)') && line("'\"") > 1 && line("'\"") <= line("$")
        exe "normal! g`\""
      endif
    endfunction
    :au BufReadPost * call PositionCursorFromViminfo()
    
        3
  •  1
  •   ergosys    15 年前

    您可能应该调查mksession。当您在命令行上指定了文件时(就像git调用vim一样),可以设置vimenter/vimleave auto命令来“做正确的事情”。有许多脚本可供使用,请参见 http://vim.wikia.com/wiki/Working_with_multiple_sessions 例如。

        4
  •  0
  •   IvanM    12 年前

    试试这个,它把光标移到最后一个位置

    设置隐藏

        5
  •  0
  •   Jens    12 年前

    将下列行而不是您的行放入 .vimrc :

    au BufWinLeave * mkview
    au BufWinEnter * silent loadview