前の記事で書いたとおり、先日からVimの設定ファイルをSubversionで管理するようになりました。
実は私、Subversionは元より、バージョン管理システムを使うのはこれが初めてです。(これまでバックアップといえば当然のようにフォルダを丸ごとコピーしていました)
Subversionは初めはとっつきにくかったのですが、TortoiseSVNを使っているうちにだんだんと分かってきたような気がします。
そんなわけで、今回はさらにTortoiseSVNから一歩前進するため、VimとSubversionの連携についてまとめてみます。
Vim上でSVNコマンドを実行
vcscommand.vim
SVNのコマンドを扱えるプラグインはいくつか存在するようでしたが、どうやら現在はこれが主流っぽい。
使えるコマンドとキーマップは以下のとおり。
コマンド | キーマップ |
---|---|
:VCSAdd | <Leader>ca |
:VCSAnnotate | <Leader>cn |
:VCSCommit | <Leader>cc |
:VCSDelete | |
:VCSDiff | <Leader>cd |
:VCSGotoOriginal | <Leader>cg |
:VCSGotoOriginal! | <Leader>cG |
:VCSInfo | <Leader>ci |
:VCSLog | <Leader>cl |
:VCSRevert | |
:VCSReview | <Leader>cr |
:VCSStatus | <Leader>cs |
:VCSUpdate | <Leader>cu |
:VCSVimDiff | <Leader>cv |
各コマンドの詳細はヘルプをご参照あれ。
私はTortoiseSVNと併用しているので、よく使うのは「Commit」「Revert」「VimDiff」くらい。
VCSCommit
現在のバッファを対象にリポジトリに変更内容を反映します。
<Leader>ccするとコメント用のウィンドウが現れ、入力後に再度<Leader>ccで送信します。
コメントは日本語も問題ありませんでした。
コミットの対称はあくまで現在のバッファ単体であり、特定フォルダ以下をまとめてコミットということはできないのが残念なところ。(なのでやっぱりTortoiseSVNは手放せません)
VCSRevert
現在のバッファを前回コミット時の状態に戻します。
変更していてゴチャゴチャになってしまったら、とりあえずこれを実行してすっきりやり直し。
Revert自体の取り消しはできない(?)ようなので実行時はご注意を。
VCSVimDiff
現在のバッファの状態と前回コミット時の状態を比較します。
「VCSDiff」の方はUniDiff形式で差分を出力するだけですが、こちらの「VCSVimDiff」はVimのDiff機能を使って視覚的に差分を表示してくれます。
なお、Windowsでは別途diffコマンドのバイナリを用意しておく必要があります。→Windows環境のvimエディタでdiff機能を使うには — 名無しのvim使い
VimDiffの使い方とオススメ設定
VimDiffでは以下のような操作をよく使います。
操作 | 説明 |
---|---|
[c | 前(上方)の変更の先頭へ移動する |
]c | 次(下方)の変更の先頭へ移動する |
do | 現在のバッファをもう1つのバッファと同じくなるように変更 |
dp | もう1つのバッファを現在のバッファと同じくなるように変更 |
:diffoff | カレントウィンドウの差分モードを終了する。 |
標準のままではちょっと使いづらいので、以下のように設定しました。
"F7とF8で前後の変更箇所へ移動
nmap <F7> [c
nmap <F8> ]c
"<Leader>dqでDiffから抜ける
nmap <Leader>dq :winc l<CR>:bw<CR>:diffoff<CR>
また、tabbar.vimを使っているとVimDiffに入る際ウィンドウがおかしくなってしまうので、以下のように修正しています。
"<Leader>cvでタブバーを消し、VCSVimDiffを表示(vcscommand.vim)
map <Leader>cv :TbStop<CR>:VCSVimDiff<CR>
これでかなり快適になりました。
VimからTortoiseSVNを起動
Call TortoiseSVN commands
こちらのTipsではVimからTortoiseSVNを呼び出す方法が紹介されています。
以下のように設定してみました。
" Save the current buffer and execute the Tortoise SVN interface's diff program
map <unique> <silent> <leader>td :w<CR>:silent !"C:\Progra~1\TortoiseSVN\bin\TortoiseProc.exe /command:diff /path:"%" /notempfile /closeonend"<CR>
" Save the current buffer and execute the Tortoise SVN interface's log
map <unique> <silent> <leader>tl :w<CR>:silent !"C:\Progra~1\TortoiseSVN\bin\TortoiseProc.exe /command:log /path:"%" /notempfile /closeonend"<CR>
" Save the current buffer and execute the Tortoise SVN interface's revision graph
map <unique> <silent> <leader>tr :w<CR>:silent !"C:\Progra~1\TortoiseSVN\bin\TortoiseProc.exe /command:revisiongraph epath:"%" /notempfile /closeonend"<CR>
" Save the current buffer and execute the Tortoise SVN interface's blame program
map <unique> <leader>tb :call TortoiseBlame()<CR>
fu! TortoiseBlame()
" Save the buffer
silent execute(':w')
" Now run Tortoise to get the blame dialog to display
let filename = expand("%")
let linenum = line(".")
silent execute('!C:\Progra~1\TortoiseSVN\bin\TortoiseProc.exe /command:blame /path:"' . filename . '" /line:' . linenum . ' /notempfile /closeonend')
endfunc
わざわざエクスプローラに戻ることなく、リビジョングラフなどTortoiseのグラフィカルな機能が使えるようになります。
パスの記述が「C:\Progra~1」となっているのには訳があり、普通に「C:\Program Files」と書いてしまうとスペースの影響でエラーになるので注意。
参考書籍
SubversionとTortoiseSVNの使い方はこの本で覚えました。非常に読みやすく、初心者には特にお勧めです。まずTortoiseでの操作を画像付きで解説し、後半では同じ操作をLinuxのコマンドで紹介しています。著者の語り口も楽しい。
Subversion実践入門:達人プログラマに学ぶバージョン管理(第2版)
こちらは訳書ゆえかちょっと読みづらい印象。「入門Subversion」より詳しい内容も載っているので第二ステップとしてどうぞ。第二版ではTracなど関連ツールに関する記述が増えたよう。
Comments»
no comments yet