vim-users.jp

Hack #101: gitリポジトリの内容を参照する

Posted at 2009/11/13
このエントリーをはてなブックマークに追加

問題

gitを利用して開発を行なっていると、 しばしば現在作業中のブランチとは 別のブランチのファイルを参照したいときがあります。

git show {branch}:{path-to-a-file} で特定のブランチのファイルを出力できるので、 Vimからは

:new
:read !git show {branch}:{path-to-a-file}

とすれば問題のファイルの内容を参照することはできますが、手順が面倒です。 それに多数のブランチが存在する場合や参照したいファイルへのパスが長い場合は コマンドの入力にも苦労します。 どうにかして簡単に参照することはできないでしょうか。

解決方法

metarw-git を利用します。

例えば「あるブランチのファイル」は以下のようにして参照することができます。

:edit git:{branch}:{path-to-a-file}

:editだけでなく、 :read:sourceといった ファイル名を引数として取るコマンドならば 同様にして内容を参照することができます。

git:{branch}:{path-to-a-file}の使用例

また、Vimでは標準でディレクトリの内容を「開く」ことができますが、 これと同様に「あるブランチのディレクトリの内容」も参照することができます。 これには以下のようなパスを用います。

:edit git:{branch}:{path-to-a-directory}

git:{branch}:{path-to-a-directory}の使用例

さらに、ディレクトリに対するファイル/ディレクトリと同様に、 gitリポジトリ内に存在するブランチも参照することができます。 これには以下のようなパスを用います。

:edit git:

git:の使用例

以上の例では説明と簡単にするため 「あるブランチの内容」という表現をしましたが、 実際にはブランチに限らず任意のコミットオブジェクト (に付随するツリーオブジェクト)の内容を参照することができます。 ですので、metarw-gitを利用して 現在開いているファイルの一つ前のバージョンを開く といったことも可能です。

解説

Vimでは各種イベントに応じて任意のコマンドを自動的に実行することができます (:autocmd)。 metarw-gitではこれを利用して、 git:{branch}:{file}のような実際には存在しないファイルが 読み書きされる際にgitリポジトリから適切な内容をバッファへ読み込むことで、 あたかもそのようなファイルが存在するかのようにVimを拡張しています。

例えばVimでは標準で ディレクトリやzipなどのアーカイブファイルの内容を閲覧したり、 それに含まれるファイルなどの内容を「開く」ことができるように なっていますが、 その機能は標準添付されているプラグインにより実現されており、 各プラグインではmetarw-gitと同様に:autocmdを駆使して処理を行なっています。

なお、metarw-gitなどのプラグインが行なっている 「ファイルでないものを普通のファイルであるかのように扱う」 処理は実際に実装するとなるとかなり煩雑です。 この点を抽象化した metarw というライブラリがあり、 metarw-gitはそれを利用して作られています。

参考資料

kana

もどる
blog comments powered by Disqus