LoginSignup
5
5

More than 5 years have passed since last update.

nyagosスクリプト解説 - svn のサブコマンドを勝手に拡張する

Last updated at Posted at 2015-07-21

そう、nyagos ならね!

%USERPROFILE%\.nyagos
nyagos.alias.svn = function(args)
    if args[1] == "amdc" then
        return "svn.exe status | findstr ^[AMDC]"
    end
    args[0] = "svn.exe"
    if args[1] == "exclude" then
        args[1] = "update"
        table.insert(args,2,"--set-depth=exclude")
    elseif args[1] == "emptyup" then
        args[1] = "update"
        table.insert(args,2,"--depth=empty")
    elseif args[1] == "emptyadd" then
        args[1] = "add"
        table.insert(args,2,"--depth=empty")
    end
    return args
end
  • svn amdcsvn status | findstr ^[AMDC] と同じ。つまり、改変があったファイルの一覧のみを表示して、?なファイルは表示しない
  • svn excludesvn update で出て来たファイルを出てこなかったことにする(レポジトリからは消さないが、ローカルからは消す)
  • svn emptyup … ディレクトリを svn update するが、その中のファイルはsvn updateしない
  • svn emptyadd … ディレクトリを svn add するが、その中のファイルはsvn addしない

解説

  • エイリアス定義はいろいろな書き方が出来るが、4.0.9 では「nyagos.alias.エイリアス名」に関数なり文字列なりを直接代入できるようになった(nyagos.exe 自体に組み込まれた機能)
  • エイリアス関数では関数自体で処理を記述せずとも、戻り値に新たなコマンドラインを返すという方法もとれるようになった。
    • 値としては、文字列、もしくはテーブルのどちらでもよい。テーブルの場合、実行ファイル名はテーブルの要素0でも1のどちらでもよい。これはエイリアス関数の引数のテーブルが1から始まり、かつエイリアス名そのものが含まれていないので、テーブルをシフトする手間がかからないように…という配慮だが、まぁ、いきあたりばったり感は否定できない
  • 戻り値に含めるコマンド名は、元のコマンド名と同じにすると、無限ループになりかねないので、ここでは「svn.exe」と拡張子を付けて回避している。
    • 戻り値ではなく、nyagos.exec / nyagos.eval を使う場合でも無限ループが発生しないよう同様の工夫が必要だが、これとは別に nyagos.rawexec / nyagos.raweval という関数を使うという方法もある。これらはエイリアスとか内蔵コマンドと解釈されない。Lua側の標準関数にも os.execute というものがあるが、こちらは文字列を UTF8 ではなく、現在のコードページの文字列として解釈されるので、文字化けが発生する場合がある

追記(gogit.lua について)

4.0.9_6 には「gogit.lua」というスクリプトを catalog.d\ に置いてある(catalog.d\ は標準で読み込まれない任意スクリプトを置くディレクトリ)。これはサブコマンド名を見て、「go」と「git」を書き間違えを補正するというフィルターである。こちらは作りがよりシンプルなので、よろしければ参考にしていただきたい。

5
5
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
5