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

2018/12/01 追記

前書き

以前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です。

NyaosHistory は先頭にタイムスタンプが付与されていましたが、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 時間もあれば移行できました。

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