Nyagos の拡張 (主に Subversion 用 Lua スクリプト)
前回は Nyagos を tcsh 風に使うようにするための変更についてまとめました。
今回は、それに加えてもう少し Subversion まわりについて拡張してみました。
できること
作成した vcs_info.lua
で、以下のことができます。
svn ls https://github.com/masamitsu-murase/nyagos.git/trunk/[Tab]
のように、svn
で始まる場合に URL のパスに対しても補完することができます。VcsInfo.box_svn_revisions(path)
のように呼ぶことで、C-x C-g
の git のリビジョン選択のように、 Subversion のリビジョンを選択することができます。VcsInfo.check_vcs_branch()
で、現在のパスが svn, git, hg のいずれかを判別し、返してくれます。
また、 git, hg の場合はブランチ名を、 svn の場合は親ディレクトリの名前を、二つ目の戻り値として返してくれます。
必要なファイルは nyagos.d/catalog/vcs_info.lua として GitHub に置いてあります。
このファイルを nyagos.d/catalog
以下に置き、 .nyagos
でいくつか設定をします。
Subversion の URL の補完
この機能を使うには、 vcs_info.lua
を .nyagos
で use するだけです。
.nyagos
の例を見てください。
このスクリプトを使うと、svn
で始まるときに限り、後続の URL を補完してくれます。
svn ls
コマンドで、リポジトリのディレクトリを見ながら補完するので、環境によってはやや遅いですが、私としてはそれなりに快適に使えています。
また、デフォルトでは直前の補完結果を 10秒間はキャッシュしていますので、連続で Tab を押したときは軽快に動くようになっています。
Subversion のリビジョンの選択
コマンドラインでマージをする際に、マージ対象のリビジョンを手で入力するのは面倒です。
git の場合は、 C-x C-g
でログを表示し、ハッシュ値を入力することができますが、これと同じようなことができることを目指しました。
この機能を使う場合、 box.lua のコードを参考に、以下のようなコードを .nyagos に追加する必要があります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | nyagos.key.C_x = function(this) nyagos.write("\nC-x: [s]:svn-revision...\n") local ch = nyagos.getkey() local c = string.lower(string.char(ch)) local result if c == 's' or ch == (string.byte('s') & 0x1F) then local path = VcsInfo.find_svn_path(this.text) result = VcsInfo.box_svn_revisions(path) else -- ... end this:call("REPAINT_ON_NEWLINE") return result end |
上記のように、 VcsInfo.find_svn_path
で現在のコマンドライン入力の中から URL らしきものを探し、 VcsInfo.box_svn_revisions
でリビジョンを選択することができます。
git, svn, hg のブランチ名の取得
VcsInfo.check_vcs_branch
を呼ぶことで、現在のディレクトリのブランチ名を取得することができます。
以下のようなルールでブランチ名を取得しています。
- git, hg
git rev-parse --abbrev-ref HEAD
やhg branch
でブランチ名を取得しています。- svn
- 現在のディレクトリを含むチェックアウトツリーのルートディレクトリを探し、その一つ上のディレクトリ名を取得します。
例えば、http://example.com/trunk
をチェックアウトしたディレクトリ以下なら、trunk
を返します。
同様に、http://example.com/branches/feature_a
をチェックアウトしたディレクトリ以下なら、feature_a
を返します。
私は、この機能を用いて以下のようにプロンプトを表示しています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | nyagos.prompt = function(this) local vcs, branch = VcsInfo.check_vcs_branch() local wd = nyagos.getwd() local title = wd .. " - NYAGOS" local prompt = "" if vcs then if not branch then branch = "" end prompt = "<" .. vcs .. ":" .. branch .. "> " end prompt = prompt .. "[" .. wd:gsub("\\", "/") .. "]$_%$s" return nyagos.default_prompt(prompt ,title) end |
このスクリプトだと、以下のようにプロンプトが表示されます。
1 2 | <svn:trunk> [C:/work/nyagos_svn] % |
もちろん、 Subversion のディレクトリ名が日本語を含む場合でも、適切に動作します。
Nyagos は Lua で拡張できるおかげで、割と楽に拡張することができました。