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

スポンサーサイト

上記の広告は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
<<HTC Aria | ホーム | NYAOS + Lua + Migemo>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://nocd5.blog59.fc2.com/tb.php/454-6d489eb6
この記事にトラックバックする(FC2ブログユーザー)
home

プロフィール

Author:nocd5
30歳(男)
会社員

Last.fm



最近の記事

カテゴリー

カレンダー

07 | 2017/08 | 09
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ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。