本記事は Vim Advent Calendar 2012 の189日目です。188日目は @supermomonga さんの Vimのチートシート生成サービス作りました。感じ感じ。 | かなりすごいブログ でした。
ここでは Vim からバージョン管理システム上のファイルを扱う際に便利なプラグイン vcscommand.vim とその少し便利な使い方について紹介します。
vcscommand.vimとは
名前の通り Vim からバージョン管理システム(Version Control System:VCS)に対する操作を行うためのプラグインです。特定の VCS を目的としたものではなく、CVS、Subversion、SVK、Git、Mercurial、Bazaar など複数の VCS を同じように操作できるのが特徴です。
操作と言っても複数のファイルをまとめて扱う類のものではなく、開いている単一のファイルに対する操作が中心になります。インストール
プラグインマネージャを使う場合
プラグインのインストール方法はいくつかありますが、Vundle や NeoBundle を使用している場合は名前だけで導入できて楽です。(以下は Vundle の例)
Bundle 'vcscommand.vim'このプラグインに限りませんが何らかのプラグインマネージャを導入しておくと気軽に試せるのでオススメです。
- tpope/vim-pathogen · GitHub
- gmarik/vundle · GitHub
- Shougo/neobundle.vim · GitHub
- Big Sky :: pathogen や vundle、neobundle を使う際に必ず読んで欲しい簡単おいしい、たった1つの速報まとめ
zipファイルを解凍する場合
runtimepath にこだわりが無い場合は vim-online から zip ファイルをダウンロードして ~/.vim 以下に展開します。
% curl -L -o ./vcscommand-1.99.47.zip http://www.vim.org/scripts/download_script.php?src_id=19809 % unzip ./vcscommand-1.99.47.zip -d ~/.vim Archive: ./vcscommand-1.99.47.zip c0d27010dd0c96884cfd34c3af621ae009109c69 creating: /home/yoshikaw/.vim/doc/ inflating: /home/yoshikaw/.vim/doc/vcscommand.txt creating: /home/yoshikaw/.vim/plugin/ inflating: /home/yoshikaw/.vim/plugin/vcsbzr.vim inflating: /home/yoshikaw/.vim/plugin/vcscommand.vim inflating: /home/yoshikaw/.vim/plugin/vcscvs.vim inflating: /home/yoshikaw/.vim/plugin/vcsgit.vim inflating: /home/yoshikaw/.vim/plugin/vcshg.vim inflating: /home/yoshikaw/.vim/plugin/vcssvk.vim inflating: /home/yoshikaw/.vim/plugin/vcssvn.vim creating: /home/yoshikaw/.vim/syntax/ inflating: /home/yoshikaw/.vim/syntax/cvsannotate.vim inflating: /home/yoshikaw/.vim/syntax/gitannotate.vim inflating: /home/yoshikaw/.vim/syntax/hgannotate.vim inflating: /home/yoshikaw/.vim/syntax/svkannotate.vim inflating: /home/yoshikaw/.vim/syntax/svnannotate.vim inflating: /home/yoshikaw/.vim/syntax/vcscommit.vimファイル一覧をみるとサポートしている各 VCS の実装があることが分かります。
使い方
VCS で一般的な操作に対応したコマンドが用意されています。CVS 専用のコマンドもありますが、長いこと使ってないのでコマンドの意味は忘れてしまいました。このプラグインを使う上では、よほど頻繁に使う場合を除いて VCS 固有のコマンドは覚えなくても良いかなと思っています。詳しくは :h vcscommand
でご確認ください。
コマンド
デフォルト マッピング | コマンド | 説明 |
---|---|---|
<Leader>ca | VCSAdd | ファイルを VCS 管理に追加 |
<Leader>cn | VCSAnnotate (VCSBlame) | 行毎にリビジョンと最終更新者の情報を表示 ! でアノテーションをファイルと別のバッファに分割して同期表示 |
<Leader>cN | VCSCommit | VCS 管理のファイルをコミット ! で空のコミットログ |
<Leader>cD | VCSDelete (VCSRemove) | ファイルを VCS 管理から削除 |
<Leader>cd | VCSDiff | ファイルをリポジトリの現在のリビジョンと比較(Unified Diff 形式) 引数を1つ与えた場合、そのリビジョンとファイルを比較 引数を2つ与えた場合、その2つのリビジョンを比較 |
<Leader>cg | VCSGotoOriginal | VCS 管理のファイルを開いているバッファを表示 |
<Leader>cG | VCSGotoOriginal! | VCS 管理のファイルを開いているバッファを表示して残りのスクラッチバッファを除去 |
<Leader>ci | VCSInfo | ファイルの VCS 管理情報を表示 |
<Leader>cl | VCSLog | VCS 管理ログを表示 引数を1つ与えた場合、そのリビジョンのログを表示 それ以外の引数は VCS コマンドに渡される |
<Leader>cL | VCSLock | VCS 管理のファイルをロック(VCSに依存) |
VCSRevert | ファイルを VCS 管理のリビジョンに戻す | |
<Leader>cr | VCSReview | 引数で与えた特定のリビジョンを別バッファに表示 引数を与えない場合は現在のリビジョンを表示 |
<Leader>cs | VCSStatus | ファイルの VCS 管理情報を別バッファに表示 |
<Leader>cu | VCSUpdate | VCS 管理の最新ファイルに更新 |
<Leader>cU | VCSUnlock | VCS 管理のファイルをアンロック |
<Leader>cv | VCSVimDiff | VCS 管理との差分を VimDiff 形式で表示 |
CVS専用のコマンド
デフォルト マッピング | コマンド |
---|---|
<Leader>ce | CVSEdit |
<Leader>cE | CVSEditors |
<Leader>ct | CVSUnedit |
CVSWatch | |
<Leader>cwa | CVSWatchAdd (CVSWatch add) |
<Leader>cwn | CVSWatchOn (CVSWatch on) |
<Leader>cwf | CVSWatchOff (CVSWatch off) |
<Leader>cwr | CVSWatchRemove (CVSWatch remove) |
<Leader>cwCVSWatchers | |
マッピング接頭辞をカスタマイズ
mapleader
を設定していない場合は \
c
l
で VCS ログを見る、となります。これはこれで覚えてしまえばよいのですが、g:VCSCommandMapPrefix
でマッピングの接頭辞(<Leader>c
)を変更できます。
私は次のように設定していますので ,
v
l
で VCS ログを見る、となります。
よく使うものだけマッピングを書いても良いのですが、こうやって接頭辞だけカスタマイズして用意されているデフォルトマッピングを手軽に自分流にできるのも便利ですね。
よく使うコマンド
私がよく使うコマンドについて Subversion での実行例をあわせて紹介します。
実行例の背景画像は @IMAGEDRIVE さんのイラストを @supermomonga さんの Vim チートシート化したものを使用しています。素敵なイラストとツール、たいへん有り難く使わせて頂きます。
VCSLog
VCS といったらまずは変更履歴。管理されているファイルを開いて VCSLog
すると、別のバッファに変更履歴が表示されます。
VCSAnnotate
「この変更を入れたのは誰だあっ!!」というのを調べるときに少し役立つ VCSAnnotate
。アノテーションがハイライトされたバッファが分割表示されます。
!
をつけて実行(VCSAnnotate!
)するとアノテーションとコードを別のバッファにして同期表示してくれますが、区切りが残念な感じになることが多いです。AUTHOR の最大文字数に合わせざるをえないので難しいところですね。
VCSDiff
手元に加えた変更との差分は VCSDiff
で Unified 形式で確認できます。
VCSVimDiff
VCSVimDiff
で vimdiff コマンドと同じように表示できます。このコマンドも引数にリビジョンを指定できます。見比べながらのマージ作業などに役立ちます。
VCSCommit
変更をコミットするときは VCSCommit
。実行するとコミットメッセージを入力するバッファが開きます。バッファを保存するとコミットされます。
もう少し使いやすくする
ここまで紹介したコマンドを個別に使うだけでも便利なのですが、どれも単機能で少し物足りません。
vcscommand.vim ではバッファを作る際に VCSBufferCreated というイベントを発生します。これを利用して新規バッファに対してマッピングなどを仕込むことで、q
でバッファを手軽に閉じるなどのカスタマイズができます。(詳しくは :h vcscommand-events
)
実際に使用している設定を以下に貼り付けていますが、具体的にどうカスタマイズしているかというと、
VCSLog
で開いたバッファで<CR>
するとカーソル行のログのリビジョンを取得してVCSDiff
、v
するとVCSVimDiff
、i
するとVCSInfo
VCSDiff
で開いたバッファでl
するとそのリビジョンのVCSLog
VCSAnnotate
で開いたバッファでv
するとカーソル行のリビジョンを取得してVCSDiff
、v
するとVCSVimDiff
、l
するとそのリビジョンのVCSLog
、i
するとVCSInfo
- ウィンドウが1つの時は vsplit して新規バッファを表示(通常は split)
おわりに
今回の Vim Advent Calendar では git に関する話題が多くて Subversion 使いとしては肩身が狭かったのですが、普段 Windows 端末の TortoiseSVN で行っているような履歴の追跡に近いことを vcscommand でも出来ますよ!ということを紹介させていただきました。
明日は @basyura さんです。楽しみですね。
0 件のコメント:
コメントを投稿