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

Sukemaru (トーク | 投稿記録)
Sukemaru (トーク | 投稿記録)
修正
4行目: 4行目:


このマクロ(組み込み関数)では、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 ファイルの並び順が「保存された順 または 閉じた順」にならないことがあるので、このマクロで取得できる履歴の順番の正確さについては保証できません。
:ロースペックの XP (32bit, CPU 1コア) でテストしたかぎりでは、処理時間はそれほどかからないようでした([[使い方]] 例2のポップアップメニューで 0.03 ~ 0.05 秒ぐらい)。




32行目: 32行目:
   *  マクロなどで閉じられたファイルは Mery.his の並び順に反映されていないことがあるかも
   *  マクロなどで閉じられたファイルは Mery.his の並び順に反映されていないことがあるかも
   */
   */
 
<source lang="javascript">
<source lang="javascript">  
function LatestClosedFile( num ) {
function LatestClosedFile( num ) {
   var start = new Date(); // 所要時間計測(開始)
   var start = new Date(); // 所要時間計測(開始)
40行目: 39行目:
   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" );
49行目: 48行目:
   }
   }
   if ( ! Fso.FileExists( meryhis ) ) {
   if ( ! Fso.FileExists( meryhis ) ) {
     return closedFile;
     return closedFile; // "" を返す
   }
   }


64行目: 63行目:
   var hisArray = hisText.match( /^\[.+\]$/gm );
   var hisArray = hisText.match( /^\[.+\]$/gm );


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


73行目: 71行目:


   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 ++ ) {
85行目: 86行目:
       }
       }
       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>
</source>
100行目: 102行目:


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




112行目: 115行目:
</source>
</source>


 
<div id="ポップアップメニュー"></div>
;例2. 「さいごに閉じたファイル」5件 をポップアップメニューに表示する
;例2. 「さいごに閉じたファイル」5件 をポップアップメニューに表示する
※ LatestClosedFile( 5 ) の引数 '''5''' を増やせば表示する件数を増やせる。
<source lang="javascript">
<source lang="javascript">
var _latestClosed5 = LatestClosedFile( 5 );
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() 文は無用
    // 戻り値は配列ではなくフルパスの文字列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 ) であれば
138行目: 142行目:
}
}
</source>
</source>
== メモ ==
*2019/04/29 (sukemaru)
:*Mery.his が空だった場合など処理の修正(length = 0 の "" か [] を返すように)。
:*ループ処理に break を追加。
:*ロースペックの win xp (32bit, cpu 1コア, JScript 5.8) でテストしたかぎりでは、処理時間はそれほどかからないようだった([[使い方]] 例2の[[#ポップアップメニュー|ポップアップメニュー]]で 0.02 ~ 0.04 秒)。
スポンサーリンク