「さいごに閉じたファイル を参照する」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
編集の要約なし
MSY-07 (トーク | 投稿記録)
空行の除去
 
(3人の利用者による、間の6版が非表示)
1行目: 1行目:
<div>__TOC__</div>
<div>__TOC__</div>
[[ヘルプ:ファイル#最近のファイル|ファイルメニュー]] では「最近開いたファイルの履歴」が表示されますが、タブをたくさん並べているときには「現在開いているファイル」ばかりが表示されがちです。


[[ヘルプ:ファイル#最近のファイル|ファイルメニュー]] では「最近開いたファイルの履歴」が表示されますが、現在開いているファイルばかりが表示されがちです。
このマクロ(組み込み関数)では、Mery.ini ファイルに記録されている「最近開いたファイルの履歴」ではなく、<b style="color:#0000c0;"> Mery.his </b> ファイルに記録されている履歴情報を読み込み、「現在開いているファイル」を除いて、後ろから順にファイルパスを取得します。


このマクロ(組み込み関数)では、Mery.ini ファイルに記録されている「最近開いたファイルの履歴」ではなく、<b style="color:#0000c0;"> Mery.his </b> ファイルに記録されている履歴情報を読み込み、「現在開いているファイル」を除いて、後ろから順にファイルパスを取得します。
*ファイルの実在確認の処理を入れてあるので、削除・移動・リネームされたファイルは含めません。


*<span style="color:#c00;"> Mery の「オプション」設定の「履歴」グループで「'''カーソル位置とブックマークを保存する'''」が無効の場合は、Mery.his ファイルを参照できないので '''""''' を返します。</span>
*<span style="color:#c00;"> Mery の「オプション」設定の「履歴」グループで「'''カーソル位置とブックマークを保存する'''」が無効の場合は、Mery.his ファイルを参照できないので '''""''' を返します。</span>
*通常の操作でタブを閉じず、「[[すべて閉じる]]」マクロなどでタブを閉じた場合、Mery.his ファイルの並び順が「保存された順 または 閉じた順」にならないことがあるので、このマクロで取得できる履歴の順番の正確さについては保証できません。
*通常の操作でタブを閉じず、「[[すべて閉じる]]」マクロなどでタブを閉じた場合、Mery.his ファイルの並び順が「保存された順 または 閉じた順」にならないことがあるので、このマクロで取得できる履歴の順番の正確さについては保証できません。


== 組み込み関数 LatestClosedFile() ==
== 組み込み関数 LatestClosedFile() ==
[[includeライブラリ]] を導入(#include "include/IO.js" #include "include/MryInfo.js")したマクロで利用する前提なら前半部分「Mery.his をさがす」「Mery.his を読み込む」のコードを圧縮することもできますが、あえて include なしで使えるようにしてあります(処理手続きはおなじなので、処理速度に差はないとおもいます)。
[[includeライブラリ]] を導入(#include "include/IO.js" #include "include/MryInfo.js")したマクロで利用する前提なら前半部分「Mery.his をさがす」「Mery.his を読み込む」のコードを圧縮することもできますが、あえて include なしで使えるようにしてあります(処理手続きはおなじなので、動作速度に差はないはず)。
 
<source lang="javascript">
// #title = "さいごに閉じたファイル"
// #tooltip = "「さいごに閉じたファイル」のフルパスを返す"
 
/**
* 関数 LatestClosedFile( num )
* Mery.his を読み込んで「さいごに閉じたファイル」のフルパスを返す
*
* 引数 num: 「さいごに閉じたファイル」の件数を指定
*    1 を指定した場合または省略した場合は、1件のフルパスを文字列で返す
*    2 以上の数値を指定した場合は、配列で返す
*     
* ※ Mery の「オプション」設定で「カーソル位置とブックマークを保存する」
*  が無効(Mery.his がない)なら "" を返す
* ※ Mery.his を下から順にチェックするだけなので
*  マクロなどで閉じられたファイルは Mery.his の並び順に反映されていないことがあるかも
*/


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


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


51行目: 51行目:
   var Adodb = new ActiveXObject( "ADODB.Stream" );
   var Adodb = new ActiveXObject( "ADODB.Stream" );
   var adTypeText = 2,  adReadAll = -1;
   var adTypeText = 2,  adReadAll = -1;
   Adodb.Type = adTypeText;
   Adodb.Type = adTypeTextAdodb.Charset = "UTF-8";
  Adodb.Charset = "UTF-8";
   Adodb.Open();
   Adodb.Open();
   Adodb.LoadFromFile( meryhis );
   Adodb.LoadFromFile( meryhis );
61行目: 60行目:
   var hisArray = hisText.match( /^\[.+\]$/gm );
   var hisArray = hisText.match( /^\[.+\]$/gm );


  var hCount = hisArray.length;
   if ( ! hisArray ) {
   if ( ! hCount ) {
     return closedFile; // "" を返す
     return closedFile;
   }
   }


70行目: 68行目:


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


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


== 使い方 ==
== 使い方 ==
例2 のポップアップメニューは「[[ファイルを読み直す・開きなおす]]」マクロにも搭載してあります。(2019/04/28)
例2 のポップアップメニューは「[[ファイルを読み直す・開きなおす]]」マクロ(2019/04/28)にも搭載してあります。
 
 
<source lang="javascript">
/* 例1. 「さいごに閉じたファイル」を3件 取得する */


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


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


Alert( "さいごに閉じたファイル: \n\n" + latestClosed3.join( "\n" ) );
Alert( "さいごに閉じたファイル: \n\n" + _latestClosed3.join( "\n" ) );
</source>
</syntaxhighlight>


<source lang="javascript">
<div id="ポップアップメニュー"></div>
/* 例2. 「さいごに閉じたファイル」5件 をポップアップメニューに表示する */
;例2. 「さいごに閉じたファイル」5件 をポップアップメニューに表示する
 
※ LatestClosedFile( 5 ) の引数 '''5''' を増やせば表示する件数を増やせる。
var _latestClosed5 = LatestClosedFile( 5 );
<syntaxhighlight lang="javascript">
var _latestClosed = LatestClosedFile( 5 );


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


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


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


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


  // ※ LatestClosedFile() または LatestClosedFile( 1 ) であれば
    // ※ LatestClosedFile() または LatestClosedFile( 1 ) であれば
  // editor.OpenFile( LatestClosedFile() );
    // editor.OpenFile( LatestClosedFile() );
}
}
</source>
</syntaxhighlight>
 
== メモ ==
*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)
:*「[[さいごに閉じたファイルを開く]]」のページに移設

2024年9月9日 (月) 09:47時点における最新版

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

このマクロ(組み込み関数)では、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)
スポンサーリンク