[▲前のスレッド]

2009/8/20 (木) 23:25:54  
[475] 最近使ったファイルを開く

2chのスレで話題になっていたので
私も書いてみました。

/*
    openMRU.js:  最近使ったファイルを開く
    (Unicode 版専用)

    使い方:
        最初にスクリプトを実行すると、最近使ったファイルがリストされます。
        リストされたファイル名のうち、
        開きたいものの「行頭」に何か「1文字」を「挿入」してください。
        それがチェックマークになります。
        そしてこのスクリプトをもう一度実行すると、
        チェックしたファイルを一度に開きます。

    ☆タスクバーにサクラを常駐していると、
     最近使ったファイルのリストが古いことがあります。
*/


//____________________________________________________________________________
function ListMRU()
{
    // MRU をリストして表示

    // 改行文字を取得
    var lc = Editor.GetLineCode();
    if(lc == 0)      lc = '\r\n';
    else if(lc == 1) lc = '\r';
    else             lc = '\n';

    // MRU を取得して
    var asMRU = GetMRU(Editor.ExpandParameter('$I'));

    // リストを書き出す
    Editor.InsText('\t' + asMRU.join('\t*' + lc + '\t') + '\t*' + lc);
}


//____________________________________________________________________________
function GetMRU(sIniPath)
{
    // sakuraW.ini から MRU リストを取り出す

    var asMatch = LoadUTF8File(sIniPath).match(/^MRU\[\d+\]\.szPath=.*?$/gm);

    var asMRU = [];
    if(asMatch){
        for(var i = 0; i < asMatch.length; ++i){
            asMatch[i].search(/^MRU\[\d+\]\.szPath=(.*)/);
            asMRU[i] = RegExp.$1;
        }
    }

    return asMRU;
}


//____________________________________________________________________________
function LoadUTF8File(sFilePath)
{
    // UTF8 のファイルを読み込む

    return DecodeUTF8(LoadBinaryFile(sFilePath));
}


//____________________________________________________________________________
function LoadBinaryFile(sFilePath)
{
    // バイナリデータを読み込む

    fso = new ActiveXObject('Scripting.FileSystemObject');

    // バイナリモードがないのでUNICODEで開く
    var s = fso.OpenTextFile
    (   sFilePath
    ,   1     /*generic_read*/
    ,   false /*open_existing*/
    ,   true  /*utf-16 le*/
    ).ReadAll();

    // wchar_t[] -> byte[]
    var a = [];
    for(var i = 0; i < s.length; ++i){
        var c  = s.charCodeAt(i);
        var k  = 2 * i;
        a[k]   = c & 0xff;
        a[k+1] = (c >> 8) & 0xff;
    }

    return a;
}


//____________________________________________________________________________
function DecodeUTF8(aUTF8)
{
    // UTF8 のバイナリデータを、デコードする

    var as = []; // デコードされた文字の配列
    var iS = 0;  // as のインデクス

    var iA = 0; // aUTF8 のインデクス
    while(iA < aUTF8.length){
        var bytes;
        var c = aUTF8[iA++];
        if((c & 0x80) == 0){
            bytes = 1; // 1バイト文字
        }
        else if((c & 0xe0) == 0xc0){
            bytes = 2; // 2バイト文字
            c &= 0x1f;
        }
        else if((c & 0xf0) == 0xe0){
            bytes = 3; // 3バイト文字
            c &= 0x0f;
        }
        else if((c & 0xf8) == 0xf0){
            bytes = 4; // 4バイト文字
            c &= 0x07;
        }
        else if((c & 0xfc) == 0xf8){
            bytes = 5; // 5バイト文字
            c &= 0x03;
        }
        else if((c & 0xfe) == 0xfc){
            bytes = 6; // 6バイト文字
            c &= 0x01;
        }
        else { // エラー
            bytes = 1;
            c = '?';
        }

        // 多バイト文字をデコード
        for(var i = 1; i < bytes; ++i){
            var t = aUTF8[iA++];
            if((t & 0xc0) == 0x80){
                c = (c << 6) + (t & 0x3f);
            }
            else{ // エラー
                c = '?';
                --iA;
            }
        }

        as[iS++] = String.fromCharCode(c);
    }

    return as.join('');
}


//____________________________________________________________________________
// スタートアップ

// 初回起動か調べつつ、ファイルを開く
var isVirgin = true;
for(var i = 1; /*forever*/ ; ++i){
    var s = Editor.GetLineStr(i);
    if(s == '') break;

    // ファイル名を取得
    if(s.search(/^([^\t]?)\t(.*)\t\*$/m) < 0) continue
    var sCheck = RegExp.$1;
    var sFile  = RegExp.$2;

    // ファイル名の行があるなら、初回でない
    isVirgin = false;

    // チェックされていれば開く
    if(sCheck != ''){
        Editor.FileOpen(sFile);
    }
}


// 初回起動なら、ファイルをリスト
if(isVirgin){
    ListMRU();
}

// eof
ななし
Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Trident/4.0; .NET CLR 1.1.4322; .NET CLR 2.0.50727; .NET CLR 3.0.04506.30; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)

[▼次のスレッド]
INCM/CMT
Cyclamen v3.81