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

提供: MeryWiki
2019年10月22日 (火) 00:13時点におけるSukemaru (トーク | 投稿記録)による版 (ページを新規作成)
(差分) ← 古い版 | 最新版 (差分) | 新しい版 → (差分)
ナビゲーションに移動 検索に移動

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

ステータスバーに表示される 選択範囲の文字数・行数 の情報や、「文字数・行数・ヒット件数(選択文字列)」マクロや「バイト数」マクロによる追加情報、または「文字カウント」マクロなどを利用する機会が多い場合、「すべて選択 (Ctrl+A)」を実行して文書全体の文字数・行数などを確認したいときにキャレットやスクロール位置がスッ飛んでいってしまったり、選択範囲を解除したときにも同様のことが起こったりしてしまったりするので、スクロール位置とキャレット位置を元に戻す手間が必要でちょっと不便です。


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


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


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


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


ダウンロード

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


ソースコード

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

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

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

/**
 * すべて選択時にスクロールしない(※通常は文書の末尾までスクロールする)
 * 
 * 2019/10/21 【include 版】
 * ・「すべて選択」前のキャレット位置(または選択範囲)と
 *   スクロール位置の情報を 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)
   */
  var dPath = d.FullName || "無題";
  var anc = s.GetAnchorPos(),  act = s.GetActivePos();
  var sx = ScrollX,  sy = ScrollY;

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

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

  var list = setting.fileList;
  var infoExist = false;

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

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

    // リストに現在開かれていないファイルの情報があれば削除する
    else {
      var eCount = Editors.Count;
      var docus,  dCount,  filePath,  hit;
      DeleteLoop:
      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 ++ }
        }
      }		// end DeleteLoop:

      // リストから削除し、ループ処理の i をひとつ巻き戻す
      if ( ! hit ) { list.splice( i --, 1 ) }
    }
  }	// end ListLoop:

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

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


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

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

// 推奨割当:「Esc」

/**
 * 選択解除時にスクロールしない
 * 
 * 2019/10/21 【include 版】
 * ・「すべて選択」マクロ実行前のキャレット位置(または選択範囲)と
 *   スクロール位置の情報を 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 sx = ScrollX,  sy = ScrollY;

// 「すべて選択」状態のとき
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;

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

    // リストにファイル情報があれば
    if ( list[i][0] == dPath ) {
      infoExist = true;
      fileInfo = list[i];
      list.splice( i, 1 );	// リストからファイル情報を削除
      setting.fileList = list;
      IO.Serialize( setting, jsonName );	// JSON 書き込み

      /**
       * 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]);
        break Loop;
      }
      // テキストの文字数が異なるなら、選択解除 (スクロールしない)
      else {
        Restore( s.GetActivePos(), sx, sy );
        break Loop;
      }
    }
  }	// end Loop:
}

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

// 関数 Restore( activePos, scrollX, scrollY [, anchorPos] )
function Restore( act, sx, sy, anc ) {
  anc = anc >= 0 ? anc : act;
  editor.ActiveDocument.selection.SetActivePos( act );
  editor.ActiveDocument.selection.SetAnchorPos( anc );
  ScrollX = sx;  ScrollY = sy;
}
スポンサーリンク