私はVimの世界に不慣れで、ファイルを保存するたびにバージョン管理にコミットされるようにしたいと思っています。これは可能ですか?
.vimrcに配置したvim自動コマンドを使用します。このコマンドは、最初にgitディレクトリで作業していることを大まかにチェックし(現在のディレクトリまたはgit rev-parse
を使用して.gitディレクトリの存在をチェックします)、次にgit -a -m %
を使用して以前に追加されたファイルはステージングされ、コミットされます。
autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
Vimの自動コマンドを使用できます:
:autocmd BufWritePost * execute '!git add % && git commit -m %'
これはテストされていませんが、ファイルを追加し、ファイル名をコミットメッセージとしてコミットする必要があります。
ファイルが書き込まれた後にトリガーされるため、BufWritePostが必要です。しかし、厄介な、または安全でないEdgeのケースがたくさんあると思います。
fugitive プラグインを調べてみてください。これは、vim用の非常に強力なgitプラグインです。 autocmd
が示唆するようにdonothingsuccessfully
を設定することもできますが、それをポップアップさせる:Gcommit
または:Gstatus
(変更をチェリーピックしてgitインデックスに追加できます)
他の人が提供した答えに基づいて:
autocmd BufWritePost * execute ':silent ! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m "Auto-commit: saved %"; fi > /dev/null 2>&1'
これは完全に透過的です。 「Enterキーを押して続行してください」というメッセージは表示されません(ただし、コミットが機能しなかった場合は、失敗したことがわかりません)。
あなたは確かにこれをマクロまたはコマンドの再マッピングで行うことができます。
(チェック https://stackoverflow.com/questions/117150/can-i-re-map-commands-in-vim )
しかし、それが良い選択肢かどうかはわかりません。私は今のところgitに堪能ではなく、svnとは異なる場合があることを知っています。しかし、私はsvnでこの自動コミットを行いません。コミットは意味のあるものである必要があり、定期的に保存する必要はありません。
通常、関数を追加したり、バグを修正したりしたためにコミットします...ファイルで作業したためだけではありません。コンパイルされていないプロジェクトや未完成の関数になってしまうことはありません。
私はこの質問が古く、これが露骨な自己宣伝であることを知っていますが、特定のVim autocmd
イベントの後に特定のシェルスクリプトが実行されるようにトリガーするVimプラグインを作成しました。たとえば、.bufwritepost.vimhook.sh
という名前のスクリプトは、BufWritePost
コマンドが実行されるたびに(同期的に)実行されます。次に、そのスクリプト内にgitcommitを実行するために必要なロジックを簡単に含めることができます。プラグインは、これらのスクリプトの特定の命名規則を前提としており、特定の名前に一致するファイルまたは特定の拡張子を持つファイルでのみトリガーされる「フック」スクリプトもサポートしています。
この問題についての私の見解を報告したいと思います。
Gitリポジトリ(_vimrc.vim
_、bootstrap .vimrc)に_$VIMCONF
_があり、_<Leader>ve
_( "vim edit")をマップして開く)新しいタブのvimrc。これは現在の作業ディレクトリには影響しません。
したがって、vim gitリポジトリの外部の別のディレクトリで開始されたvimから_vimrc.vim
_を編集すると、NickEdwardsによって議論されたアプローチは失敗します。私のハックは次のとおりです(WindowsとLinuxの場合)
_if has('win32')
" The git command has to be passed to git. So we need to call bash.exe.
autocmd BufEnter *vimrc.vim silent! lcd %:p:h
autocmd BufWritePost *vimrc.vim if expand('<amatch>') =~ substitute(expand('$VIMCONF\vimrc.vim'), '\', '/', "g") | execute '! git add % & git commit -m %' | endif
else " Linux
autocmd BufWritePost *vimrc.vim
\ if expand('<amatch>') =~ expand($VIMCONF)."/vimrc.vim" |
\ let tempdir = getcwd() | execute 'cd' fnameescape(expand('<amatch>:h')) |
\ execute '! if git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m % ; fi' |
\ execute 'cd' fnameescape(tempdir) |
\ endif
endif
_
説明:
git
はパスに含まれている必要があります(つまり、_git <ENTER>
_に_cmd.exe
_と入力できる必要があります)tempdir
に保存しますノート:
|
_を使用して「チェーン」できます。コマンドのいずれかが失敗すると、チェーンは中止されます。複数の行を分割するには、次の行を_\
_で開始します。*.vim
_およびexpand($VIMCONF)."/ftplugin/"
になります