「位置情報を保存してから「すべて選択/選択解除」(非スクロール)」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
第2版
Sukemaru (トーク | 投稿記録)
第3版。「【include 版】位置を復帰/保存」を追加
9行目: 9行目:


お好みでツールバー(マクロバー)アイコンに登録するか、キーボードショートカットに割りあててご利用下さい。<br>  
お好みでツールバー(マクロバー)アイコンに登録するか、キーボードショートカットに割りあててご利用下さい。<br>  
※ すでに [[キーアサイン集]] の「[[キーアサイン集#すべて選択 (非スクロール)|すべて選択 (非スクロール)]]」「[[キーアサイン集#選択範囲を解除 (非スクロール)|選択範囲を解除 (非スクロール)]]」マクロを導入している場合は、ソースコードをコピペして上書き保存するのがよいとおもいます。
※ すでに [[キーアサイン集]] の「[[キーアサイン集#すべて選択 (非スクロール)|すべて選択 (非スクロール)]]」「[[キーアサイン集#選択範囲を解除 (非スクロール)|選択範囲を解除 (非スクロール)]]」マクロを導入している場合は、当マクロのソースコードで上書き保存するのがよいとおもいます。




;【include版】 すべて選択 (非スクロール)
<div id="すべて選択">
:「すべて選択」を実行する前のキャレット位置とスクロール位置を保存してから「[[キーアサイン集#すべて選択 (非スクロール)|すべて選択 (非スクロール)]]」を実行します。<br> ※ 「すべて選択」前に選択範囲があった場合は、選択範囲の開始/終了位置を保存します。
;【include版】 すべて選択 (非スクロール)</div>
:*「すべて選択」を実行する前のキャレット位置とスクロール位置を保存してから「[[キーアサイン集#すべて選択 (非スクロール)|すべて選択 (非スクロール)]]」を実行します。<br> ※ 「すべて選択」前に選択範囲があった場合は、選択範囲の開始/終了位置を保存します。
:* 開いているタブごとに位置情報を保存し、すでに閉じられたタブの情報は逐次削除します。
:* 開いているタブごとに位置情報を保存し、すでに閉じられたタブの情報は逐次削除します。
:*「'''無題-<n>'''」タブの情報は <span style="background:#bfdfff;">ファイル名 = "無題"</span> として保存します。<br><span style="color:#c00;">※ 「選択解除」するまえに別の「無題-<m>」タブでこのマクロを実行すると "無題" の位置情報は上書きされます。</span>
:*「'''無題-<n>'''」タブの情報は <span style="background:#bfdfff;">ファイル名 = "無題"</span> として保存します。<br><span style="color:#c00;">※ 「選択解除」するまえに別の「無題-<m>」タブでこのマクロを実行すると "無題" の位置情報は上書きされます。</span>


;【include版】 選択範囲を解除 (非スクロール)
<div id="選択解除">
:「【include版】 すべて選択 (非スクロール)」マクロが保存した情報を利用して、キャレット位置とスクロール位置を復元します。<br> ※ 保存されている当該タブの情報は、このマクロの実行時に削除されます。
;【include版】 選択範囲を解除 (非スクロール)</div>
:*「【include版】 すべて選択 (非スクロール)」マクロが保存した位置情報がない場合は「[[キーアサイン集#選択範囲を解除 (非スクロール)|選択範囲を解除 (非スクロール)]]」を実行します。<br><span style="color:#0000c0;"> ※「すべて選択」状態を解除したときに復元された選択範囲は、このマクロをもう一度実行すると完全に解除されます。</span>
:*「すべて選択」の状態で実行したときのみ、「【include版】 すべて選択 (非スクロール)」マクロが保存した情報を利用して、キャレット位置とスクロール位置を復元します。<br> ※ 保存されている当該タブの情報は、このマクロの実行時に削除されます。
:*「【include版】 すべて選択 (非スクロール)」マクロが保存した位置情報がない場合は「[[キーアサイン集#選択範囲を解除 (非スクロール)|選択範囲を解除 (非スクロール)]]」を実行します。
:*<span style="color:#0000c0;"> ※「すべて選択」状態を解除したときに復元された選択範囲は、このマクロをもう一度実行すると完全に解除されます。</span>
:*ホイールスクロールなどによりキャレットが表示領域内にない状態、かつ「選択範囲なし」の状態で実行したときは、キャレットのある行まで画面をスクロールします。
<br>
<br>
<div class="warningbox">
<div class="warningbox">
* このふたつのマクロは、「[[includeライブラリ]]」を利用し、外部ファイル(JSON)に情報を保存/参照します。<br> あらかじめ「includeライブラリ」を Macros フォルダに配置してください。
* このページのマクロは、「[[includeライブラリ]]」を利用し、外部ファイル(JSON)に情報を保存/参照します。<br> あらかじめ「includeライブラリ」を Macros フォルダに配置してください。
* 外部ファイルの保存場所は '''Mery\Macros\MacroSettings\<すべて選択>.json''' <br> または '''%AppData%\Mery\MacroSettings\<すべて選択>.json''' です。
* 外部ファイルの保存場所は '''Mery\Macros\MacroSettings\<位置情報を保存>.json''' <br> または '''%AppData%\Mery\MacroSettings\<位置情報を保存>.json''' です。
* 環境によっては、外部ファイルへの書き込みの '''遅延''' などによりエラーが発生することがあるかもしれません。
* 環境によっては、外部ファイルへの書き込みの '''遅延''' などによりエラーが発生することがあるかもしれません。
</div>
</div>


:* JSON ファイルには、アクティブなタブの 「ファイルパス」 「全文字数」 「選択範囲の開始/終了位置」 「スクロール位置」 を保存します。<br> 複数のタブで「すべて選択」を実行している場合は、それぞれのタブの情報が保存されます。
:* JSON ファイルには、アクティブなタブの 「ファイルパス」 「全文字数」 「選択範囲の開始/終了位置」 「スクロール位置」 「行番号」 を保存します。<br> 複数のタブで「すべて選択」を実行している場合は、それぞれのタブの情報が保存されます。
:* JSON ファイルへのファイルアクセスが最小限になる仕様にしてあります。<br>また、「すべて選択」を実行したときに他のタブで開かれていないファイルの情報があれば、それらのファイル情報は逐次削除するので、JSON ファイルが肥大化することはありません。
:* JSON ファイルへのファイルアクセスが最小限になる仕様にしてあります。<br>また、「すべて選択」を実行したときに他のタブで開かれていないファイルの情報があれば、それらのファイル情報は逐次削除するので、JSON ファイルが肥大化することはありません。
※ [[#【include 版】位置を復帰/保存|選択範囲(キャレット位置)を保存/復帰するためのマクロ]] を追加しました。
:* 「任意の範囲選択状態」と「すべて選択状態」のトグル切り替えのさいに保存した位置情報を破棄せず、繰り返して「位置を復帰」の操作ができるようになります。




34行目: 42行目:


>> 「[[ファイル:【include 版】すべて選択/選択解除.zip]] (アイコン入り)」
>> 「[[ファイル:【include 版】すべて選択/選択解除.zip]] (アイコン入り)」
* 2019/10/21: 【include 版】の第1版
* 2019/10/21: 【include 版】の第1版
* 2019/10/27: 【include 版】の第2版(描画速度を微妙に改善)
* 2019/10/27: 【include 版】の第2版(描画速度を微妙に改善)
* 2019/11/13: 【include 版】の第3版
:* 「[[#【include 版】位置を復帰/保存|位置を復帰/保存]]」マクロを追加
:* マクロ追加により既存マクロのコードを微修正
:* JSON ファイル名の既定値を変更 「すべて選択」 → 「位置情報を保存」




== ソースコード ==
== ソースコード ==
=== 【include版】 すべて選択 (非スクロール) ===
=== 【include版】 すべて選択 (非スクロール) ===
<source lang="javascript">
<source lang="javascript" style="height:60em; overflow:auto;">
#title = "すべて選択"
#title = "すべて選択 (位置を保存・非スクロール)"
#tooltip = "すべて選択 (スクロールしない)"
#tooltip = "位置情報を保存してから すべて選択 (スクロールしない)"
#include "include/IO.js"
#include "include/IO.js"
#icon = "select_all.ico"
#icon = "select_all.ico"
50行目: 63行目:


/**
/**
  * すべて選択時にスクロールしない(※通常は文書の末尾までスクロールする)
  * sukemaru, 2019/10/21 - 2019/11/13 【include 版】
* 要:include ライブラリ
*
* ・「すべて選択」 前の選択範囲(キャレット位置)とスクロール位置などの
*  情報を JSON ファイルに書き出す。
*  → 「選択解除」 「位置を復帰」 マクロで、保存した位置情報に復元可。
* ※ すべて選択状態から「選択解除」マクロを実行(位置を復帰)すると、
*    当該ファイルの位置情報は JSON から削除される。
  *  
  *  
  * 2019/10/21 - 2019/10/27 【include 版】
  * ・JSON にはファイルパスごとに位置情報を保存する。
  * ・「すべて選択」前の選択範囲(キャレット位置)とスクロール位置の情報を
  * ・JSON のリストに現在開かれていないファイルの情報があれば削除する。
*  JSON ファイルに書き出す
*  → 「選択解除」マクロで、保存した位置情報を復元可
* ・現在開かれていないファイルの情報がリストにあれば削除する
  */
  */


62行目: 79行目:


// 位置情報の保存用ファイルのベース名
// 位置情報の保存用ファイルのベース名
var jsonName = "すべて選択";
var jsonName = "位置情報を保存";


   // ※「すべて選択」マクロと「選択解除」マクロで同一の名前を指定すること
   // ※ 「すべて選択」 「選択解除」 「位置を復帰」 マクロで同一の名前を指定すること
   // 保存先は… (e.g. "すべて選択" の場合)
   // 保存先は… (e.g. "位置情報を保存" の場合)
   // ・ポータブル版:   Mery\Macros\MacroSettings\すべて選択.json
   // ・ポータブル版: Mery\Macros\MacroSettings\位置情報を保存.json
   // ・インストール版: %AppData%\Mery\MacroSettings\すべて選択.json
   // ・インストール版: %AppData%\Mery\MacroSettings\位置情報を保存.json
    
    
// ---------- ▲ 設定項目 ▲ ----------
// ---------- ▲ 設定項目 ▲ ----------
78行目: 95行目:
   *  フルパス、文字数
   *  フルパス、文字数
   *  選択範囲の開始/終了位置(anc, act)
   *  選択範囲の開始/終了位置(anc, act)
   *  スクロール位置(sx, sy)
   *  スクロール位置(sx, sy)、アクティブ行(ay)
   */
   */
   var dPath = d.FullName || "無題";
   var dPath = d.FullName || "無題";
   var anc = s.GetAnchorPos(),  act = s.GetActivePos();
   var anc = s.GetAnchorPos(),  act = s.GetActivePos();
   var sx = ScrollX,  sy = ScrollY;
   var sx = ScrollX,  sy = ScrollY;
  var ay = s.GetActivePointY( mePosLogical );


   // すべて選択 (スクロールしない)
   // すべて選択 (スクロールしない)
   Redraw = false;
   Redraw = false;
   s.SetActivePos( 0 );  s.SetActivePos( dLength, true );
   s.SelectAll();
   ScrollX = sx;  ScrollY = sy;
   ScrollX = sx;  ScrollY = sy;
   Redraw = true;
   Redraw = true;


   var setting = { fileList: [] }
   var setting = { fileList: [] };
   setting = IO.Deserialize( setting, jsonName ); // JSON 読み込み
   setting = IO.Deserialize( setting, jsonName ); // JSON 読み込み
   var list = setting.fileList;
   var list = setting.fileList;
   var infoExist = false;
   var infoExist = false;


  ListLoop:
   for ( var i = 0, path; i < list.length; i ++ ) {
   for ( var i = 0, path; i < list.length; i ++ ) {
     path = list[i][0];
     path = list[i][0];
103行目: 119行目:
     if ( path == dPath ) {
     if ( path == dPath ) {
       infoExist = true;
       infoExist = true;
       list[i] = [ dPath, dLength, anc, act, sx, sy ];
       list[i] = [ dPath, dLength, anc, act, sx, sy, ay ];
     }
     }
     // リストに現在開かれていないファイルの情報があれば削除する
     // リストに現在開かれていないファイルの情報があれば削除する
     else {
     else {
       var eCount = Editors.Count;
       var eCount = Editors.Count;
       var docus,  dCount,  filePath,  hit;
       var docus,  dCount,  filePath,  hit;
      DeleteLoop:
       for ( var ee = 0, hit = 0; ee < eCount; ee ++ ) {
       for ( var ee = 0, hit = 0; ee < eCount; ee ++ ) {
         docus = Editors.Item( ee ).Documents;
         docus = Editors.Item( ee ).Documents;
118行目: 132行目:
           if ( path == filePath ) { hit ++ }
           if ( path == filePath ) { hit ++ }
         }
         }
       } // end DeleteLoop:
       }
 
      // リストから削除し、ループ処理の i をひとつ巻き戻す
       if ( ! hit ) { list.splice( i --, 1 ) }
       if ( ! hit ) { list.splice( i --, 1 ) }
     }
     }
   } // end ListLoop:
   }


   // リストにファイルの情報がなければ追加する
   // リストにファイルの情報がなければ追加する
   if ( ! infoExist ) {
   if ( ! infoExist ) {
     list.push( [ dPath, dLength, anc, act, sx, sy ] );
     list.push( [ dPath, dLength, anc, act, sx, sy, ay ] );
   }
   }


136行目: 148行目:


/*
/*
  JSON ファイルの初期値
* JSON ファイルの初期値
    {"fileList":[]}
* {"fileList":[]}
  */
  */
</source>
</source>
143行目: 155行目:


=== 【include版】 選択範囲を解除 (非スクロール) ===
=== 【include版】 選択範囲を解除 (非スクロール) ===
<source lang="javascript">
<source lang="javascript" style="height:60em; overflow:auto;">
#title = "選択解除"
#title = "選択解除 (位置を復帰・非スクロール)"
#tooltip = "範囲選択を解除 (スクロールしない)"
#tooltip = "範囲選択を解除 (スクロールしない) または 位置を復帰"
#include "include/IO.js"
#include "include/IO.js"
#icon = "selection_collapse.ico"
#icon = "selection_collapse.ico"
153行目: 165行目:


/**
/**
  * 選択解除時にスクロールしない
  * sukemaru, 2019/10/21 - 2019/11/13 【include 版】
* 要:include ライブラリ
  *  
  *  
* 2019/10/21 - 2019/10/27 【include 版】
  * ・「すべて選択」マクロ実行前の
  * ・「すべて選択」マクロ実行前の
  *   選択範囲(キャレット位置)とスクロール位置の情報を
  *   選択範囲(キャレット位置)とスクロール位置の情報を
  *  JSON ファイルから読み込んで復元する
  *  JSON ファイルから読みこんで復元する(位置を復帰)。
  * ・「すべて選択」以外の状態から実行したときは
* ・「すべて選択」以外の範囲選択状態から実行したときは
  *   スクロールなしで範囲選択を解除する
*    スクロールなしで範囲選択を解除する。
  * ・「範囲選択なし」の状態から実行したときはキャレット位置までスクロールする。
  *  
* ※「すべて選択」の状態から「位置を復帰」したときのみ
*    当該ファイルの位置情報を JSON から削除する。
  */
  */


166行目: 182行目:


// 位置情報の保存用ファイルのベース名
// 位置情報の保存用ファイルのベース名
var jsonName = "すべて選択";
var jsonName = "位置情報を保存";


   // ※「すべて選択」マクロと「選択解除」マクロで同一の名前を指定すること
   // ※ 「すべて選択」 「選択解除」 「位置を復帰」 マクロで同一の名前を指定すること
   // 保存先は… (e.g. "すべて選択" の場合)
   // 保存先は… (e.g. "位置情報を保存" の場合)
   // ・ポータブル版:   Mery\Macros\MacroSettings\すべて選択.json
   // ・ポータブル版: Mery\Macros\MacroSettings\位置情報を保存.json
   // ・インストール版: %AppData%\Mery\MacroSettings\すべて選択.json
   // ・インストール版: %AppData%\Mery\MacroSettings\位置情報を保存.json
    
    
// ---------- ▲ 設定項目 ▲ ----------
// ---------- ▲ 設定項目 ▲ ----------
177行目: 193行目:
var d = editor.ActiveDocument,  s = d.selection;
var d = editor.ActiveDocument,  s = d.selection;
var dText = d.Text,  dLength = dText.length;
var dText = d.Text,  dLength = dText.length;
var act = s.GetActivePos();
var sx = ScrollX,  sy = ScrollY;
var sx = ScrollX,  sy = ScrollY;
Redraw = false;


// 「すべて選択」状態のとき
// 「すべて選択」状態のとき
183行目: 201行目:
   var dPath = d.FullName || "無題";
   var dPath = d.FullName || "無題";


   var setting = { fileList: [] }
   var setting = { fileList: [] };
   setting = IO.Deserialize( setting, jsonName ); // JSON 読み込み
   setting = IO.Deserialize( setting, jsonName ); // JSON 読み込み


191行目: 209行目:
   var fileInfo;
   var fileInfo;


  Loop:
   for ( var i = 0; i < len; i ++ ) {
   for ( var i = 0; i < len; i ++ ) {


205行目: 222行目:
       *  スクロール位置(sx, sy)
       *  スクロール位置(sx, sy)
       */
       */
       // テキストの文字数が同じなら、選択範囲とスクロール位置を復帰
       // 文書の文字数が同じなら、選択範囲とスクロール位置を復元
       if ( fileInfo[1] == dLength ) {
       if ( fileInfo[1] == dLength ) {
         Restore( fileInfo[3], fileInfo[4], fileInfo[5], fileInfo[2]);
         Restore( fileInfo[3], fileInfo[4], fileInfo[5], fileInfo[2] );
       }
       }
       // テキストの文字数が異なるなら、選択解除 (スクロールしない)
       // 文書の文字数が異なるなら、選択解除 (スクロールしない)
       else {
       else {
         Restore( s.GetActivePos(), sx, sy );
         Restore( act, sx, sy );
       }
       }


218行目: 235行目:
       setting.fileList = list;
       setting.fileList = list;
       IO.Serialize( setting, jsonName ); // JSON 書き込み
       IO.Serialize( setting, jsonName ); // JSON 書き込み
       break Loop;
       break;
     }
     }
   } // end Loop:
   }
}
}


// 「すべて選択」以外の状態のときは、選択解除 (スクロールしない)
// 「すべて選択」以外の範囲選択状態のときは、選択解除 (スクロールしない)
if ( ! infoExist && s.Text ) {
if ( ! infoExist && s.Text ) {
   Restore( s.GetActivePos(), sx, sy );
   Restore( act, sx, sy );
}
}
// 「選択範囲なし」の状態のときは、キャレット位置までスクロールする
else if ( ! infoExist && s.IsEmpty ) {
  s.SelectLine();
  s.SetActivePos( act );
}
Redraw = true;


// 関数 Restore( activePos, scrollX, scrollY [, anchorPos] )
// 関数 Restore( activePos, scrollX, scrollY [, anchorPos] )
function Restore( act, sx, sy, anc ) {
function Restore( act, sx, sy, anc ) {
   anc = anc >= 0 ? anc : act;
   anc = anc >= 0 ? anc : act;
  editor.ActiveDocument.selection.SetActivePos( anc );
  editor.ActiveDocument.selection.SetActivePos( act, true );
  ScrollX = sx;  ScrollY = sy;
}
</source>
== 【include 版】位置を復帰/保存 ==
単純にキャレット位置(選択範囲)の情報を 保存/復元 するための 【自家用】 マクロです。<br>
ファイル内の閲覧のさいのスクロールや検索操作をする前などに、任意の位置(キャレット位置/選択範囲/アクティブ行)を一時保存し、任意のタイミングで復帰することができます。<br>
<span style="color:#c00;">ただし、「位置情報を保存」と「位置を復帰」のあいだに編集操作(文書全体の文字数の変化)があった場合、復帰先は '''保存したアクティブ行番号の行頭位置''' になります。</span><br>
: ※ 「[[#すべて選択|【include版】 すべて選択 (非スクロール)]]」マクロや「[[#選択解除|【include版】 選択範囲を解除 (非スクロール)]]」マクロと連携させて利用する前提で、位置情報保存用の JSON ファイルを共用します。
<div class="warningbox">
* このマクロは、「[[includeライブラリ]]」を利用し、外部ファイル(JSON)に情報を保存/参照します。<br> あらかじめ「includeライブラリ」を '''Mery\Macros''' フォルダに配置してください。
:* 外部ファイルの保存場所は '''Mery\Macros\MacroSettings\<位置情報を保存>.json''' <br> または '''%AppData%\Mery\MacroSettings\<位置情報を保存>.json''' です。
:* 環境によっては、外部ファイルへの書き込みの '''遅延''' などによりエラーが発生することがあるかもしれません。
:* 外部ファイルは「【include版】 すべて選択 (非スクロール)」「【include版】 選択範囲を解除 (非スクロール)」マクロと共用する前提にしてあります。
* このマクロは、「[[GetKeyState.exe(キー状態取得実行ファイル)]]」を使用します。
: あらかじめ ZIP ファイルをダウンロード・解凍して、実行ファイル「GetKeyState.exe」を '''Mery\Macros''' フォルダに配置してください。
</div>
* <span style="color:#0000c0;">Ctrl キーを押しながらこのマクロを実行したときは「'''位置情報を保存'''」します。</span>
: ※ ファイル名、文字数、選択範囲(キャレット位置)とスクロール位置などの情報を JSON ファイルに書き出します。
* <span style="color:#0000c0;">Ctrl キーを押さずにこのマクロを実行したときは「'''位置を復帰'''」します。</span>
: ※ Ctrl キーを押しながらこのマクロを実行して保存した位置情報か、「[[#すべて選択|【include版】 すべて選択 (非スクロール)]]」マクロ実行前のキャレット位置(選択範囲)を JSON ファイルから読みこんで復元します。
* JSON ファイルに保存された情報と文字数がことなるときは、保存された行番号(論理行)の行頭に復帰します。
: ※ 保存されたスクロール位置を復帰せず、キャレット位置までスクロールします。
*「位置を復帰」の前後でキャレット位置(選択範囲)に変化がないとき、または JSON ファイルに位置情報がないときは、キャレット位置までスクロールするだけです。
* 「位置を復帰」の動作では JSON ファイルに保存された位置情報を削除しません。
: ※ Ctrl キーを押しながらこのマクロを実行したとき、または「【include版】 すべて選択 (非スクロール)」マクロ実行時の「位置情報を保存」処理のさいに、開かれていないファイルの位置情報は JSON から削除されます。
* <span style="color:#c00;">このマクロには '''アクティブタブの位置情報を削除''' する機能はありません。</spn>
: このマクロで保存した位置情報を、当該ファイルのタブを閉じずに削除したい場合は、「【include版】 すべて選択 (非スクロール)」マクロと「【include版】 選択範囲を解除 (非スクロール)」マクロをつづけて実行してください。
: ※「すべて選択」の状態から「選択解除」マクロを実行すると(位置の復帰動作)、当該ファイルの位置情報は JSON から削除されます。
: ※ このマクロ単独で「位置情報を保存/位置を復帰」の運用をする場合、JSON から位置情報を削除するには、当該ファイルのタブを閉じた状態で <u>別のタブ上から「位置情報を保存」の操作</u> をするしかありません (Shift キー押し下げで「削除」という方法もありますが、実行時のタイムラグが大きくなるので保留)。
=== ソースコード ===
<source lang="javascript" style="height:60em; overflow:auto;">
#title = "位置を復帰/保存"
#tooltip = "選択範囲(カーソル位置)を復帰 または 位置情報を保存"
#include "include/IO.js"
#icon = "arrows_swap_vertical[1].ico"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",224
/**
* sukemaru, 2019/11/13 【include 版】
* 要:include ライブラリ
* 要: GetKeyState.exe
*
* ※ 能書きはソースコード末尾のコメントブロックに。
*/
// ---------- ▼ 設定項目 ▼ ----------
// ■ 位置情報の保存用ファイルのベース名
var jsonName = "位置情報を保存";
  // ※ 「すべて選択」 「選択解除」 「位置を復帰」 マクロで同一の名前を指定すること
  // 保存先は… (e.g. "位置情報を保存" の場合)
  // ・ポータブル版: Mery\Macros\MacroSettings\位置情報を保存.json
  // ・インストール版: %AppData%\Mery\MacroSettings\位置情報を保存.json
// ---------- ▲ 設定項目 ▲ ----------
var $ctrl = 0;
var getKeyState = editor.FullName.replace( /[^\\]+$/i , "" )
                + "Macros\\GetKeyState.exe";
var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
if ( Fso.FileExists( getKeyState ) ) {
  var WshShell = new ActiveXObject( "WScript.Shell" );
  $ctrl = WshShell.Run( "\"" + getKeyState + "\" ctrl", 0, true );
}
var d = editor.ActiveDocument,  s = d.selection;
var dPath = d.FullName || "無題";
var dText = d.Text,  dLength = dText.length;
var act = s.GetActivePos(),  anc = s.GetAnchorPos();
var sx = ScrollX,  sy = ScrollY;
var setting = { fileList: [] };
setting = IO.Deserialize( setting, jsonName ); // JSON 読み込み
var infoExist = false;
var list = setting.fileList;
var len = list.length;
// 位置を復帰
if ( $ctrl == 0 ) {
   Redraw = false;
   Redraw = false;
   editor.ActiveDocument.selection.SetActivePos( act );
 
  editor.ActiveDocument.selection.SetAnchorPos( anc );
   for ( var i = 0, fileInfo; i < len; i ++ ) {
  ScrollX = sx;  ScrollY = sy;
    fileInfo = list[i];
      /**
      * list[i] = [ dPath, dLength, anc, act, sx, sy, ay ]
      *  フルパス、文字数
      *  選択範囲の開始/終了位置(anc, act)
      *  スクロール位置(sx, sy)
      */
 
    // リストにファイル情報があれば
    if ( fileInfo[0] == dPath ) {
      infoExist = true;
 
      // 文書の文字数が同じなら、選択範囲(キャレット位置)を復元
      if ( fileInfo[1] == dLength ) {
        s.SetAnchorPos( fileInfo[2] );
        s.SetActivePos( fileInfo[3], true );
        ScrollX = fileInfo[4];
        ScrollY = fileInfo[5];
      }
      else {
        // 文書の文字数が異なるなら、行番号(行頭)に復帰
        s.SetActivePoint( mePosLogical, 1, fileInfo[6], false );
      }
      // 実行前と選択範囲が同じならスクロールする
      if ( s.GetActivePos() == act && s.GetAnchorPos() == anc ) {
        var yy = s.GetActivePointY( mePosView );
        ScrollY = yy;
        // var xx = s.GetActivePointX( mePosView );
        // ScrollX = xx;
      }
      break;
    }
  }
 
  // ファイル情報がないときは、キャレット位置までスクロールするだけ
  if ( ! infoExist ) {
    s.SetActivePos( anc );
    s.SetActivePos( act, true );
  }
 
   Redraw = true;
   Redraw = true;
}
}
// 位置情報を保存
else if ( $ctrl == 1 ) {
  /**
  *  フルパス、文字数
  *  選択範囲の開始/終了位置(anc, act)
  *  スクロール位置(sx, sy)、アクティブ行(ay)
  */
  var ay = s.GetActivePointY( mePosLogical );
  for ( var i = 0, path; i < list.length; i ++ ) {
    path = list[i][0];
    // リストにファイルの情報があれば書き換える
    if ( path == dPath ) {
      infoExist = true;
      list[i] = [ dPath, dLength, anc, act, sx, sy, ay ];
    }
    // リストに現在開かれていないファイルの情報があれば削除する
    else {
      var eCount = Editors.Count;
      var docus,  dCount,  filePath,  hit;
      for ( var ee = 0, hit = 0; ee < eCount; ee ++ ) {
        docus = Editors.Item( ee ).Documents;
        dCount = docus.Count;
        for ( var dd = 0; dd < dCount; dd ++ ) {
          filePath = docus.Item( dd ).FullName;
          if ( path == filePath ) { hit ++ }
        }
      }
      if ( ! hit ) { list.splice( i --, 1 ) }
    }
  }
  // リストにファイルの情報がなければ追加する
  if ( ! infoExist ) {
    list.push( [ dPath, dLength, anc, act, sx, sy, ay ] );
  }
  setting.fileList = list;
  IO.Serialize( setting, jsonName ); // JSON 書き込み
}
/**
* ・Ctrl キーを押しながらこのマクロを実行したときは「位置情報を保存」する。
*  ※ ファイル名、文字数、選択範囲(キャレット位置)とスクロール位置などの
*    情報を JSON ファイルに書き出す。
*
* ・Ctrl キーを押さずにこのマクロを実行したときは「位置を復帰」する。
*  ※ Ctrl キーを押しながらこのマクロを実行して保存した位置情報か、
*  「すべて選択」マクロ実行前のキャレット位置(選択範囲)を
*    JSON ファイルから読みこんで復元する。
*
* ・JSON ファイルに保存された情報と文字数がことなるときは、
*  保存された行番号(論理行)の行頭に復帰する。
*  ※ 保存されたスクロール位置を復帰せず、キャレット位置までスクロールする。
*
* ・「位置を復帰」の前後でキャレット位置(選択範囲)に変化がないとき、
*  または JSON ファイルに位置情報がないときは、
*  キャレット位置にスクロールするだけ。
*
* ・「位置を復帰」の動作では JSON ファイルに保存された位置情報を削除しない。
*  ※ Ctrl キーを押しながらこのマクロを実行したとき、
*    または「すべて選択」マクロ実行時の「位置情報を保存」処理のさいに、
*    開かれていないファイルの位置情報は JSON から削除される。
*
* ・このマクロで保存した位置情報を、当該ファイルのタブを閉じずに削除したい場合は、
*  「すべて選択」マクロと「選択解除」マクロをつづけて実行する。
*  ※「すべて選択」の状態から「選択解除」マクロを実行したとき(位置の復帰動作)
*    当該ファイルの位置情報は JSON から削除される。
*  ※ このマクロ単独で「位置情報を保存/位置を復帰」の運用をする場合、
*    JSON から位置情報を削除するには、当該ファイルのタブを閉じた状態で
*    別のタブ上から「位置情報を保存」操作をするしかない。
*/
</source>
</source>

2019年11月13日 (水) 23:20時点における版

【include 版】すべて選択/選択解除 (非スクロール)

「すべて選択 (Ctrl+A)」を実行してステータスバーで文書全体の文字数・行数などを確認したいときにキャレットやスクロール位置がスッ飛んでいってしまったり、選択範囲を解除したときにも同様のことが起こったりしてしまったりするので、状況によってはスクロール位置とキャレット位置を元に戻す手間が面倒です…。


以下のふたつのマクロを使って「すべて選択」/「選択範囲を解除」すると、無用なスクロールやキャレット移動がなくなります。
また、ふたつのマクロを交互に実行することで「任意の範囲選択状態」と「すべて選択状態」のトグル切り替えができます。


お好みでツールバー(マクロバー)アイコンに登録するか、キーボードショートカットに割りあててご利用下さい。
※ すでに キーアサイン集 の「すべて選択 (非スクロール)」「選択範囲を解除 (非スクロール)」マクロを導入している場合は、当マクロのソースコードで上書き保存するのがよいとおもいます。


【include版】 すべて選択 (非スクロール)
  • 「すべて選択」を実行する前のキャレット位置とスクロール位置を保存してから「すべて選択 (非スクロール)」を実行します。
    ※ 「すべて選択」前に選択範囲があった場合は、選択範囲の開始/終了位置を保存します。
  • 開いているタブごとに位置情報を保存し、すでに閉じられたタブの情報は逐次削除します。
  • 「無題-<n>」タブの情報は ファイル名 = "無題" として保存します。
    ※ 「選択解除」するまえに別の「無題-<m>」タブでこのマクロを実行すると "無題" の位置情報は上書きされます。
【include版】 選択範囲を解除 (非スクロール)
  • 「すべて選択」の状態で実行したときのみ、「【include版】 すべて選択 (非スクロール)」マクロが保存した情報を利用して、キャレット位置とスクロール位置を復元します。
    ※ 保存されている当該タブの情報は、このマクロの実行時に削除されます。
  • 「【include版】 すべて選択 (非スクロール)」マクロが保存した位置情報がない場合は「選択範囲を解除 (非スクロール)」を実行します。
  • ※「すべて選択」状態を解除したときに復元された選択範囲は、このマクロをもう一度実行すると完全に解除されます。
  • ホイールスクロールなどによりキャレットが表示領域内にない状態、かつ「選択範囲なし」の状態で実行したときは、キャレットのある行まで画面をスクロールします。


  • このページのマクロは、「includeライブラリ」を利用し、外部ファイル(JSON)に情報を保存/参照します。
    あらかじめ「includeライブラリ」を Macros フォルダに配置してください。
  • 外部ファイルの保存場所は Mery\Macros\MacroSettings\<位置情報を保存>.json
    または %AppData%\Mery\MacroSettings\<位置情報を保存>.json です。
  • 環境によっては、外部ファイルへの書き込みの 遅延 などによりエラーが発生することがあるかもしれません。
  • JSON ファイルには、アクティブなタブの 「ファイルパス」 「全文字数」 「選択範囲の開始/終了位置」 「スクロール位置」 「行番号」 を保存します。
    複数のタブで「すべて選択」を実行している場合は、それぞれのタブの情報が保存されます。
  • JSON ファイルへのファイルアクセスが最小限になる仕様にしてあります。
    また、「すべて選択」を実行したときに他のタブで開かれていないファイルの情報があれば、それらのファイル情報は逐次削除するので、JSON ファイルが肥大化することはありません。


※ 選択範囲(キャレット位置)を保存/復帰するためのマクロ を追加しました。

  • 「任意の範囲選択状態」と「すべて選択状態」のトグル切り替えのさいに保存した位置情報を破棄せず、繰り返して「位置を復帰」の操作ができるようになります。


ダウンロード

>> 「ファイル:【include 版】すべて選択/選択解除.zip (アイコン入り)」

  • 2019/10/21: 【include 版】の第1版
  • 2019/10/27: 【include 版】の第2版(描画速度を微妙に改善)
  • 2019/11/13: 【include 版】の第3版
  • 「位置を復帰/保存」マクロを追加
  • マクロ追加により既存マクロのコードを微修正
  • JSON ファイル名の既定値を変更 「すべて選択」 → 「位置情報を保存」


ソースコード

【include版】 すべて選択 (非スクロール)

#title = "すべて選択 (位置を保存・非スクロール)"
#tooltip = "位置情報を保存してから すべて選択 (スクロールしない)"
#include "include/IO.js"
#icon = "select_all.ico"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",111

// 推奨割当:「Ctrl + A」

/**
 * sukemaru, 2019/10/21 - 2019/11/13 【include 版】
 * 要:include ライブラリ
 * 
 * ・「すべて選択」 前の選択範囲(キャレット位置)とスクロール位置などの
 *   情報を JSON ファイルに書き出す。
 *   → 「選択解除」 「位置を復帰」 マクロで、保存した位置情報に復元可。
 * ※ すべて選択状態から「選択解除」マクロを実行(位置を復帰)すると、
 *    当該ファイルの位置情報は JSON から削除される。
 * 
 * ・JSON にはファイルパスごとに位置情報を保存する。
 * ・JSON のリストに現在開かれていないファイルの情報があれば削除する。
 */

// ---------- ▼ 設定項目 ▼ ----------

// 位置情報の保存用ファイルのベース名
var jsonName = "位置情報を保存";

  // ※ 「すべて選択」 「選択解除」 「位置を復帰」 マクロで同一の名前を指定すること
  // 保存先は…		(e.g. "位置情報を保存" の場合)
  // ・ポータブル版: Mery\Macros\MacroSettings\位置情報を保存.json
  // ・インストール版: %AppData%\Mery\MacroSettings\位置情報を保存.json
  
// ---------- ▲ 設定項目 ▲ ----------

var d = editor.ActiveDocument,  s = d.selection;
var dText = d.Text,  dLength = dText.length;

if ( s.Text.length != dLength ) {
  /**
   *  フルパス、文字数
   *  選択範囲の開始/終了位置(anc, act)
   *  スクロール位置(sx, sy)、アクティブ行(ay)
   */
  var dPath = d.FullName || "無題";
  var anc = s.GetAnchorPos(),  act = s.GetActivePos();
  var sx = ScrollX,  sy = ScrollY;
  var ay = s.GetActivePointY( mePosLogical );

  // すべて選択 (スクロールしない)
  Redraw = false;
  s.SelectAll();
  ScrollX = sx;  ScrollY = sy;
  Redraw = true;

  var setting = { fileList: [] };
  setting = IO.Deserialize( setting, jsonName );	// JSON 読み込み
  var list = setting.fileList;
  var infoExist = false;

  for ( var i = 0, path; i < list.length; i ++ ) {
    path = list[i][0];

    // リストにファイルの情報があれば書き換える
    if ( path == dPath ) {
      infoExist = true;
      list[i] = [ dPath, dLength, anc, act, sx, sy, ay ];
    }
    // リストに現在開かれていないファイルの情報があれば削除する
    else {
      var eCount = Editors.Count;
      var docus,  dCount,  filePath,  hit;
      for ( var ee = 0, hit = 0; ee < eCount; ee ++ ) {
        docus = Editors.Item( ee ).Documents;
        dCount = docus.Count;
        for ( var dd = 0; dd < dCount; dd ++ ) {
          filePath = docus.Item( dd ).FullName;
          if ( path == filePath ) { hit ++ }
        }
      }
      if ( ! hit ) { list.splice( i --, 1 ) }
    }
  }

  // リストにファイルの情報がなければ追加する
  if ( ! infoExist ) {
    list.push( [ dPath, dLength, anc, act, sx, sy, ay ] );
  }

  setting.fileList = list;
  IO.Serialize( setting, jsonName );	// JSON 書き込み
}


/*
 * JSON ファイルの初期値
 * {"fileList":[]}
 */


【include版】 選択範囲を解除 (非スクロール)

#title = "選択解除 (位置を復帰・非スクロール)"
#tooltip = "範囲選択を解除 (スクロールしない) または 位置を復帰"
#include "include/IO.js"
#icon = "selection_collapse.ico"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",212

// 推奨割当:「Esc」

/**
 * sukemaru, 2019/10/21 - 2019/11/13 【include 版】
 * 要:include ライブラリ
 * 
 * ・「すべて選択」マクロ実行前の
 *    選択範囲(キャレット位置)とスクロール位置の情報を
 *   JSON ファイルから読みこんで復元する(位置を復帰)。
 * ・「すべて選択」以外の範囲選択状態から実行したときは
 *    スクロールなしで範囲選択を解除する。
 * ・「範囲選択なし」の状態から実行したときはキャレット位置までスクロールする。
 * 
 * ※「すべて選択」の状態から「位置を復帰」したときのみ
 *    当該ファイルの位置情報を JSON から削除する。
 */

// ---------- ▼ 設定項目 ▼ ----------

// 位置情報の保存用ファイルのベース名
var jsonName = "位置情報を保存";

  // ※ 「すべて選択」 「選択解除」 「位置を復帰」 マクロで同一の名前を指定すること
  // 保存先は…		(e.g. "位置情報を保存" の場合)
  // ・ポータブル版: Mery\Macros\MacroSettings\位置情報を保存.json
  // ・インストール版: %AppData%\Mery\MacroSettings\位置情報を保存.json
  
// ---------- ▲ 設定項目 ▲ ----------

var d = editor.ActiveDocument,  s = d.selection;
var dText = d.Text,  dLength = dText.length;
var act = s.GetActivePos();
var sx = ScrollX,  sy = ScrollY;
Redraw = false;

// 「すべて選択」状態のとき
if ( s.Text.length == dLength ) {
  var dPath = d.FullName || "無題";

  var setting = { fileList: [] };
  setting = IO.Deserialize( setting, jsonName );	// JSON 読み込み

  var list = setting.fileList;
  var len = list.length;
  var infoExist = false;
  var fileInfo;

  for ( var i = 0; i < len; i ++ ) {

    // リストにファイル情報があれば
    if ( list[i][0] == dPath ) {
      infoExist = true;
      fileInfo = list[i];

      /**
       * list[i] = [ dPath, dLength, anc, act, sx, sy ]
       *  フルパス、文字数
       *  選択範囲の開始/終了位置(anc, act)
       *  スクロール位置(sx, sy)
       */
      // 文書の文字数が同じなら、選択範囲とスクロール位置を復元
      if ( fileInfo[1] == dLength ) {
        Restore( fileInfo[3], fileInfo[4], fileInfo[5], fileInfo[2] );
      }
      // 文書の文字数が異なるなら、選択解除 (スクロールしない)
      else {
        Restore( act, sx, sy );
      }

      // リストからファイル情報を削除
      list.splice( i, 1 );
      setting.fileList = list;
      IO.Serialize( setting, jsonName );	// JSON 書き込み
      break;
    }
  }
}

// 「すべて選択」以外の範囲選択状態のときは、選択解除 (スクロールしない)
if ( ! infoExist && s.Text ) {
  Restore( act, sx, sy );
}

// 「選択範囲なし」の状態のときは、キャレット位置までスクロールする
else if ( ! infoExist && s.IsEmpty ) {
  s.SelectLine();
  s.SetActivePos( act );
}

Redraw = true;


// 関数 Restore( activePos, scrollX, scrollY [, anchorPos] )
function Restore( act, sx, sy, anc ) {
  anc = anc >= 0 ? anc : act;
  editor.ActiveDocument.selection.SetActivePos( anc );
  editor.ActiveDocument.selection.SetActivePos( act, true );
  ScrollX = sx;  ScrollY = sy;
}


【include 版】位置を復帰/保存

単純にキャレット位置(選択範囲)の情報を 保存/復元 するための 【自家用】 マクロです。
ファイル内の閲覧のさいのスクロールや検索操作をする前などに、任意の位置(キャレット位置/選択範囲/アクティブ行)を一時保存し、任意のタイミングで復帰することができます。
ただし、「位置情報を保存」と「位置を復帰」のあいだに編集操作(文書全体の文字数の変化)があった場合、復帰先は 保存したアクティブ行番号の行頭位置 になります。

※ 「【include版】 すべて選択 (非スクロール)」マクロや「【include版】 選択範囲を解除 (非スクロール)」マクロと連携させて利用する前提で、位置情報保存用の JSON ファイルを共用します。
  • このマクロは、「includeライブラリ」を利用し、外部ファイル(JSON)に情報を保存/参照します。
    あらかじめ「includeライブラリ」を Mery\Macros フォルダに配置してください。
  • 外部ファイルの保存場所は Mery\Macros\MacroSettings\<位置情報を保存>.json
    または %AppData%\Mery\MacroSettings\<位置情報を保存>.json です。
  • 環境によっては、外部ファイルへの書き込みの 遅延 などによりエラーが発生することがあるかもしれません。
  • 外部ファイルは「【include版】 すべて選択 (非スクロール)」「【include版】 選択範囲を解除 (非スクロール)」マクロと共用する前提にしてあります。
あらかじめ ZIP ファイルをダウンロード・解凍して、実行ファイル「GetKeyState.exe」を Mery\Macros フォルダに配置してください。
  • Ctrl キーを押しながらこのマクロを実行したときは「位置情報を保存」します。
※ ファイル名、文字数、選択範囲(キャレット位置)とスクロール位置などの情報を JSON ファイルに書き出します。
  • Ctrl キーを押さずにこのマクロを実行したときは「位置を復帰」します。
※ Ctrl キーを押しながらこのマクロを実行して保存した位置情報か、「【include版】 すべて選択 (非スクロール)」マクロ実行前のキャレット位置(選択範囲)を JSON ファイルから読みこんで復元します。
  • JSON ファイルに保存された情報と文字数がことなるときは、保存された行番号(論理行)の行頭に復帰します。
※ 保存されたスクロール位置を復帰せず、キャレット位置までスクロールします。
  • 「位置を復帰」の前後でキャレット位置(選択範囲)に変化がないとき、または JSON ファイルに位置情報がないときは、キャレット位置までスクロールするだけです。
  • 「位置を復帰」の動作では JSON ファイルに保存された位置情報を削除しません。
※ Ctrl キーを押しながらこのマクロを実行したとき、または「【include版】 すべて選択 (非スクロール)」マクロ実行時の「位置情報を保存」処理のさいに、開かれていないファイルの位置情報は JSON から削除されます。
  • このマクロには アクティブタブの位置情報を削除 する機能はありません。</spn>
このマクロで保存した位置情報を、当該ファイルのタブを閉じずに削除したい場合は、「【include版】 すべて選択 (非スクロール)」マクロと「【include版】 選択範囲を解除 (非スクロール)」マクロをつづけて実行してください。
※「すべて選択」の状態から「選択解除」マクロを実行すると(位置の復帰動作)、当該ファイルの位置情報は JSON から削除されます。
※ このマクロ単独で「位置情報を保存/位置を復帰」の運用をする場合、JSON から位置情報を削除するには、当該ファイルのタブを閉じた状態で 別のタブ上から「位置情報を保存」の操作 をするしかありません (Shift キー押し下げで「削除」という方法もありますが、実行時のタイムラグが大きくなるので保留)。


ソースコード

#title = "位置を復帰/保存"
#tooltip = "選択範囲(カーソル位置)を復帰 または 位置情報を保存"
#include "include/IO.js"
#icon = "arrows_swap_vertical[1].ico"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",224

/**
 * sukemaru, 2019/11/13 【include 版】
 * 要:include ライブラリ
 * 要: GetKeyState.exe
 * 
 * ※ 能書きはソースコード末尾のコメントブロックに。
 */

// ---------- ▼ 設定項目 ▼ ----------

// ■ 位置情報の保存用ファイルのベース名
var jsonName = "位置情報を保存";

  // ※ 「すべて選択」 「選択解除」 「位置を復帰」 マクロで同一の名前を指定すること
  // 保存先は…		(e.g. "位置情報を保存" の場合)
  // ・ポータブル版: Mery\Macros\MacroSettings\位置情報を保存.json
  // ・インストール版: %AppData%\Mery\MacroSettings\位置情報を保存.json

// ---------- ▲ 設定項目 ▲ ----------

var $ctrl = 0;
var getKeyState = editor.FullName.replace( /[^\\]+$/i , "" )
                + "Macros\\GetKeyState.exe";
var Fso = new ActiveXObject( "Scripting.FileSystemObject" );
if ( Fso.FileExists( getKeyState ) ) {
  var WshShell = new ActiveXObject( "WScript.Shell" );
  $ctrl = WshShell.Run( "\"" + getKeyState + "\" ctrl", 0, true );
}

var d = editor.ActiveDocument,  s = d.selection;
var dPath = d.FullName || "無題";
var dText = d.Text,  dLength = dText.length;
var act = s.GetActivePos(),  anc = s.GetAnchorPos();
var sx = ScrollX,  sy = ScrollY;

var setting = { fileList: [] };
setting = IO.Deserialize( setting, jsonName );	// JSON 読み込み
var infoExist = false;

var list = setting.fileList;
var len = list.length;

// 位置を復帰
if ( $ctrl == 0 ) {
  Redraw = false;

  for ( var i = 0, fileInfo; i < len; i ++ ) {
    fileInfo = list[i];
      /**
       * list[i] = [ dPath, dLength, anc, act, sx, sy, ay ]
       *  フルパス、文字数
       *  選択範囲の開始/終了位置(anc, act)
       *  スクロール位置(sx, sy)
       */

    // リストにファイル情報があれば
    if ( fileInfo[0] == dPath ) {
      infoExist = true;

      // 文書の文字数が同じなら、選択範囲(キャレット位置)を復元
      if ( fileInfo[1] == dLength ) {
        s.SetAnchorPos( fileInfo[2] );
        s.SetActivePos( fileInfo[3], true );
        ScrollX = fileInfo[4];
        ScrollY = fileInfo[5];
      }
      else {
        // 文書の文字数が異なるなら、行番号(行頭)に復帰
        s.SetActivePoint( mePosLogical, 1, fileInfo[6], false );
      }
      // 実行前と選択範囲が同じならスクロールする
      if ( s.GetActivePos() == act && s.GetAnchorPos() == anc ) {
        var yy = s.GetActivePointY( mePosView );
        ScrollY = yy;
        // var xx = s.GetActivePointX( mePosView );
        // ScrollX = xx;
      }
      break;
    }
  }

  // ファイル情報がないときは、キャレット位置までスクロールするだけ
  if ( ! infoExist  ) {
    s.SetActivePos( anc );
    s.SetActivePos( act, true );
  }

  Redraw = true;
}

// 位置情報を保存
else if ( $ctrl == 1 ) {
  /**
   *  フルパス、文字数
   *  選択範囲の開始/終了位置(anc, act)
   *  スクロール位置(sx, sy)、アクティブ行(ay)
   */
  var ay = s.GetActivePointY( mePosLogical );
  for ( var i = 0, path; i < list.length; i ++ ) {
    path = list[i][0];

    // リストにファイルの情報があれば書き換える
    if ( path == dPath ) {
      infoExist = true;
      list[i] = [ dPath, dLength, anc, act, sx, sy, ay ];
    }

    // リストに現在開かれていないファイルの情報があれば削除する
    else {
      var eCount = Editors.Count;
      var docus,  dCount,  filePath,  hit;
      for ( var ee = 0, hit = 0; ee < eCount; ee ++ ) {
        docus = Editors.Item( ee ).Documents;
        dCount = docus.Count;
        for ( var dd = 0; dd < dCount; dd ++ ) {
          filePath = docus.Item( dd ).FullName;
          if ( path == filePath ) { hit ++ }
        }
      }
      if ( ! hit ) { list.splice( i --, 1 ) }
    }
  }

  // リストにファイルの情報がなければ追加する
  if ( ! infoExist ) {
    list.push( [ dPath, dLength, anc, act, sx, sy, ay ] );
  }

  setting.fileList = list;
  IO.Serialize( setting, jsonName );	// JSON 書き込み
}


/**
 * ・Ctrl キーを押しながらこのマクロを実行したときは「位置情報を保存」する。
 *  ※ ファイル名、文字数、選択範囲(キャレット位置)とスクロール位置などの
 *    情報を JSON ファイルに書き出す。
 * 
 * ・Ctrl キーを押さずにこのマクロを実行したときは「位置を復帰」する。
 *  ※ Ctrl キーを押しながらこのマクロを実行して保存した位置情報か、
 *   「すべて選択」マクロ実行前のキャレット位置(選択範囲)を
 *    JSON ファイルから読みこんで復元する。
 * 
 * ・JSON ファイルに保存された情報と文字数がことなるときは、
 *   保存された行番号(論理行)の行頭に復帰する。
 *  ※ 保存されたスクロール位置を復帰せず、キャレット位置までスクロールする。
 * 
 * ・「位置を復帰」の前後でキャレット位置(選択範囲)に変化がないとき、
 *   または JSON ファイルに位置情報がないときは、
 *   キャレット位置にスクロールするだけ。
 * 
 * ・「位置を復帰」の動作では JSON ファイルに保存された位置情報を削除しない。
 *  ※ Ctrl キーを押しながらこのマクロを実行したとき、
 *     または「すべて選択」マクロ実行時の「位置情報を保存」処理のさいに、
 *     開かれていないファイルの位置情報は JSON から削除される。
 * 
 * ・このマクロで保存した位置情報を、当該ファイルのタブを閉じずに削除したい場合は、
 *   「すべて選択」マクロと「選択解除」マクロをつづけて実行する。
 *  ※「すべて選択」の状態から「選択解除」マクロを実行したとき(位置の復帰動作)
 *     当該ファイルの位置情報は JSON から削除される。
 *  ※ このマクロ単独で「位置情報を保存/位置を復帰」の運用をする場合、
 *     JSON から位置情報を削除するには、当該ファイルのタブを閉じた状態で
 *     別のタブ上から「位置情報を保存」操作をするしかない。
 */
スポンサーリンク