■■■■■■□■■■■■■□■■■■■■□□□□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■■■■■□■■□□□□
■■□□■■□■■□□■■□■■□□□□□■■□□■■□■■■■■■
■■□□■■□■■□□■■□■■□□□□□■■□□■■□□□□□■■
■■□□■■□■■■■■■□■■■■■■□■■■■■■□■■■■■■

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

NYAOS + Lua + Migemo(2)

先日書いたスクリプトですが、
nyaos.evalが調子悪かったので、
nyaos.default_completeから
ファイルリストを取得するようにしました。
これでnyaos.command2でコマンド登録できます。
あと、末尾の(バック)スラッシュを取り除く処理や
一文字目が小文字の時のみignorecaseになるようにしたり、
毎回migemo辞書を開くとメモリの消費量が大きくなるので
(別にリークしている訳ではなくて、deleteされるタイミング)
グローバル変数にしたりです。

また、nyaos.completeでのmigemo検索の結果での補間ですが
途中まで入力済みのコマンドを置き換えることはできないようなので断念です…

ってことで、以下スクリプト。使用しているライブラリに違いは無いので
スクリプトだけ直接載せちゃいます。
lua_e "
mcx = nil -- 毎回migemo辞書を開くのはアレなのでグローバル変数にする
function nyaos.command2.migemo_chdir(strdir)
    local luamigemo = require('luamigemo')
    local rex       = require('rex_onig') -- PCREでUTF8を有効にする方法が分からなかった
    local luaiconv  = require('luaiconv')
    if (mcx == nil) then
        mcx = luamigemo.open('E:/bin/dict/migemo-dict')
    end

    local sjis2utf8 = luaiconv.new('utf-8', 'sjis') -- SJISのままだと'ー'が通らず…

    local strque = strdir
    if (strque:sub(1, 2) == '..') then
        nyaos.chdir(strque)
    else
        lastchar = strque:sub(-1)
        if (lastchar == '/' or lastchar == '\\') then
            strque = strque:sub(1, strque:len()-1)
        end
        local strpat = '^' .. luamigemo.query(mcx, strque) -- 単語先頭に限定
        local cmpreg = rex.new(
            sjis2utf8:iconv(strpat),
            strque:sub(0):match('%u') and '' or 'i', -- 最初の文字が小文字ならignorecase
            'UTF8' -- 第3引数を指定できるのは鬼車のみ
        )
        local tbldir = {}

        -- 正規表現で一致するディレクトリをtbldir[]に入れていく
        -- nyaos.evalが調子悪いのでnyaos.default_completeからリストを作る
        for i, f in pairs(nyaos.default_complete('', 0)) do
            f[1] = f[1]:sub(f[1]:len()) == '\\' and f[1]:sub(1, f[1]:len()-1) or f[1] -- 末尾の'\'を削除
            local stat = nyaos.stat(f[1])
            if (stat and stat.directory) then
                if (cmpreg:exec(sjis2utf8:iconv(f[1]))) then
                    table.insert(tbldir, f[1])
                end
            end
        end

        -- tbldirの要素が1コならchdir
        -- tbldirの要素が0コならエラー
        -- tbldirの要素が2コ以上なら候補を表示
        if (#tbldir == 0) then
            print(strque .. ': no such directory.')
            print(strpat)
        elseif (#tbldir == 1) then
            nyaos.chdir(tbldir[1])
        else
            -- 候補を表示してユーザーからの入力待ち
            print('please select a number of the following list.')
            for i = 1, #tbldir do
                print(
                    string.rep(' ', string.len(#tbldir) - string.len(i)) .. -- 数字の桁合わせ用スペース
                    i .. ': ' .. tbldir[i]
                )
            end
            -- 数字以外のキーが押されるとintdirはnilになり
            -- nilで条件から除外するようにしないと実行時エラーになる
            local intdir = tonumber(nyaos.getkey())
            if (intdir ~= nil and 0 < intdir and intdir <= #tbldir) then
                nyaos.chdir(tbldir[intdir])
            else
                print('ERROR:INVALID INDEX')
            end
        end
    end
end
"
スポンサーサイト

テーマ:フリーソフト - ジャンル:コンピュータ

  1. 2010/12/23(木) 00:52:25|
  2. フリーソフト
  3. | トラックバック:0
  4. | コメント:0

NYAOS + Lua + Migemo

mattn,さんのところLuaからMigemoを使うライブラリを見つけたので
NYAOSLuaMigemoってしてMigemoでchdirできるスクリプトを書いてみました。

多分ライセンスは大丈夫だと思うので以下に
ビルドしたDLLと一緒に置いておきます。
問題があれば早急に削除しますので、
お手数ですがご連絡お願いいたします。
オリジナルファイル名 migemo_chdir.7z.001
オリジナルファイル名 migemo_chdir.7z.002

インストール
  1. 解凍して出来たDLLと、KaoriyaさんとこからC/Migemoのmigemo.dllをパスの通ったところに置き、
    migemoの辞書を適切なところに置きます。
  2. migemo_chdir.nyaの
    local mcx = luamigemo.open('E:/bin/dict/migemo-dict')
    のところを1.で置いたmigemo辞書のパスに修正します。
  3. あとはmigemo_chdir.nyaをsourceするなり、_nyaに直接書くなりしてください。

その他コメント
luamigemo.dllとluaiconv.dllはもともとmigemo.dllとiconv.dllって名前だったんですけど、
それだともともとのmigemoとiconvと名前が衝突してしまい、
都合が悪かったので頭に"lua"を付けました。

Luaの仕様だと思いますが、require
引数にライブラリのファイル名前を取りますが、その際コンストラクタとして
luaopen_<ライブラリのファイル名>の関数を呼び出すため、ファイル名を修正すると
内部の関数も合わせて修正する必要があったため、僕の方で修正してビルドしています。
まあ、package.loadlibしてluaopen_***しても良かったんですが…

Lrexlibの方は鬼車のものをビルドしました。
これは正規表現マッチが一部の文字("ー”)で上手く行かず、
sjisからutf-8に文字エンコードを変換しているのですが、
鬼車しかUTF8にする方法が分からなかったからです…

sjis->utf-8の変換に関してはluaiconvを使用しているんですが、
iconvをstaticリンクしたらファイルサイズが大きくなってしまったので
分割してファイルをアップロードしています。
DL後ファイル名を適切に修正し、7zipで解凍して下さい。

ちゃんとnyaos.completeを使えば
migemoでマッチしたディレクトリをzshのように補間したりできるんだろうなぁ
と思いつつも力不足なのでこの辺で。
[NYAOS + Lua + Migemo]の続きを読む

テーマ:フリーソフト - ジャンル:コンピュータ

  1. 2010/12/20(月) 22:34:42|
  2. フリーソフト
  3. | トラックバック:0
  4. | コメント:0
home

プロフィール

Author:nocd5
30歳(男)
会社員

Last.fm



最近の記事

--年--月--日 (--)
スポンサーサイト
2010年12月23日 (木)
NYAOS + Lua + Migemo(2)
2010年12月20日 (月)
NYAOS + Lua + Migemo

カテゴリー

カレンダー

11 | 2010/12 | 01
Sun Mon Tue Wed Thu Fri Sat
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -

最近のコメント

最近のトラックバック

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

Amazonアソシエイト

RSSフィード

リンク

このブログをリンクに追加する

FC2ブログランキング

FC2Blog Ranking

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。