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

时间:2010-03-06 18:40:18

标签: vim

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

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

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

那么是否有可能修改上述脚本以排除COMMIT_EDITMSG文件?

6 个答案:

答案 0 :(得分:8)

在阅读了关于自动命令的手册后,我注意到似乎无法定义它们匹配的模式,以便它们排除特殊模式。而且我也无法使用包含当前文件名的变量,所以我只是展开现有的if来排除文件。

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

autocmd BufReadPost COMMIT_EDITMSG
  \ exe "normal! gg"

在上一个autocmd BufReadPost之后放置这个只是链接事件执行,所以vim,在执行第一个并恢复位置后,读取它并在排除文件名上匹配并使用gg将光标移动到顶部,基本上覆盖了原始autocmd的效果。

这样就可以了。)

答案 1 :(得分:3)

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

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

答案 2 :(得分:1)

你应该调查mksession。当您在命令行上指定文件时(例如当git调用vim时),您可以将VimEnter / VimLeave自动命令设置为“做正确的事”。这里有很多脚本,例如http://vim.wikia.com/wiki/Working_with_multiple_sessions

答案 3 :(得分:0)

试试这个,将光标移动到最后位置

  

设置隐藏

答案 4 :(得分:0)

.vimrc

中添加以下行而不是您的行
au BufWinLeave * mkview
au BufWinEnter * silent loadview

答案 5 :(得分:0)

在.vimrc中添加以下内容对我有用:

au FileType gitcommit au! BufEnter COMMIT_EDITMSG call setpos('.', [0, 1, 1, 0])

(来自https://vim.fandom.com/wiki/Always_start_on_first_line_of_git_commit_message

相关问题