さいごに閉じたファイル を参照する

提供: MeryWiki
移動先: 案内検索

ファイルメニュー では「最近開いたファイルの履歴」が表示されますが、タブをたくさん並べているときには「現在開いているファイル」ばかりが表示されがちです。

このマクロ(組み込み関数)では、Mery.ini ファイルに記録されている「最近開いたファイルの履歴」ではなく、 Mery.his ファイルに記録されている履歴情報を読み込み、「現在開いているファイル」を除いて、後ろから順にファイルパスを取得します。


  • ファイルの実在確認の処理を入れてあるので、削除・移動・リネームされたファイルは含めません。
  • Mery の「オプション」設定の「履歴」グループで「カーソル位置とブックマークを保存する」が無効の場合は、Mery.his ファイルを参照できないので "" を返します。
  • 通常の操作でタブを閉じず、「すべて閉じる」マクロなどでタブを閉じた場合、Mery.his ファイルの並び順が「保存された順 または 閉じた順」にならないことがあるので、このマクロで取得できる履歴の順番の正確さについては保証できません。


組み込み関数 LatestClosedFile()[編集]

includeライブラリ を導入(#include "include/IO.js" #include "include/MryInfo.js")したマクロで利用する前提なら前半部分「Mery.his をさがす」「Mery.his を読み込む」のコードを圧縮することもできますが、あえて include なしで使えるようにしてあります(処理手続きはおなじなので、動作速度に差はないはず)。

// #title = "さいごに閉じたファイル"
// #tooltip = "「さいごに閉じたファイル」のフルパスを返す"

/**
 * 関数 LatestClosedFile( num )
 * Mery.his を読み込んで「さいごに閉じたファイル」のフルパスを返す
 * 
 * 引数 num: 「さいごに閉じたファイル」の件数を指定
 *     1 を指定した場合または省略した場合は、1件のフルパスを文字列で返す
 *     2 以上の数値を指定した場合は、配列で返す
 *       
 * ※ Mery の「オプション」設定で「カーソル位置とブックマークを保存する」
 *   が無効(Mery.his がない)なら "" を返す
 * ※ Mery.his を下から順にチェックするだけなので
 *   マクロなどで閉じられたファイルは Mery.his の並び順に反映されていないことがあるかも
 */
function LatestClosedFile( num ) {
  var start = new Date();	// 所要時間計測(開始)
  var closedFile = "";
  var closedFileArray = [];
  var num = num ? num : 1;

  // Mery.his をさがす (ポータブル / %APPDATA% )
  var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
  var meryhis = editor.FullName.replace( /\.exe$/i , ".his" );
  if ( ! Fso.FileExists( meryhis ) ) {
    meryhis = new ActiveXObject( "WScript.Shell" )
              .ExpandEnvironmentStrings( "%APPDATA%" )
            + "\\Mery\\Mery.his";
  }
  if ( ! Fso.FileExists( meryhis ) ) {
    return closedFile;	// "" を返す
  }

  // Mery.his を読みこむ
  var Adodb = new ActiveXObject( "ADODB.Stream" );
  var adTypeText = 2,  adReadAll = -1;
  Adodb.Type = adTypeText,  Adodb.Charset = "UTF-8";
  Adodb.Open();
  Adodb.LoadFromFile( meryhis );
  var hisText = Adodb.ReadText( adReadAll ).replace( /\r\n?/g, "\n" );
  Adodb.Close();

  // Mery.his からファイルパスを抽出する
  var hisArray = hisText.match( /^\[.+\]$/gm );

  if ( ! hisArray ) {
    return closedFile;	// "" を返す
  }

  // 履歴のファイルパスをうしろから順にチェックして
  // 現在開いているファイルにないものを「さいごに閉じたファイル」とする

  hisArray.reverse();
  var hCount = hisArray.length;
  var eCount = Editors.Count;
  var dCount, cCount, file, hit;
  outerLoop:
  for ( var i = 0; i < hCount || cCount < num; i ++ ) {
    closedFile = hisArray[i].replace( /^\[|\]$/g, "" );
    for ( var ee = 0; ee < eCount; ee ++ ) {
      dCount = Editors.Item( ee ).Documents.Count;
      for ( var dd = 0, hit = 0; dd < dCount; dd ++ ) {
        file = Editors.Item( ee ).Documents.Item( dd ).FullName;
        if ( closedFile == file ) {
          hit ++;
        }
      }
      cCount = closedFileArray.length;
      if ( ! hit && cCount < num && Fso.FileExists( closedFile ) ) {
        closedFileArray.push( closedFile );
      }
      if ( cCount == num ) {
        break outerLoop;
      }
    }
  }

  Status = "[ " + ( ( new Date() - start ) / 1000 ).toFixed( 3 ) + " 秒 ]";
  return num == 1 ? ( closedFileArray[0] || "" ) : closedFileArray;
}


使い方[編集]

例2 のポップアップメニューは「ファイルを読み直す・開きなおす」マクロ(2019/04/28)にも搭載してあります。


例1. 「さいごに閉じたファイル」を3件 取得する
var _latestClosed3 = LatestClosedFile( 3 );

OutputBar.Writeln( "さいごに閉じたファイル: \n" + _latestClosed3 );

Alert( "さいごに閉じたファイル: \n\n" + _latestClosed3.join( "\n" ) );
例2. 「さいごに閉じたファイル」5件 をポップアップメニューに表示する

※ LatestClosedFile( 5 ) の引数 5 を増やせば表示する件数を増やせる。

var _latestClosed = LatestClosedFile( 5 );

var menu = CreatePopupMenu();
menu.Add( "▼ さいごに閉じたファイル ▼", 0, meMenuGrayed );

for ( var i = 0; i < _latestClosed.length; i ++ ) {
  // 「連番: 親フォルダ名\ ファイル名」に切りつめる
  menu.Add( "&" + ( i + 1 ) + ":  " + _latestClosed[i].replace( /(?:.+\\)*([^\\]+\\)([^\\]+)$/, "$1 $2" ), i + 1 )
}

    // ※ LatestClosedFile() または LatestClosedFile( 1 ) であれば
    // 戻り値は配列ではなくフルパスの文字列1件だけなので for() 文は無用
    // menu.Add( "&1:  " + LatestClosedFile().replace( /(?:.+\\)*([^\\]+\\)([^\\]+)$/, "$1 $2" ), 1 );

var r = menu.Track( mePosMouse );
if ( r > 0 ) {
  editor.NewFile();
  editor.OpenFile( _latestClosed[ r - 1 ] );

    // ※ LatestClosedFile() または LatestClosedFile( 1 ) であれば
    // editor.OpenFile( LatestClosedFile() );
}


メモ[編集]

  • 2019/04/29 (sukemaru)
  • Mery.his が空だった場合など処理の修正(length = 0 の "" か [] を返すように)。
  • ループ処理に break を追加。
  • ロースペックの win xp (32bit, cpu 1コア, JScript 5.8) でテストしたかぎりでは、処理時間はそれほどかからないようだった(使い方 例2のポップアップメニューで 0.02 ~ 0.04 秒)。
  • 2019/04/30 (sukemaru)
スポンサーリンク