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

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
ページを新規作成
 
Sukemaru (トーク | 投稿記録)
第2版
1行目: 1行目:
== 【include 版】すべて選択/選択解除 (非スクロール) ==
== 【include 版】すべて選択/選択解除 (非スクロール) ==


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




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




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




13行目: 15行目:
:「すべて選択」を実行する前のキャレット位置とスクロール位置を保存してから「[[キーアサイン集#すべて選択 (非スクロール)|すべて選択 (非スクロール)]]」を実行します。<br> ※ 「すべて選択」前に選択範囲があった場合は、選択範囲の開始/終了位置を保存します。
:「すべて選択」を実行する前のキャレット位置とスクロール位置を保存してから「[[キーアサイン集#すべて選択 (非スクロール)|すべて選択 (非スクロール)]]」を実行します。<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版】 選択範囲を解除 (非スクロール)
;【include版】 選択範囲を解除 (非スクロール)
:「【include版】 すべて選択 (非スクロール)」マクロが保存した情報を利用して、キャレット位置とスクロール位置を復旧します。<br> ※ 当該タブの情報は、このマクロの実行時に削除されます。
:「【include版】 すべて選択 (非スクロール)」マクロが保存した情報を利用して、キャレット位置とスクロール位置を復元します。<br> ※ 保存されている当該タブの情報は、このマクロの実行時に削除されます。
:*「【include版】 すべて選択 (非スクロール)」マクロが保存した位置情報がない場合は「[[キーアサイン集#選択範囲を解除 (非スクロール)|選択範囲を解除 (非スクロール)]]」を実行します。<br><span style="color:#0000c0;"> ※「すべて選択」状態を解除したときに復元された選択範囲は、このマクロをもう一度実行すると完全に解除されます。</span>
:*「【include版】 すべて選択 (非スクロール)」マクロが保存した位置情報がない場合は「[[キーアサイン集#選択範囲を解除 (非スクロール)|選択範囲を解除 (非スクロール)]]」を実行します。<br><span style="color:#0000c0;"> ※「すべて選択」状態を解除したときに復元された選択範囲は、このマクロをもう一度実行すると完全に解除されます。</span>
<br>
<br>
<div class="warningbox">
<div class="warningbox">
* このふたつのマクロは、「[[includeライブラリ]]」を利用し、外部ファイル(JSON)に情報を保存/参照します。<br> あらかじめ「includeライブラリ」をインストールしてください。
* このふたつのマクロは、「[[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 ファイルが肥大化することはありません。


32行目: 34行目:


>> 「[[ファイル:【include 版】すべて選択/選択解除.zip]] (アイコン入り)」
>> 「[[ファイル:【include 版】すべて選択/選択解除.zip]] (アイコン入り)」
* 2019/10/21: 【include 版】の第1版
* 2019/10/27: 【include 版】の第2版(描画速度を微妙に改善)




48行目: 52行目:
  * すべて選択時にスクロールしない(※通常は文書の末尾までスクロールする)
  * すべて選択時にスクロールしない(※通常は文書の末尾までスクロールする)
  *  
  *  
  * 2019/10/21 【include 版】
  * 2019/10/21 - 2019/10/27 【include 版】
  * ・「すべて選択」前のキャレット位置(または選択範囲)と
  * ・「すべて選択」前の選択範囲(キャレット位置)とスクロール位置の情報を
  *  スクロール位置の情報を JSON ファイルに書き出す
  *  JSON ファイルに書き出す
  *  → 「選択解除」マクロで、保存した位置情報への復旧可
  *  → 「選択解除」マクロで、保存した位置情報を復元可
  * ・現在開かれていないファイルの情報がリストにあれば削除する
  * ・現在開かれていないファイルの情報がリストにあれば削除する
  */
  */
97行目: 101行目:


     // リストにファイルの情報があれば書き換える
     // リストにファイルの情報があれば書き換える
     if ( list[i][0] == dPath ) {
     if ( path == dPath ) {
       infoExist = true;
       infoExist = true;
       list[i] = [ dPath, dLength, anc, act, sx, sy ];
       list[i] = [ dPath, dLength, anc, act, sx, sy ];
129行目: 133行目:
   IO.Serialize( setting, jsonName ); // JSON 書き込み
   IO.Serialize( setting, jsonName ); // JSON 書き込み
}
}
/*
  JSON ファイルの初期値
    {"fileList":[]}
*/
</source>
</source>


145行目: 155行目:
  * 選択解除時にスクロールしない
  * 選択解除時にスクロールしない
  *  
  *  
  * 2019/10/21 【include 版】
  * 2019/10/21 - 2019/10/27 【include 版】
  * ・「すべて選択」マクロ実行前のキャレット位置(または選択範囲)と
  * ・「すべて選択」マクロ実行前の
  *  スクロール位置の情報を JSON ファイルから読み込んで復旧する
*  選択範囲(キャレット位置)とスクロール位置の情報を
  *  JSON ファイルから読み込んで復元する
  * ・「すべて選択」以外の状態から実行したときは
  * ・「すべて選択」以外の状態から実行したときは
  *  スクロールなしで範囲選択を解除する
  *  スクロールなしで範囲選択を解除する
187行目: 198行目:
       infoExist = true;
       infoExist = true;
       fileInfo = list[i];
       fileInfo = list[i];
      list.splice( i, 1 ); // リストからファイル情報を削除
      setting.fileList = list;
      IO.Serialize( setting, jsonName ); // JSON 書き込み


       /**
       /**
197行目: 205行目:
       *  スクロール位置(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]);
        break Loop;
       }
       }
       // テキストの文字数が異なるなら、選択解除 (スクロールしない)
       // テキストの文字数が異なるなら、選択解除 (スクロールしない)
       else {
       else {
         Restore( s.GetActivePos(), sx, sy );
         Restore( s.GetActivePos(), sx, sy );
        break Loop;
       }
       }
      // リストからファイル情報を削除
      list.splice( i, 1 );
      setting.fileList = list;
      IO.Serialize( setting, jsonName ); // JSON 書き込み
      break Loop;
     }
     }
   } // end Loop:
   } // end Loop:
219行目: 231行目:
function Restore( act, sx, sy, anc ) {
function Restore( act, sx, sy, anc ) {
   anc = anc >= 0 ? anc : act;
   anc = anc >= 0 ? anc : act;
  Redraw = false;
   editor.ActiveDocument.selection.SetActivePos( act );
   editor.ActiveDocument.selection.SetActivePos( act );
   editor.ActiveDocument.selection.SetAnchorPos( anc );
   editor.ActiveDocument.selection.SetAnchorPos( anc );
   ScrollX = sx;  ScrollY = sy;
   ScrollX = sx;  ScrollY = sy;
  Redraw = true;
}
}
</source>
</source>

2019年10月27日 (日) 23:00時点における版

【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版(描画速度を微妙に改善)


ソースコード

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

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

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

/**
 * すべて選択時にスクロールしない(※通常は文書の末尾までスクロールする)
 * 
 * 2019/10/21 - 2019/10/27 【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 ( path == 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 書き込み
}


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


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

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

// 推奨割当:「Esc」

/**
 * 選択解除時にスクロールしない
 * 
 * 2019/10/21 - 2019/10/27 【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[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( s.GetActivePos(), sx, sy );
      }

      // リストからファイル情報を削除
      list.splice( i, 1 );
      setting.fileList = list;
      IO.Serialize( setting, jsonName );	// JSON 書き込み
      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;
  Redraw = false;
  editor.ActiveDocument.selection.SetActivePos( act );
  editor.ActiveDocument.selection.SetAnchorPos( anc );
  ScrollX = sx;  ScrollY = sy;
  Redraw = true;
}
スポンサーリンク