在新的Vim窗口中编写Git提交消息,然后在Vim中提交所有更改。

3

我有一些针对Git的Vim映射。下面的大部分命令都可以工作,但是最后一个gm根本不起作用。我想打开一个新的Vim(最好已经加载了我的git提交消息模板,就像默认终端行为一样),编辑和保存我的消息,然后进行提交。

还有其他方法来解决这个问题吗?

" git shortcuts
"" show diff in new window
if has("gui_running")
  noremap gd :!git diff <BAR> gvim -<CR><CR>
else
  noremap gd :!git diff <BAR> vim -<CR><CR>
endif
noremap gs :!git status<CR>
noremap ga :!git add %<CR>
"" edit commit message in new window
if has("gui_running")
  noremap gm :!gvim __vim_gitcommitmessage && git commit -F __vim_gitcommitmessage && rm __vim_gitcommitmessage<CR>
else
  noremap gm :!vim __vim_gitcommitmessage && git commit -F __vim_gitcommitmessage && rm __vim_gitcommitmessage<CR>
endif

更新:

根据VonC的建议,我现在正在使用fugitive.vim。我替换了以前的Vim绑定,并且强烈推荐这个插件给任何使用Vim和Git的人。

" fugitive shortcuts
noremap ggs :Gstatus<cr>
noremap ggc :Gcommit<cr>
noremap gga :Gwrite<cr>
noremap ggl :Glog<cr>
noremap ggd :Gdiff<cr>
2个回答

4

Vim有一些Git包装脚本,封装了常见的Git命令,并允许通过临时缓冲区提交:

其中一个符合要求的可能是fugitive.vim:请参阅其文档

:MinSCMCommitTracked[!]         (Default mapping: \s<C-c>)

打开临时缓冲区,让您输入提交信息。编写提交缓冲区,所有已跟踪的文件都将被提交。

            Used SCM commands ~
            hg  : commit
            git : commit -a
            bzr : commit

:MinSCMCommitAll[!]             (Default mapping: \sc)

打开临时缓冲区,供您输入提交消息。写入提交缓冲区后,当前存储库的所有文件都将被提交。

此命令与|:MinSCMCommitTracked|不同,它会将未跟踪的文件添加到当前存储库中。

            Used SCM commands ~
            hg  : commit -A
            git : add -a && commit -a
            bzr : add && commit

由于源代码是公开的,因此您可以在自己的Vim脚本中重复使用所需的部分。


这不是我正在寻找的“完全相同的”东西(还需要一个插件,需要学习和使用> _ <),但它可能比我想象中的更好。谢谢! - Justin Force
我回头看了一下你的答案,注意到你的示例代码实际上是针对MinSCM而不是fugitive.vim的。不过,还是谢谢你提供fugitive.vim。 :) - Justin Force

1

编辑文件然后告诉git将其用作提交消息的确切目的是什么?为什么不能使用正常的操作模式-运行git commit,让它生成vim,编写消息,保存并退出以进行提交?或者如果您需要一个模板,可以使用git commit -e -F <template file>


感谢您的回复,但我认为您误解了我的意思。我想要一个用于提交消息的全新Vim。也就是说,我正在编辑一个文件,然后按下ga将其添加,按下gm提交更改,这将生成一个新的Vim来编辑提交消息。理想情况下,在提交消息的:wq之后,将执行git commit。因此,我从未真正离开我正在编辑的文件,可以在不离开编辑器的情况下进行所有的Git操作。 - Justin Force
在新终端中后台生成git commit,或将编辑器设置为gvim,这样您就不需要终端。您的原始vim将返回,并且新的vim将是您编辑提交消息的vim。提交将在编辑器中的消息上:wq执行,该编辑器由git commit生成-这是git commit的默认操作模式。 - Cascabel
我正在谈论在Vim中发出Git提交命令而不离开编辑器的方法。这种方法不像你描述的那样有效。我的EDITOR是Vim。从终端的默认行为是打开一个带有提交模板的Vim。然而,在Vim内部,我只会得到一个破管道错误,并且由于没有消息,提交失败了。回到终端确实可以解决问题——现在这就是我所做的——但这个问题的重点是我想停止这样做。这是唯一一件让我在编辑时离开Vim的事情。 - Justin Force
第一条评论:“为提交消息使用新的vim” 第二条评论:“在不离开编辑器的情况下执行git提交”我有点困惑,但是你接受了VonC的答案,所以...我猜没问题。 - Cascabel
@sidewaysmilk:所以你想生成一个新的窗口,而不是一个新的Vim实例,是吗?那很有道理,也让我的回答变得无用了!我没有注意到问题标题中提到了“窗口”,而你在问题正文和评论中只说了“一个新的Vim”,所以我把它看成了一个完整的Vim实例。对此我感到很抱歉。 - Cascabel
显示剩余2条评论

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