私はVimの世界に不慣れです。ファイルを保存するたびにバージョン管理にコミットされるようにしたいと思っています。これは可能ですか?
私はVimの世界に不慣れです。ファイルを保存するたびにバージョン管理にコミットされるようにしたいと思っています。これは可能ですか?
回答:
.vimrcに配置するvim自動コマンドを使用します。このコマンドは、最初にgitディレクトリで作業していることを大まかにチェックし(現在のディレクトリまたはを使用して.gitディレクトリの存在を確認するgit rev-parse
)、次にを使用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'
autocmd BufWritePost * execute '! if [ -d .git ] || git rev-parse --git-dir > /dev/null 2>&1 ; then git add % ; git commit -m %; fi'
、SOの回答
あなたは確かにこれをマクロまたはコマンドの再マッピングで実行することができます。
(/programming/117150/can-i-re-map-commands-in-vimを確認してください)
それが良いオプションかどうかはわかりませんが。私は今のところgitに慣れていないので、svnとは時々違うことを知っています。しかし、私はこの自動コミットをsvnで実行しません。コミットは意味のあるものである必要があり、定期的に保存する必要はありません。
通常は、ファイルを操作しただけでなく、関数を追加したり、バグを修正したりしてコミットします。コンパイルされていないプロジェクトや未完成の関数で終わることはありません。
私はこの質問が古くて露骨な自己宣伝であることを知っていますが、特定のVim autocmd
イベントの後に特定のシェルスクリプトが実行されるようにトリガーするVimプラグインを作成しました。たとえば、という名前のスクリプトは.bufwritepost.vimhook.sh
、BufWritePost
コマンドが実行されるたびに(同期的に)実行されます。その後、そのスクリプト内でgit commitを実行するために必要なロジックを簡単に含めることができます。プラグインは、これらのスクリプトの特定の命名規則を想定しており、特定の名前に一致するか、特定の拡張子を持つファイルでのみトリガーされる「フック」スクリプトもサポートしています。
この問題について私の見解を報告したいと思います。
私はvimrc.vim
gitリポジトリ($VIMCONF
、ブートストラップ.vimrcを含む)にあり<Leader>ve
、新しいタブでvimrcを開くようにマップ( "vim edit")しています。これは現在の作業ディレクトリには影響しません。
そのvimrc.vim
ため、vim gitリポジトリの外部の別のディレクトリで開始したvimから編集すると、Nick Edwardsによって議論されたアプローチは失敗します。私のハックは次のとおりです(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/"