2010-08-20 42 views
3

我有這些Git的Vim映射。下面的大多數命令都可以工作,但最後一個,gm,根本不起作用。我想打開一個新的Vim(最好用我的git commit消息模板已經加載,按照默認的終端行爲),編輯並保存我的消息,然後提交。在新的Vim窗口中寫入Git commit消息,然後在Vim中提交所有內容

任何想法的另一種方法來解決這個問題?

" 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> 

回答

4

Vim有它封裝了常見Git命令一些Git的包裝腳本,並允許通過臨時緩衝區承諾:

一個可以適應該法案將fugitive.vim:看its doc

: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腳本需要的部分。

+0

這並不是我正在尋找的東西(還有一個插件可以保留和學習和使用> _ <),但它可能比我想象的要好。謝謝! – 2010-08-20 16:53:24

+0

我回頭看看你的回答,注意你的示例代碼實際上是用於MinSCM而不是fugitive.vim。不過,感謝fugitive.vim。 :) – 2010-08-20 19:30:29

1

究竟是編輯文件然後告訴git使用它作爲提交消息的要點?爲什麼你不能只使用正常的操作模式 - 運行git commit,讓它產卵vim,編寫消息,保存並退出提交?或者如果你需要一個模板,git commit -e -F <template file>

+0

感謝您的回覆,但我認爲您誤解了我。我需要一個用於提交消息的新Vim,即我正在編輯一個文件,然後點擊'ga'添加它並使用'gm'提交更改,這會生成一個新的Vim來編輯提交消息。理想情況下,在提交消息的':wq'上執行'git commit'。所以我從來沒有真正從我正在編輯的文件中拿走,並且可以在不離開編輯器的情況下完成我所有的Git操作。 – 2010-08-20 03:39:14

+0

因此,在新終端的背景中產生'git commit',或者將您的編輯器設置爲gvim,這樣您就不需要終端。您的原始vim將返回,新的vim將成爲您編輯提交消息的那個vim。提交將在編輯器的'git commit'產生的消息的':wq'上執行 - 這是默認模式'git commit'的操作。 – Cascabel 2010-08-20 12:33:29

+0

我正在討論在Vim中發佈一個命令,在不離開編輯器的情況下做一個Git提交。這不符合你的描述。我的編輯器是Vim。終端的默認行爲以提交模板打開Vim。但是,在Vim中,我只是得到一個壞的管道,因爲沒有消息而失敗。回到終端確實有效 - 這正是我現在所做的 - 但這個問題的關鍵是我想停止這樣做。這是**一件事**,迫使我在編輯時離開Vim。 – 2010-08-20 16:49:44