【NYAGOS】NyaosからNyagosへ移行する

前書き

以前Nyagosをインストールしたものの、Nyaosにあった便利機能が色々なかったので結局Nyaosを使い続けていたんですが、Nyagosの方も大分アップデートが進んで色々便利になったようなので、そろそろ移行しようかなと。

移行しようと思ったものの、(多分、まだまだ破壊的変更が入るからでしょうか)今までの設定とかどーやって移行すればいいのかって言う説明が無いに等しいので、適当にメモしておきます。

インストールしたNyagos

4.0.9_10の64bit版をインストールしました。

設定ファイルの場所

今までは_nyaに書いており、読み込む場所はこんな風な説明がありました。

# _nya は NYAOS の初期設定ファイルです.
#   (1) NYAOS.EXE のあるディレクトリ
#   (2) %HOME% の下(未定義であれば %USERPROFILE%)
#   (3) カレントディレクトリ

Nyagosの場合は.nyagos%HOME%ないしは%USERPROFILE%へ置く必要があります。nyagos.exeのあるディレクトリの.nyagosは読み込みません。

マニュアルの「起動処理」にはnyagos.exeと同じディレクトリ内のnyagos.luaも読み込むと書かれていますが、こちらのファイルには先頭にこんなことが書かれています。

--------------------------------------------------------------------------
-- DO NOT EDIT THIS. PLEASE EDIT ~\.nyagos OR ADD SCRIPT INTO nyagos.d\ --
--------------------------------------------------------------------------

と言うわけで、おとなしく.nyagosを書いていきましょう。

環境変数の設定

Nyaosではsetを使って環境変数を積んでいくことが可能でした。Nyagosでもsetを使って同様のことができますが、更に簡単に書けるようになっています。

デフォルトの.nyagosに書かれている内容を見てみましょう。

set{
    PROMPT='$L'.. nyagos.getenv('COMPUTERNAME') .. ':$P$G$_$$$s'
}

この中にぼんぼん設定したい環境変数をぶちこめばOKです。(ここじゃなくて別のところに書いてもいいですけど。)

今後の設定でもそうですが、何らかのパスを記載するときはLuaのヒアドキュメント記法である[[ ]]でくくるとエスケープをしなくて済むので楽ちんです。

set{
    PROMPT='$L'.. nyagos.getenv('COMPUTERNAME') .. ':$P$G$_$$$s',
    LESS='-gj3R --no-init --quit-if-one-screen',
    LESSCHARSET='japanese',
    EDITOR=[[C:\Program Files (x86)\vim\vim74\vim.exe]]
}

プロンプトの文字列や色を変更する

若干ここがややこしくなっています。

Nyaosではoption promptで指定していましたが、NyagosではsetPROMPTが表示する文字列、nyagos.promptで色付け、となっています。

デフォルト設定だとこんな感じになってますね。

-- Simple Prompt for CMD.EXE
set{
    PROMPT='$L'.. nyagos.getenv('COMPUTERNAME') .. ':$P$G$_$$$s'
}

-- Coloring Prompt for NYAGOS.exe
local prompter=nyagos.prompt
nyagos.prompt = function(this)
    return prompter('$e[36;40;1m'..this..'$e[37;1m')
end

Nyaos(もとい、_nya)と同じ設定にする場合は、$e~;1mの部分をnyagos.promptに持ってきます。

nyagos.prompt = function(this)
    return prompter('$e[36;40;1m'..this..'$e[37;1m')
end

あとはその他の部分をset内のPROMPTに設定してあげればOKです。

set{
    PROMPT='[$P]$_$$ ',
}

aliasの設定

基本的にはマニュアルに書いてあることをよく読んで.nyagosに書けばOKです。

デフォルトのエイリアスnyagos.d\aliases.luaにあるので参考にしましょう。

alias{
    ls='ls -oF $*',
    lua_e=function(args) assert(load(args[1]))() end,
    ["for"]='%COMSPEC% /c "@set PROMPT=$G & @for $*"',
}

私はもともと_nyaにこんなエイリアスを作ってました。

set MSYS=C:\MinGW\msys\1.0\bin
alias ls=$MSYS\ls.exe --color=auto --show-control-chars
alias ll=$MSYS\ls.exe -agoFh --time-style=+"%Y/%m/%d %H:%M" --color=auto --show-control-chars
alias find=$MSYS\find.exe
alias sjis=nkf.exe -s
alias git=git --no-pager

.nyagosに書き換えるとこんな感じですね。

local MSYS=[[C:\MinGW\msys\1.0\bin]]

alias{
    ls=MSYS..[[\ls.exe --color=auto --show-control-chars]],
    ll=MSYS..[[\ls.exe -agoFh --time-style=+"%Y/%m/%d %H:%M" --color=auto --show-control-chars]],
    find=MSYS..[[\find.exe]],
    sjis="nkf.exe -s",
    git="git --no-pager",
}

suffixの設定

マニュアルに設定方法が書いてあります。見出しはnyagos.argsfilterってなってますが…。

デフォルトのサフィックスnyagos.d\suffix.luaの一番下に書かれています。

suffix.pl="perl"
if nyagos.which("ipy") then
  suffix.py="ipy"
elseif nyagos.which("py") then
  suffix.py="py"
else
  suffix.py="python"
end
suffix.rb="ruby"
suffix.lua="lua"
suffix.awk={"awk","-f"}
suffix.js={"cscript","//nologo"}
suffix.vbs={"cscript","//nologo"}
suffix.ps1={"powershell","-file"}

これを見るだけでも何となくわかると思うので説明は割愛。

Historyの移行

Nyaosではoption savehistを設定することでHistoryを保存できましたが、Nyagosではデフォルトで保存されるようになりました。

場所は~\AppData\Roaming\NYAOS_ORG\nyagos.historyです。

NyaosのHistoryは先頭にタイムスタンプが付与されていましたが、Nyagosではそれがなくなりました。

適当な正規表現でタイムスタンプを削って保存すればそれだけで移行完了です。

Luaスクリプトのロード

nyagos.luaを読む限りloadfileなる関数にファイルパスを突っ込めばよさそうですが、普通にnyagos.dLuaファイルを入れておくのが一番いいと思います。

おまけ:gpathの移行

Nyagosにはgpathがまだ実装されていません。

割と頻繁に使う機能なので是非とも欲しいのですが、そもそもNyaosのgpathはLuaで書かれているので自分で移行してしまいます。

とは言え、流石に単純に_nya.dからコピペしただけで移行するのは不可能なので、ちょっとだけ直します。

nyagos.alias("gpath", function(args)
    local argv=args
    local shell=nyagos.ole.create_object_utf8("WScript.Shell")
    local sysEnv=shell:Environment("System")
    local path={}
    for p in string.gmatch(sysEnv:Item("PATH"),"[^;]+") do
        table.insert( path , p )
    end
    if argv[1] == "del" then
        if argv[2] then
            if string.match(argv[2],"^%d+$") then
                table.remove( path , argv[2] )
            else
                print("gpath del [POSITION]")
                return
            end
        else
            table.remove( path )
        end
    elseif argv[1] == "add" then
        if argv[2] then
            if argv[3] then
                if string.match(argv[2],"^%d+$") then
                    table.insert( path , argv[2] , argv[3] )
                else
                    print("gpath add [POSITION] DIRECTORY")
                    return
                end
            else
                table.insert( path , argv[2] )
            end
        else
            print("gpath add [POSITION] DIRECTORY")
            return
        end
    elseif argv[1] == "swap" then
        local tmp1 = path[tonumber(argv[2])] 
        local tmp2 = path[tonumber(argv[3])]
        if tmp1 and tmp2 then
            path[ tonumber(argv[2]) ] = tmp2
            path[ tonumber(argv[3]) ] = tmp1
        else
            print("gpath swap POSITION-1 POSITION-2")
            return
        end
    else
        print("Usage:")
        print("  gpath add [POSITION] DIRECTORY")
        print("  gpath del [POSITION]")
        print("  gpath swap POSITION-1 POSITION-2")
        print("")
        for i=1,#path do
            print(i,path[i])
        end
        return
    end
    path = table.concat(path,";")
    sysEnv:__put__("Item","PATH",path)
    if sysEnv:__get__("Item","PATH") ~= path then
        print("Fail to set PATH="..path)
    end
end)

どれぐらい「ちょっと」なのかdiffをとってみましょう。

< nyagos.alias("gpath", function(args)
<     local argv=args
<     local shell=nyagos.ole.create_object_utf8("WScript.Shell")
---
> function nyaos.command.gpath(...)
>     local argv={...}
>     local shell=nyaos.create_object("WScript.Shell")
62c62
< end)
\ No newline at end of file
---
> end

ざっとこんなもんです。

まとめ

と言うわけで、おおよそ1時間もあれば移行できました。

もっと色々カスタマイズしている人はさらに大変でしょうが頑張ってください。