「次/前の文字列を検索・改」の版間の差分

提供: MeryWiki
ナビゲーションに移動 検索に移動
(第2版に更新。ZIP を追加)
1行目: 1行目:
[https://www.haijin-boys.com/software/mery/mery-tips#2 ショートカットキー [Ctrl+Shift+ ↓ または ↑ の機能(「次/前の文字列を検索」コマンド)] をカスタマイズしたマクロです。
+
== 機能 ==
  
 +
[https://www.haijin-boys.com/software/mery/mery-tips#2 ショートカットキー [ Ctrl+Shift+ ↓ または ↑ ]] の機能「[[ヘルプ:検索#次の文字列を検索|次/前の文字列を検索]]」コマンドをカスタマイズしたマクロです。
  
== 機能 ==
+
'''選択範囲が改行をふくむ複数行'''(論理行)のばあいでも「次/前の文字列を検索」と同様のジャンプ機能を実現する目論見です。
 +
<br><br>
 +
 
 +
=== 設定項目 ===
  
選択範囲が改行をふくむ複数行(論理行)のばあいでも「次/前の文字列を検索」と同様のジャンプ機能を実現する目論見です。
+
; 設定項目: ''findNext'' <br>
<br><br>
+
* <b style="color:#0000c0;">"Next"</b> なら「次(下)の文字列を検索」
 +
* <b style="color:#c00;">"Prev"</b> なら「前(上)の文字列を検索」
 +
: ※ 実際のところ "Next"、"Down"、true、1 のいずれかなら「次」、それ以外の値なら「前」になるようにしてあります。
 +
<br>
  
 
; 設定項目: ''optionEnable'' <br>
 
; 設定項目: ''optionEnable'' <br>
 
「検索」ダイアログのオプションフラグを使用するかしないかを指定します(優先オプション)。
 
「検索」ダイアログのオプションフラグを使用するかしないかを指定します(優先オプション)。
* <b style="color:#0000c0;">true</b> なら、カスタマイズなしで、ショートカットキー [Ctrl+Shift+ ↓ / ↑ ] の機能そのままに「次/前の文字列を検索」のジャンプを実行します。
+
* <b style="color:#0000c0;">true</b> なら、カスタマイズなしで、ショートカットキー [ Ctrl+Shift+ ↓ / ↑ ] の機能そのままに「次/前の文字列を検索」のジャンプを実行します。
: [Ctrl+Shift+ ↓ / ↑ ] の機能そのままでツールバーにマクロのアイコンを登録したい場合は、<b style="color:#0000c0;">true</b> にしてください。
+
: [ Ctrl+Shift+ ↓ / ↑ ] の機能そのままでツールバーにマクロのアイコンを登録したい場合は、<b style="color:#0000c0;">true</b> にしてください。
 
: ※「検索」ダイアログのオプションフラグ「大文字と小文字を区別する」や「文末まで検索したら文頭に移動する」が適用されます。
 
: ※「検索」ダイアログのオプションフラグ「大文字と小文字を区別する」や「文末まで検索したら文頭に移動する」が適用されます。
 
: ※ ジャンプした後も、「検索」ダイアログに検索文字列の履歴が残ります。
 
: ※ ジャンプした後も、「検索」ダイアログに検索文字列の履歴が残ります。
22行目: 29行目:
 
: ※「大文字と小文字を区別する」「文末まで検索したら文頭に移動する」については、べつの変数をもうけて再設定可能にしてあります。
 
: ※「大文字と小文字を区別する」「文末まで検索したら文頭に移動する」については、べつの変数をもうけて再設定可能にしてあります。
 
: ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されません。
 
: ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されません。
: ※ ジャンプの後、「検索」ダイアログのオプションフラグは復旧しません。
+
: ※ ジャンプの後、「検索」ダイアログのオプションフラグは、マクロ実行前の状態に復旧されません。
 
: ※ ジャンプの後、「検索」ダイアログに検索文字列の履歴を残しません。
 
: ※ ジャンプの後、「検索」ダイアログに検索文字列の履歴を残しません。
 
: <span style="color:#c00;">※「検索」ダイアログに検索文字列の最新の履歴は空になるので、「次を検索 (F3)」と「前を検索 (Shift+F3)」に影響します。 </span>
 
: <span style="color:#c00;">※「検索」ダイアログに検索文字列の最新の履歴は空になるので、「次を検索 (F3)」と「前を検索 (Shift+F3)」に影響します。 </span>
34行目: 41行目:
 
: ※ 自動マーカーが有効なら自動マーカーによる強調表示は残りますので、「検索文字列の強調表示」を手動で解除するのが面倒な人は <b style="color:#c00;">false</b> にしてください。
 
: ※ 自動マーカーが有効なら自動マーカーによる強調表示は残りますので、「検索文字列の強調表示」を手動で解除するのが面倒な人は <b style="color:#c00;">false</b> にしてください。
 
<br>
 
<br>
 +
 +
; 設定項目: ''hitCountEnable'' <br>
 +
マクロ「[[検索ヒット数表示(選択文字列)#機能強化バージョン|検索ヒット数表示(選択文字列)#機能強化バージョン]]」の組み込み関数で、検索文字列の出現回数をステータスバーに表示させるかをしていします。
 +
* <b style="color:#0000c0;">true</b> なら、検索ヒット数を表示します。
 +
: ※ ヒット数のカウント方式は Mery 標準の検索メソッドにあわせてあります。
 +
* <b style="color:#c00;">false</b> なら、検索ヒット数を表示しません。
 +
: ※ 別途で「検索ヒット数表示」マクロのような「選択範囲が変更された時」にステータス表示するイベントマクロを使用している場合は <b style="color:#c00;">false</b> にしてください。 <br> ジャンプ後に「選択範囲が変更された時」のイベントを発生させるので、イベントマクロと連携できるようになります。
 +
<br>
 +
 
----
 
----
▼ ''optionEnable = <b style="color:#c00;">false</b>'' のとき ▼
+
 
 +
'''▼ ''optionEnable = <span style="color:#c00;">false</span>'' のとき ▼'''
  
 
; 設定項目: ''findAroundEnable'' <br>
 
; 設定項目: ''findAroundEnable'' <br>
49行目: 66行目:
 
; 設定項目: ''multiLinesEnable'' <br>
 
; 設定項目: ''multiLinesEnable'' <br>
 
'''選択範囲が改行をふくむ複数行のばあい'''でも「次/前の文字列を検索」と同様のジャンプを可能にするための独自オプションです。 <br>
 
'''選択範囲が改行をふくむ複数行のばあい'''でも「次/前の文字列を検索」と同様のジャンプを可能にするための独自オプションです。 <br>
''multiLinesEnable = <b style="color:#0000c0;">true</b>'' でも選択範囲が改行をふくまない1行内であれば、''optionEnable = <b style="color:#c00;">false</b>'' の説明内容でジャンプを実行します。
+
'''''multiLinesEnable''' = <b style="color:#0000c0;">true</b>'' でも選択範囲が改行をふくまない1行内(論理行)であれば、'''''optionEnable''' = <b style="color:#c00;">false</b>'' の説明内容でジャンプを実行します。
 
* <b style="color:#0000c0;">true</b> なら、選択範囲が複数行でも「次/前の文字列を検索」と同様のジャンプができます。
 
* <b style="color:#0000c0;">true</b> なら、選択範囲が複数行でも「次/前の文字列を検索」と同様のジャンプができます。
: ※ 選択範囲が改行記号をふくむ複数行の状態からジャンプしたばあいは、''highlightEnable = <b style="color:#0000c0;">true</b>'' であっても「検索文字列の強調表示」は残りません(Mery 本体の仕様上の都合)。
+
: ※ 選択範囲が改行記号をふくむ複数行の状態からジャンプしたばあいは、'''''highlightEnable''' = <b style="color:#0000c0;">true</b>'' であっても「検索文字列の強調表示」は残りません(Mery 本体の仕様上の都合)。
 
* <b style="color:#c00;">false</b> で選択範囲が複数行だったばあいは、選択範囲はいったん解除され、キャレット付近の単語を自動選択して「次/前の文字列を検索」と同様のジャンプをします。
 
* <b style="color:#c00;">false</b> で選択範囲が複数行だったばあいは、選択範囲はいったん解除され、キャレット付近の単語を自動選択して「次/前の文字列を検索」と同様のジャンプをします。
  
== 「次の文字列を検索・改」 ==
+
 
 +
 
 +
== ダウンロード ==
 +
ダウンロード >> 「[[ファイル:次/前の文字列を検索・改.zip]]」(アイコン入り)
 +
 
 +
 
 +
== ソースコード ==
 +
* 2019/09/07(第1版)
 +
* 2019/09/09(第2版)
 +
: 検索方向「次/前」を変数で指定
 +
: 検索ヒット数のステータス表示機能を追加
 +
: ソースコードが長くなったので、ZIP 書庫をアップロード
 +
 
 
<source lang="javascript">
 
<source lang="javascript">
#title="次の文字列を検索"
+
#title="次/前の文字列を検索"
#tooltip = "次の文字列を検索・改"
+
#tooltip = "次/前の文字列を検索・改"
 
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",124
 
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",124
 +
 +
// ▲ 「次/前」の部分を直してからマクロを登録すること ▲
 +
// 「マテリアルデザインっぽいアイコン」のインデックスは、次 = 124 / 前 = 125
  
 
/**
 
/**
  * ------------------------------------
+
  * ----------------------------------------------
  * 「次の文字列を検索・改」
+
  * 「次/前の文字列を検索・改」
  * sukemaru, (2019/09/07)
+
  * sukemaru, (2018/07/19 - 2019/09/09)
  * ------------------------------------
+
  * ----------------------------------------------
  * 「次の文字列を検索」機能をカスタマイズ
+
* 「次/前の文字列を検索」機能をカスタマイズ
 +
*
 +
* ・検索強調なし、検索履歴なしでジャンプ可
 +
* ・複数行選択からの検索ジャンプに対応
 +
* ・「検索ヒット数表示(選択文字列)」マクロ(機能強化版)の関数を移植して
 +
*    ヒット数をステータス表示できるようにした
 +
*
 +
  * → 推奨: ショートカット [ Shift+Ctrl+ ↓ / ↑ ] に登録して置きかえる
 
  *  
 
  *  
  *  複数行選択から検索に対応
+
  * ※ 複数行選択でジャンプした場合は、強制的に「検索強調なし」「検索履歴なし」
  * ※ 複数行からの場合は、検索強調なし、履歴なし
+
  * ※「検索履歴なし」では、最新の履歴が "空" になる
 +
  * ※ 実行後は「検索/置換」ダイアログ内の「正規表現」オプションは OFF になる
 
  */
 
  */
  
 
// ---------- ▼ 設定項目 ▼ ----------
 
// ---------- ▼ 設定項目 ▼ ----------
// optionEnable と highlightEnable 両方を false にすると、最新の検索履歴を空にする
 
  
var optionEnable = false;
+
// ■ 検索する方向 ( 次: "Next" / 前: "Prev" )
   // true  なら検索ダイアログの「正規表現」以外のオプションが適用される
+
var findNext = "Next";
   // false なら検索オプションをリセットする
+
 
 +
 
 +
/* optionEnable, highlightEnable 両方を false にすると、検索履歴に残さない */
 +
 
 +
var optionEnable = false; // 推奨: false
 +
   // true  なら、検索ダイアログの「正規表現」以外のオプションが適用される
 +
   // false なら、検索オプションをリセットする// 推奨: false
 
   // ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されない
 
   // ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されない
  
 
var highlightEnable = true;
 
var highlightEnable = true;
   // true  なら検索文字列の強調を残す
+
   // true  なら、検索文字列の強調を残す
   // false なら検索文字列の強調を解除する
+
   // false なら、検索文字列の強調を解除する
  
 +
var hitCountEnable = true;
 +
  // true  なら、検索文字列の出現回数をステータスバーに表示する
 +
  // false なら、検索ヒット数をステータスバーに表示しない
 +
  // ※ 別途で「選択範囲が変更された時」にステータス表示するイベントマクロを使用するなら false に
  
// ▼ optionEnable = false のとき ▼
 
  
var findAroundEnable = true;
+
/* ▼ optionEnable = false のとき ▼ */
  // true  なら、文頭まで検索したら文末に移動する
 
  // false なら、文頭まで検索したらストップ
 
  // ※ true の場合、ジャンプ後も検索ダイアログの「文末まで検索したら文頭に移動する」は ON のままにする
 
  
var matchCaseEnable = false;
+
  var findAroundEnable = true;
  // true  なら、大文字と小文字を区別する
+
    // true  なら、文末まで検索したら文頭に移動する
  // false なら、大文字と小文字を区別しない
+
    // false なら、文末まで検索したらストップ
  // ※ true の場合、ジャンプ後も検索ダイアログの「大文字と小文字を区別する」は ON のままにする
+
    // ※ true の場合、ジャンプ後も検索ダイアログの「文末まで検索したら文頭に移動する」は ON のままにする
  
var multiLinesEnable = true;
+
  var matchCaseEnable = false;
  // true  なら、複数行選択から検索(検索強調なし、履歴なし)できる
+
    // true  なら、大文字と小文字を区別する
  // false なら、複数行選択から検索をしない
+
    // false なら、大文字と小文字を区別しない
  // ※ true でも、1行内の選択範囲なら highlightEnable を適用
+
    // ※ true の場合、ジャンプ後も検索ダイアログの「大文字と小文字を区別する」は ON のままにする
  // ※ false で複数行選択のときは、キャレット位置から単語自動選択して検索
+
 
 +
  var multiLinesEnable = true; // 推奨: true
 +
    // true  なら、複数行選択から検索(検索強調なし、履歴なし)できる
 +
    // false なら、複数行選択から検索しない
 +
    // ※ true でも、選択範囲が1行内なら highlightEnable = true/false を適用
 +
    // ※ false で複数行選択のときは、キャレット位置の単語を自動選択して検索
  
 
// ---------- ▲ 設定項目 ▲ ----------
 
// ---------- ▲ 設定項目 ▲ ----------
  
  
var d = editor.ActiveDocument, s = d.selection;
+
var d = editor.ActiveDocument;
 +
var s = d.selection;
 +
var st = s.Text;
 
var sy = ScrollY;
 
var sy = ScrollY;
 +
var direction = /next|down|true|1/i.test( String( findNext ) )
 +
              ? 1 : 0;
  
// 検索オプションを適用して検索する場合 ※「次の文字列を検索」コマンド
+
// 検索オプションを適用して検索する場合 ※「次/前の文字列を検索」コマンド
 
if ( optionEnable ) {
 
if ( optionEnable ) {
   editor.ExecuteCommandByID( MEID_SEARCH_NEXT_WORD = 2136 );
+
   editor.ExecuteCommandByID( 2137 - direction );
 +
  // MEID_SEARCH_NEXT_WORD = 2136
 +
  // MEID_SEARCH_PREV_WORD = 2137
 
}
 
}
  
116行目: 172行目:
 
else {
 
else {
 
   var findAround = findAroundEnable ? meFindAround : 0;
 
   var findAround = findAroundEnable ? meFindAround : 0;
   var matchCase = matchCaseEnable ? meFindReplaceCase : 0;
+
   var matchCase = matchCaseEnable ? meFindReplaceCase : 0;
   // 検索オプションをリセット
+
   var multiLines = ( multiLinesEnable && st.indexOf( "\n" ) > -1 );
  s.Find( "", 1 + findAround + matchCase );
 
  
   // 複数行選択から検索する場合
+
   // 複数行選択では正規表現で検索
   if ( multiLinesEnable && s.Text.indexOf( "\n" ) > -1 ) {
+
   if ( multiLines ) {
     s.Find( s.Text.replace( /\W/g, "\\$&" )
+
     s.Find( st.replace( /\W/g, "\\$&" ),
          , meFindNext + meFindReplaceRegExp + findAround + matchCase );
+
            direction + findAround + matchCase + meFindReplaceRegExp );
    s.Find( "", 1 + findAround + matchCase );
 
 
   }
 
   }
  
   // 1行内の範囲選択または単語自動選択から検索する場合
+
   // 1行内の範囲選択または単語自動選択からの検索
 
   else {
 
   else {
     s.FindRepeat( meFindNext + meFindRepeatWord );
+
    // 検索オプションをリセットして「次/前の文字列を検索」
    if ( ! highlightEnable ) {
+
    s.Find( "", findAround + matchCase );
      s.Find( "", 1 + findAround + matchCase );
+
     s.FindRepeat( direction + meFindRepeatWord );
    }
+
  }
 +
 
 +
  // 検索文字列を検索履歴から消す
 +
  if ( multiLines || ! highlightEnable ) {
 +
    s.Find( "", findAround + matchCase );
 
   }
 
   }
 
}
 
}
138行目: 196行目:
 
// 検索強調表示の有無
 
// 検索強調表示の有無
 
d.HighlightFind = highlightEnable;
 
d.HighlightFind = highlightEnable;
 
// 選択範囲変更イベントを発生させる
 
var anc = s.GetAnchorPos(), act = s.GetActivePos();
 
s.Collapse( meCollapseStart );
 
s.SetAnchorPos( anc ), s.SetActivePos( act, true );
 
  
 
// スクロール位置を調整
 
// スクロール位置を調整
 
ScrollY = ( ScrollY == sy ) ? sy : s.GetActivePointY( mePosView );
 
ScrollY = ( ScrollY == sy ) ? sy : s.GetActivePointY( mePosView );
</source>
 
  
 +
if ( st && hitCountEnable ) {
 +
  // 検索ヒット数をステータス表示
 +
  Status += "  " + HitStatus( s.Text, d.Text, matchCase, false );
 +
}
 +
else {
 +
  // 選択範囲変更イベントを発生させる
 +
  var anc = s.GetAnchorPos(), act = s.GetActivePos();
 +
  s.SetActivePos( anc ), s.SetActivePos( act, true );
 +
}
  
== 「前の文字列を検索・改」 ==
 
<source lang="javascript">
 
#title="前の文字列を検索"
 
#tooltip = "前の文字列を検索・改"
 
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",125
 
  
 
/**
 
/**
  * ------------------------------------
+
  * 関数 HitStatus( strSelection, strDocuText, matchCase, countMinimum )
* 「前の文字列を検索・改」
+
  * 選択文字列の出現回数を返す
* sukemaru, (2019/09/07)
+
  * ※ 変数 s はグローバルスコープの Document.Selection
  * ------------------------------------
+
  * https://www.haijin-boys.com/wiki/検索ヒット数表示(選択文字列)#機能強化バージョン
* 「前の文字列を検索」機能をカスタマイズ
 
  *  
 
  * 複数行選択から検索に対応
 
* ※ 複数行からの場合は、検索強調なし、履歴なし
 
 
  */
 
  */
 
+
function HitStatus( word, docu, matchCase, countMinimum ) {
// ---------- ▼ 設定項目 ▼ ----------
+
  var word = matchCase ? word : word.toLowerCase();
// optionEnable と highlightEnable 両方を false にすると、最新の検索履歴を空にする
+
   var docu = matchCase ? docu : docu.toLowerCase();
 
+
   var len = word.length;
var optionEnable = false;
+
   var tPos = Math.min( s.GetActivePos(), s.GetAnchorPos() );
  // true  なら検索ダイアログの「正規表現」以外のオプションが適用される
+
   var pos = 0,  count = 0, hit = 0;
  // false なら検索オプションをリセットする
+
   while ( pos >= 0 ) {
  // ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されない
+
     pos = docu.indexOf( word, pos );
 
+
     if ( pos >= 0 ) {
var highlightEnable = true;
+
      count ++;
   // true  なら検索文字列の強調を残す
+
      if ( pos == tPos ) {
  // false なら検索文字列の強調を解除する
+
        hit = count;
 
+
      }
 
+
      pos += countMinimum ? len : 1;
// ▼ optionEnable = false のとき ▼
+
    }
 
 
var findAroundEnable = true;
 
  // true  なら、文頭まで検索したら文末に移動する
 
  // false なら、文頭まで検索したらストップ
 
  // ※ true の場合、ジャンプ後も検索ダイアログの「文末まで検索したら文頭に移動する」は ON のままにする
 
 
 
var matchCaseEnable = false;
 
   // true  なら、大文字と小文字を区別する
 
  // false なら、大文字と小文字を区別しない
 
  // ※ true の場合、ジャンプ後も検索ダイアログの「大文字と小文字を区別する」は ON のままにする
 
 
 
var multiLinesEnable = true;
 
   // true  なら、複数行選択から検索(検索強調なし、履歴なし)できる
 
  // false なら、複数行選択から検索をしない
 
  // ※ true でも、1行内の選択範囲なら highlightEnable を適用
 
  // ※ false で複数行選択のときは、キャレット位置から単語自動選択して検索
 
 
 
// ---------- ▲ 設定項目 ▲ ----------
 
 
 
 
 
var d = editor.ActiveDocument, s = d.selection;
 
var sy = ScrollY;
 
 
 
// 検索オプションを適用して検索する場合 ※「前の文字列を検索」コマンド
 
if ( optionEnable ) {
 
  editor.ExecuteCommandByID( MEID_SEARCH_PREV_WORD = 2137 );
 
}
 
 
 
// 検索オプションをリセットして検索する場合
 
else {
 
   var findAround = findAroundEnable ? meFindAround : 0;
 
  var matchCase = matchCaseEnable ? meFindReplaceCase : 0;
 
  // 検索オプションをリセット
 
  s.Find( "", 0 + findAround + matchCase );
 
 
 
   // 複数行選択から検索する場合
 
  if ( multiLinesEnable && s.Text.indexOf( "\n" ) > -1 ) {
 
     s.Find( s.Text.replace( /\W/g, "\\$&" )
 
          , meFindPrevious + meFindReplaceRegExp + findAround + matchCase );
 
     s.Find( "", 0 + findAround + matchCase );
 
 
   }
 
   }
 
+
   word = docu = "";
   // 1行内の範囲選択または単語自動選択から検索する場合
+
   var SeparateNum = function( str ) {
   else {
+
     return str.replace( /(\d)(?=(?:\d{3})+[^\d])/g, "$1," );
     s.FindRepeat( meFindPrevious + meFindRepeatWord );
 
    if ( ! highlightEnable ) {
 
      s.Find( "", 0 + findAround + matchCase );
 
    }
 
 
   }
 
   }
 +
  return SeparateNum( "ヒット数:" + count + " 件"
 +
          + " ( " + hit + " 件目 ) " );
 
}
 
}
 +
</source>
  
// 検索強調表示の有無
 
d.HighlightFind = highlightEnable;
 
 
// 選択範囲変更イベントを発生させる
 
var anc = s.GetAnchorPos(), act = s.GetActivePos();
 
s.Collapse( meCollapseStart );
 
s.SetAnchorPos( anc ), s.SetActivePos( act, true );
 
 
// スクロール位置を調整
 
ScrollY = ( ScrollY == sy ) ? sy : s.GetActivePointY( mePosView );
 
</source>
 
  
 
== メモ ==
 
== メモ ==
[[利用者:Sukemaru#Find() メソッドと FindRepeat() メソッドの 定数|個人的な覚え書き]] [[マクロリファレンス:Selection インターフェイス#FindRepeat メソッド|FindRepeat メソッド]] で「大文字と小文字を区別」や「末尾まで検索したら先頭から検索」オプションを使うために [[マクロリファレンス:Selection インターフェイス#Find メソッド|Find メソッド]] を併用する方法を書いてあります。(sukemaru)
+
[[利用者:Sukemaru#Find() メソッドと FindRepeat() メソッドの 定数|個人的な覚え書き]] のページに [[マクロリファレンス:Selection インターフェイス#FindRepeat メソッド|FindRepeat メソッド]] で「大文字と小文字を区別」や「末尾まで検索したら先頭から検索」オプションを使うために [[マクロリファレンス:Selection インターフェイス#Find メソッド|Find メソッド]] を併用する方法の説明を書いています。(sukemaru)

2019年9月9日 (月) 21:22時点における版

機能

ショートカットキー [ Ctrl+Shift+ ↓ または ↑ ] の機能「次/前の文字列を検索」コマンドをカスタマイズしたマクロです。

選択範囲が改行をふくむ複数行(論理行)のばあいでも「次/前の文字列を検索」と同様のジャンプ機能を実現する目論見です。

設定項目

設定項目: findNext
  • "Next" なら「次(下)の文字列を検索」
  • "Prev" なら「前(上)の文字列を検索」
※ 実際のところ "Next"、"Down"、true、1 のいずれかなら「次」、それ以外の値なら「前」になるようにしてあります。


設定項目: optionEnable

「検索」ダイアログのオプションフラグを使用するかしないかを指定します(優先オプション)。

  • true なら、カスタマイズなしで、ショートカットキー [ Ctrl+Shift+ ↓ / ↑ ] の機能そのままに「次/前の文字列を検索」のジャンプを実行します。
[ Ctrl+Shift+ ↓ / ↑ ] の機能そのままでツールバーにマクロのアイコンを登録したい場合は、true にしてください。
※「検索」ダイアログのオプションフラグ「大文字と小文字を区別する」や「文末まで検索したら文頭に移動する」が適用されます。
※ ジャンプした後も、「検索」ダイアログに検索文字列の履歴が残ります。
  • false なら、「検索」ダイアログのオプションフラグを一度リセットしてから「次/前の文字列を検索」と同様のジャンプを実行します。
※ リセット(解除)されるオプションフラグは、以下の4項目です。
  • 「大文字と小文字を区別する」
  • 「正規表現を使用する」
  • 「単語のみを検索する」
  • 「文末まで検索したら文頭に移動する」
※「大文字と小文字を区別する」「文末まで検索したら文頭に移動する」については、べつの変数をもうけて再設定可能にしてあります。
※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されません。
※ ジャンプの後、「検索」ダイアログのオプションフラグは、マクロ実行前の状態に復旧されません。
※ ジャンプの後、「検索」ダイアログに検索文字列の履歴を残しません。
※「検索」ダイアログに検索文字列の最新の履歴は空になるので、「次を検索 (F3)」と「前を検索 (Shift+F3)」に影響します。


設定項目: highlightEnable

ジャンプした後に「検索文字列の強調表示」を残すかどうかを指定します。

  • true なら、検索した文字列はハイライト状態のまま残ります。
※「検索文字列の強調を解除」のショートカットキーは [Alt+F3] ですので、任意のタイミングで手動で解除してください。
  • false なら、検索した文字列のハイライトを残しません。
※ 自動マーカーが有効なら自動マーカーによる強調表示は残りますので、「検索文字列の強調表示」を手動で解除するのが面倒な人は false にしてください。


設定項目: hitCountEnable

マクロ「検索ヒット数表示(選択文字列)#機能強化バージョン」の組み込み関数で、検索文字列の出現回数をステータスバーに表示させるかをしていします。

  • true なら、検索ヒット数を表示します。
※ ヒット数のカウント方式は Mery 標準の検索メソッドにあわせてあります。
  • false なら、検索ヒット数を表示しません。
※ 別途で「検索ヒット数表示」マクロのような「選択範囲が変更された時」にステータス表示するイベントマクロを使用している場合は false にしてください。
ジャンプ後に「選択範囲が変更された時」のイベントを発生させるので、イベントマクロと連携できるようになります。



optionEnable = false のとき ▼

設定項目: findAroundEnable
  • true なら、「文末まで検索したら文頭に移動する」オプションを有効化して、「次/前の文字列を検索」と同様のジャンプ機能を実行できます。
※ ジャンプ後も「検索/置換」ダイアログ内の「文末まで検索したら文頭に移動する」オプションは有効化されたままになります。


設定項目: matchCaseEnable
  • true なら、「大文字と小文字を区別する」オプションを有効化して「次/前の文字列を検索」と同様のジャンプ機能を実行できます。
※ ジャンプ後も「検索/置換」ダイアログ内の「大文字と小文字を区別する」オプションは有効化されたままになります。


設定項目: multiLinesEnable

選択範囲が改行をふくむ複数行のばあいでも「次/前の文字列を検索」と同様のジャンプを可能にするための独自オプションです。
multiLinesEnable = true でも選択範囲が改行をふくまない1行内(論理行)であれば、optionEnable = false の説明内容でジャンプを実行します。

  • true なら、選択範囲が複数行でも「次/前の文字列を検索」と同様のジャンプができます。
※ 選択範囲が改行記号をふくむ複数行の状態からジャンプしたばあいは、highlightEnable = true であっても「検索文字列の強調表示」は残りません(Mery 本体の仕様上の都合)。
  • false で選択範囲が複数行だったばあいは、選択範囲はいったん解除され、キャレット付近の単語を自動選択して「次/前の文字列を検索」と同様のジャンプをします。


ダウンロード

ダウンロード >> 「ファイル:次/前の文字列を検索・改.zip」(アイコン入り)


ソースコード

  • 2019/09/07(第1版)
  • 2019/09/09(第2版)
検索方向「次/前」を変数で指定
検索ヒット数のステータス表示機能を追加
ソースコードが長くなったので、ZIP 書庫をアップロード
#title="次/前の文字列を検索"
#tooltip = "次/前の文字列を検索・改"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",124

// ▲ 「次/前」の部分を直してからマクロを登録すること ▲
// 「マテリアルデザインっぽいアイコン」のインデックスは、次 = 124 / 前 = 125

/**
 * ----------------------------------------------
 * 「次/前の文字列を検索・改」
 * sukemaru, (2018/07/19 - 2019/09/09)
 * ----------------------------------------------
 * 「次/前の文字列を検索」機能をカスタマイズ
 * 
 * ・検索強調なし、検索履歴なしでジャンプ可
 * ・複数行選択からの検索ジャンプに対応
 * ・「検索ヒット数表示(選択文字列)」マクロ(機能強化版)の関数を移植して
 *    ヒット数をステータス表示できるようにした
 * 
 * → 推奨: ショートカット [ Shift+Ctrl+ ↓ / ↑ ] に登録して置きかえる
 * 
 * ※ 複数行選択でジャンプした場合は、強制的に「検索強調なし」「検索履歴なし」
 * ※「検索履歴なし」では、最新の履歴が "空" になる
 * ※ 実行後は「検索/置換」ダイアログ内の「正規表現」オプションは OFF になる
 */

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

// ■ 検索する方向 ( 次: "Next" / 前: "Prev" )
var findNext = "Next";


/* optionEnable, highlightEnable 両方を false にすると、検索履歴に残さない */

var optionEnable = false;		// 推奨: false
  // true  なら、検索ダイアログの「正規表現」以外のオプションが適用される
  // false なら、検索オプションをリセットする// 推奨: false
  // ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されない

var highlightEnable = true;
  // true  なら、検索文字列の強調を残す
  // false なら、検索文字列の強調を解除する

var hitCountEnable = true;
  // true  なら、検索文字列の出現回数をステータスバーに表示する
  // false なら、検索ヒット数をステータスバーに表示しない
  // ※ 別途で「選択範囲が変更された時」にステータス表示するイベントマクロを使用するなら false に


/* ▼ optionEnable = false のとき ▼ */

  var findAroundEnable = true;
    // true  なら、文末まで検索したら文頭に移動する
    // false なら、文末まで検索したらストップ
    // ※ true の場合、ジャンプ後も検索ダイアログの「文末まで検索したら文頭に移動する」は ON のままにする

  var matchCaseEnable = false;
    // true  なら、大文字と小文字を区別する
    // false なら、大文字と小文字を区別しない
    // ※ true の場合、ジャンプ後も検索ダイアログの「大文字と小文字を区別する」は ON のままにする

  var multiLinesEnable = true;		// 推奨: true
    // true  なら、複数行選択から検索(検索強調なし、履歴なし)できる
    // false なら、複数行選択から検索しない
    // ※ true でも、選択範囲が1行内なら highlightEnable = true/false を適用
    // ※ false で複数行選択のときは、キャレット位置の単語を自動選択して検索

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


var d  = editor.ActiveDocument;
var s  = d.selection;
var st = s.Text;
var sy = ScrollY;
var direction = /next|down|true|1/i.test( String( findNext ) )
              ? 1 : 0;

// 検索オプションを適用して検索する場合	※「次/前の文字列を検索」コマンド
if ( optionEnable ) {
  editor.ExecuteCommandByID( 2137 - direction );
  // MEID_SEARCH_NEXT_WORD = 2136
  // MEID_SEARCH_PREV_WORD = 2137
}

// 検索オプションをリセットして検索する場合
else {
  var findAround = findAroundEnable ? meFindAround : 0;
  var matchCase  = matchCaseEnable ? meFindReplaceCase : 0;
  var multiLines = ( multiLinesEnable && st.indexOf( "\n" ) > -1 );

  // 複数行選択では正規表現で検索
  if ( multiLines ) {
    s.Find( st.replace( /\W/g, "\\$&" ),
            direction + findAround + matchCase + meFindReplaceRegExp );
  }

  // 1行内の範囲選択または単語自動選択からの検索
  else {
    // 検索オプションをリセットして「次/前の文字列を検索」
    s.Find( "", findAround + matchCase );
    s.FindRepeat( direction + meFindRepeatWord );
  }

  // 検索文字列を検索履歴から消す
  if ( multiLines || ! highlightEnable ) {
    s.Find( "", findAround + matchCase );
  }
}

// 検索強調表示の有無
d.HighlightFind = highlightEnable;

// スクロール位置を調整
ScrollY = ( ScrollY == sy ) ? sy : s.GetActivePointY( mePosView );

if ( st && hitCountEnable ) {
  // 検索ヒット数をステータス表示
  Status += "  " + HitStatus( s.Text, d.Text, matchCase, false );
}
else {
  // 選択範囲変更イベントを発生させる
  var anc = s.GetAnchorPos(), act = s.GetActivePos();
  s.SetActivePos( anc ), s.SetActivePos( act, true );
}


/**
 * 関数 HitStatus( strSelection, strDocuText, matchCase, countMinimum )
 * 選択文字列の出現回数を返す
 * ※ 変数 s はグローバルスコープの Document.Selection
 * https://www.haijin-boys.com/wiki/検索ヒット数表示(選択文字列)#機能強化バージョン
 */
function HitStatus( word, docu, matchCase, countMinimum ) {
  var word = matchCase ? word : word.toLowerCase();
  var docu = matchCase ? docu : docu.toLowerCase();
  var len = word.length;
  var tPos = Math.min( s.GetActivePos(), s.GetAnchorPos() );
  var pos = 0,  count = 0,  hit = 0;
  while ( pos >= 0 ) {
    pos = docu.indexOf( word, pos );
    if ( pos >= 0 ) {
      count ++;
      if ( pos == tPos ) {
        hit = count;
      }
      pos += countMinimum ? len : 1;
    }
  }
  word = docu = "";
  var SeparateNum = function( str ) {
    return str.replace( /(\d)(?=(?:\d{3})+[^\d])/g, "$1," );
  }
  return SeparateNum( "ヒット数:" + count + " 件"
           + " ( " + hit + " 件目 ) " );
}


メモ

個人的な覚え書き のページに FindRepeat メソッド で「大文字と小文字を区別」や「末尾まで検索したら先頭から検索」オプションを使うために Find メソッド を併用する方法の説明を書いています。(sukemaru)

スポンサーリンク