◀マクロトップへ
  • 475 最近使ったファイルを開く
  • [475] 最近使ったファイルを開く ななし 2009年08月20日 23:25

    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