NYAOS 3000 で bat ファイルとかを拡張子なしで実行する

NYAOS 3000 は bat ファイルを実行するのに拡張子が省略できない。なので scala.bat とか git.cmd とか ant.bat とか rake.bat とか非常にめんどい。中には bzr みたいに Windows インストーラで入れると bzr.exe なのに Python base のインストーラで入れると bzr.bat になるようなのもあってものすごくめんどい。
なんとかならないかと思っていたけどふとコマンドラインフィルタでなんとかできそうだと思ったのでやってみた。

function nyaos.filter(cmdline)
    cmdline = cmdline:gsub('^[%w-_]+', function(cmd)
        if cmd:match('%.') then
            return false
        end

        local path='.;' .. os.getenv('PATH')

        local cmdl=cmd:lower()
        local variation={}
        for ext in os.getenv('PATHEXT'):gmatch('[^;]') do
            variation[ cmdl .. ext] = true
        end
        for key,val in nyaos.suffix() do
            variation[ cmdl .. '.' .. key:lower() ] = true
        end

        for path1 in path:gmatch('[^;]+') do
            for fname in nyaos.dir(path1) do
                if variation[ fname:lower() ] then
                    return fname
                end
            end
        end
    end)
    return cmdline
end

標準の設定ファイルに入ってる which コマンドをほぼ流用。流用したため suffix の省略も有効になってる。なので設定してあれば lua やら perl やら ruby やらも拡張子なしで実行できる。
コマンドラインフィルタ便利!
そして、世界は平和になった。


と言いたかったけど、alias にはフィルタが効かないっぽい。適用順が alias の方が後なのかな?なので例えば、

alias g git

ってやっても git なんてないと言われる。

alias g git.cmd

ってやればいい話なんだけど、bzrの件もあるので微妙。それにやっぱり気持ち悪い。
将来的には alias も フィルタで実現するかもみたいな話もあるので、それで適用順が割と自由にできるようになればなんとかなるかな。

追記:バグとか直しました。続・NYAOS 3000 で bat ファイルとかを拡張子なしで実行する - 永遠に未完成