在编辑git提交信息时自动进入插入模式

16

如果我执行git commit,当Vim打开时,我希望立即进入插入模式。

我注意到编辑时filetype设置为gitcommit,所以我想可以通过autocommand来实现这个目标。

au BufRead gitcommit startinsert!

这个方法不起作用,我做错了什么?

解决方案

我选择使用au FileType gitcommit execute "normal! O" | startinsert来在当前行之前添加新行,然后进入插入模式以准备输入信息。


2
你提出的解决方案对于已经包含 --amend 或 merges 等文本的消息来说并不是很好。你知道如何改变这些情况的行为吗? - Grzegorz Adam Hankiewicz
不,我也发现了同样的问题,想知道有没有更好的解决方法。 - jordelver
3个回答

13
另一种方法:
export GIT_EDITOR='vim +startinsert'

或在结尾处添加以从消息末尾开始(在使用 Git 钩子进行消息完成时非常有用)。
export GIT_EDITOR='vim +startinsert!'

谢谢,是的,我在发布问题之前考虑过这一点,但我认为我想要自动化更多,但出于清晰起见,我将其省略了。你也可以使用 vim +start - jordelver

12

:au Event pattern command中,该模式通常是与缓冲区名称匹配的。如果不想使用BufRead gitcommit,可以使用BufRead COMMIT_EDITMSG。如果你想要匹配文件类型选项,则使用FileType事件。

我倾向于编写多行提交信息,并且我有一个来自vimrc_example.vim的自动命令,它执行以下操作

exe "normal! g`\""

每当我进入一个新的缓冲区时,那怎么样?

au FileType gitcommit 1 | startinsert

进入插入模式前如何跳转到第一行?现在我已经测试过了,我想保留它。:)


谢谢。有没有一种方法可以调试autocommands?我使用:set ft?来查找当前缓冲区的文件类型,我还有其他的autocommands,例如au BufReadPost quickfix setlocal nospell,它们使用了相同的东西。我已经采取了au FileType gitcommit execute "normal! O" | startinsert的方式,在上面添加新行并进入插入模式。谢谢 :) - jordelver
首先,:execute "normal! 0" 不会添加新行,它只是将光标移动到行首。我的 :1 命令可以移动到第一行。你可以使用 :verbose au BufReadPost quickfix 命令查看为该事件和模式定义的自动命令以及定义它们的文件。同样地,:verbose set ft? 命令也可以使用。 - benjifisher
如果那是一个零的话就可以了,但它不是,它是一个大写字母O(O);) 感谢您提供“:verbose”的提示,我会研究一下的。 - jordelver

2

这可能比实际需要的更加复杂,但您可以使用单独的文件类型插件来完成此操作:

$ mkdir -p ~/.vim/ftplugin/gitcommit
$ echo 'startinsert!' > !$/git-commit-insert.vim

谢谢,我会记住这个建议,但是我已经有了一些自动命令,我想以类似的方式完成这个。 - jordelver

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