以下是为方便起见的脚本:
" Uncomment the following to have Vim jump to the last position when
" reopening a file
if has("autocmd")
au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$")
\| exe "normal! g'\"" | endif
endif
该功能非常出色,但在某些情况下使用Vim作为编辑器时不会使用:例如,我经常写一个两行git提交消息,所以下次我提交它时会让我放在第二行,我必须为此调整。
同样,许多其他系统允许您将Vim指定为编辑器,作为涉及编辑文件的某个过程的一部分。
我们如何检测这个并修改我们的最后位置跳转脚本? Git实际上有点特殊,因为它使用.git/COMMIT_EDITMSG
文件在提交时保持不变,这就是为什么会发生这种情况。对于临时文件,它不会出现在Vim以前从未见过的文件上。
这可能会使任务变得微不足道(通过检查当前文件= COMMIT_EDITMSG
增加脚本...)
但是,一个非常完美的答案是,如果我们可以检测是否从命令行调用了Vim,或者是否由脚本打开了它。有办法告诉吗?我知道unix程序可以确定它们是否在一个术语/伪节点中运行,尽管它们最终都会从终端接收输入。
答案 0 :(得分:2)
Git提交消息的文件类型为gitcommit
。
只需添加一项检查,看看该文件是否不是gitcommit
文件类型,以决定何时跳转到最后一个位置。
if has("autocmd")
au BufReadPost * if line("'\"") > 0 && line("'\"") <= line("$") && &filetype != "gitcommit"
\| exe "normal! g'\"" | endif
endif
答案 1 :(得分:2)
如果您不想修改具有各种异常的全局规则(如在FDinoff的答案中),您也可以通过将以下内容放入~/.vim/after/ftplugin/gitcommit.vim
来撤消跳转:
:autocmd BufWinEnter <buffer> normal! gg0
虽然我没有遇到上述命令的任何问题,即使在缓冲区开关上,更强大的版本也会使autocmd 触发一次:
augroup DisableLastPositionJump
autocmd! BufWinEnter <buffer> execute 'normal! gg0' | autocmd! DisableLastPositionJump BufWinEnter <buffer>
augroup END
答案 2 :(得分:0)
如果您不希望VIM记住您之前提交的位置,请在~/.vimrc
中设置以下内容:
autocmd FileType gitcommit call setpos('.', [0, 1, 1, 0])
来源:http://vim.wikia.com/wiki/Always_start_on_first_line_of_git_commit_message