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

11
以下代码位于我的.vimrc中,通常会恢复我使用vim打开的文件的最后光标位置:
autocmd BufReadPost *
  \ if line("'\"") > 1 && line("'\"") <= line("$") |
  \   exe "normal! g`\"" |
  \ endif

我非常喜欢这个功能,并希望保留它的开启状态,但有一个文件除外:当使用git提交时,会启动vim并让我用它编辑提交信息。然而,在vim启动之前提交信息文件已经存在(并且已经填充好了),因此vim会将其视为已经存在的文件并恢复上次光标位置(通常不是我想要开始输入的位置)。
那么,有没有可能修改上述脚本以排除COMMIT_EDITMSG文件?

2
实际上,在 git 提交后,我打 ggI 的时间更短了。 - P Shved
1
这是一个Vim命令,用于跳转到文件开头并切换到插入模式 :-) - P Shved
啊,我明白了,这是解决这个问题的一个开始 ^^ 我会尝试这样做,直到我能通过脚本解决它 :) - poke
6个回答

11

在阅读了自动命令手册后,我注意到似乎无法以一种方式定义它们匹配的模式,使得它们排除特定的模式。我也无法使用包含当前文件名的某些变量,这样我就可以简单地扩展现有的if语句以排除文件。

但是,基于 Pavel Shved 的评论(关于 gg 移动到文件顶部),我认为同样的方法应该可以通过将其移动到稍后的顶部来简单地覆盖位置恢复的效果。所以我想出了这个:

autocmd BufReadPost COMMIT_EDITMSG
  \ exe "normal! gg"

在之前的autocmd BufReadPost后添加这个命令可以链式执行事件,所以vim在执行第一个命令并还原位置后,会读取这个命令并将其与排除的文件名匹配,并使用gg将光标移动到顶部,基本上覆盖了原始autocmd的效果。

这样做完全有效 :)


3

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

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

不错的改进 - 它看起来比双跳更加简洁! - Dav Clark

1

0

试试这个,它可以将光标移动到最后一个位置

设置隐藏


0

将以下行代替您的行放入.vimrc中:

au BufWinLeave * mkview
au BufWinEnter * silent loadview

我不得不使用silent!来防止vim在第一次打开文件时显示错误。 - Yep_It's_Me

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接