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

提供: MeryWiki
ナビゲーションに移動 検索に移動
Sukemaru (トーク | 投稿記録)
Sukemaru (トーク | 投稿記録)
更新:第4版
1行目: 1行目:
__toc__
<br><br>
; ダウンロード >> 「[[メディア:次/前の文字列を検索・改.zip|次/前の文字列を検索・改.zip]]」(アイコン入り)
<br>
== 機能 ==
== 機能 ==


[https://www.haijin-boys.com/software/mery/mery-tips#2 ショートカットキー [ Ctrl+Shift+ ↓ または ↑ &#93;] の機能「[[ヘルプ:検索#次の文字列を検索|次/前の文字列を検索]]」コマンドをカスタマイズしたマクロです。
[https://www.haijin-boys.com/software/mery/mery-tips#2 ショートカットキー [ Ctrl+Shift+ ↓ または ↑ &#93;] の「[[ヘルプ:検索#次の文字列を検索|次/前の文字列を検索]]」コマンドの機能をカスタマイズしたマクロです。


*「次/前の文字列を検索」コマンドでは、「検索/置換」ダイアログ内のオプションの ☑ 状態を適用したくない ('''適用したいオプション項目が決まっている''')
*「次/前の文字列を検索」コマンドでは、「検索/置換」ダイアログ内のオプションの ☑ 状態を適用したくない ('''適用したいオプション項目が決まっている''')
*'''選択範囲が改行をふくむ複数行'''(論理行)のばあいでも「次/前の文字列を検索」と同様のジャンプ機能がほしい
*'''選択範囲が改行をふくむ複数行'''(論理行)のばあいでも「次/前の文字列を検索」と同様のジャンプ機能がほしい
という個人的希望を実現する目論見です。
という個人的希望を実現する目論見です。
<br><br>
; ダウンロード >> 「[[メディア:次/前の文字列を検索・改.zip]]」(アイコン入り)
<br><br>
<br><br>


== 設定項目 ==
== 設定項目 ==
このマクロの特色(上記の <q>目論見</q>)を有効にするなら
このマクロの特色(上記の <q>目論見</q>)を有効にするなら
* '''''optionEnable''' = <b style="color:#c00;">false</b>''
* '''''optionEnable''' = <b style="color:#c00;">false</b>''
23行目: 26行目:
* <b style="color:#c00;">"Prev"</b> なら「前(上)の文字列を検索」
* <b style="color:#c00;">"Prev"</b> なら「前(上)の文字列を検索」
: ※ 実際のところ "Next"、"Down"、true、1 のいずれかなら「次」、それ以外の値なら「前」になるようにしてあります。
: ※ 実際のところ "Next"、"Down"、true、1 のいずれかなら「次」、それ以外の値なら「前」になるようにしてあります。
: ※ ZIP 書庫を [[#ダウンロード|ダウンロード]] した場合、「次」と「前」ふたつの JS ファイルがあらかじめ用意されています。
: ※ ZIP 書庫を [[#ダウンロード|ダウンロード]] した場合、あらかじめ「次」と「前」ふたつの JS ファイルを用意してあります。
<br>
<br>


==== 設定項目: ''optionEnable'' ====
==== 設定項目: ''optionEnable'' ====
「検索」ダイアログのオプションフラグを使用するかしないかを指定します。
「検索」ダイアログのオプションフラグを使用するかしないかを指定します。
<br><br>
<div class="warningbox">  
※ '''[https://www.haijin-boys.com/software/mery/mery-3-0-0#13 Mery ver 3.0.1]''' 以降で '''複数選択''' や '''矩形選択''' している状態からこのマクロを実行したときは、強制的に '''''optionEnable''' = <b style="color:#0000c0;">true</b>'' での動作になります。
</div>
* <b style="color:#0000c0;">true</b> なら、カスタマイズなしで、ショートカットキー [ Ctrl+Shift+ ↓ / ↑ ] の機能そのままに「次/前の文字列を検索」のジャンプを実行します。
* <b style="color:#0000c0;">true</b> なら、カスタマイズなしで、ショートカットキー [ Ctrl+Shift+ ↓ / ↑ ] の機能そのままに「次/前の文字列を検索」のジャンプを実行します。
: <u>[ Ctrl+Shift+ ↓ / ↑ ] の機能そのままでツールバーにマクロの '''アイコン''' を登録したいだけの場合は、<b style="color:#0000c0;">true</b> にしてください。</u>
: <u>[ Ctrl+Shift+ ↓ / ↑ ] の機能そのままでツールバーにマクロの '''アイコン''' を登録したいだけの場合は、<b style="color:#0000c0;">true</b> にしてください。</u>
: ※「検索」ダイアログのオプションフラグ「大文字と小文字を区別する」や「文末まで検索したら文頭に移動する」が適用されます。
: ※「検索」ダイアログのオプションフラグ「大文字と小文字を区別する」や「文末まで検索したら文頭に移動する」が適用されます。
: ※ ジャンプした後も、「検索」ダイアログに検索文字列の履歴が残ります。
: ※ ジャンプした後も、「検索」ダイアログに検索文字列の履歴が残ります。
: ※ このマクロからは「検索」ダイアログのオプションフラグを取得できないので、設定項目 '''''[[#設定項目: hitCountEnable|hitCountEnable]]''' = <b style="color:#0000c0;">true</b>'' にする場合、ヒット件数は '''''matchCaseEnable''''' と '''''onlyWordEnable''''' の設定状態にしたがってカウントします。
<br><div id="false">
<br><div id="false">
* <b style="color:#c00;">false</b> なら、「検索」ダイアログのオプションフラグを一度リセットしてから「次/前の文字列を検索」と同様のジャンプを実行します。
* <b style="color:#c00;">false</b> なら、「検索」ダイアログのオプションフラグを一度リセットしてから「次/前の文字列を検索」と同様のジャンプを実行します。
: ※ リセット(解除)されるオプションフラグは、以下の4項目です。
: ※ リセット(解除)されるオプションフラグは、以下の4項目です。
40行目: 47行目:
:* 「単語のみを検索する」
:* 「単語のみを検索する」
:* 「文末まで検索したら文頭に移動する」
:* 「文末まで検索したら文頭に移動する」
: ※ [https://www.haijin-boys.com/software/mery/mery-3-0-0#13 Mery ベータ版 ver 3.0.1] 以降では「migemo を使用する」[https://www.haijin-boys.com/software/mery/mery-2-8-3#13] も解除されます。
: ※「大文字と小文字を区別する」「単語のみを検索する」「文末まで検索したら文頭に移動する」については、個別の変数をもうけて再設定可能にしてあります。
: ※「大文字と小文字を区別する」「単語のみを検索する」「文末まで検索したら文頭に移動する」については、個別の変数をもうけて再設定可能にしてあります。
: ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されません。
: ※「終了したら閉じる」と、[https://www.haijin-boys.com/software/mery/mery-2-6-10#1 ベータ版 2.6.10] で追加された「インクリメンタルサーチ」のオプションフラグは解除されません。
: <span style="color:#c00;">※ 「検索」ダイアログのオプションフラグは、ジャンプの後も、マクロ実行前の状態に復旧されません。</span> このマクロの [[#false2|設定項目で指定した各オプションフラグ]] の ON/OFF 状態になります。
: <span style="color:#c00;">※ 「検索」ダイアログのオプションフラグは、ジャンプの後も、マクロ実行前の状態に復旧されません。</span> このマクロの [[#false2|設定項目で指定した各オプションフラグ]] の ON/OFF 状態になります。
: ※ ジャンプの後、「検索」ダイアログに検索文字列の履歴を残しません。
: ※ ジャンプの後、「検索」ダイアログに検索文字列の履歴を残しません。
51行目: 60行目:
* <b style="color:#0000c0;">true</b> なら、検索した文字列はハイライト状態のまま残ります。
* <b style="color:#0000c0;">true</b> なら、検索した文字列はハイライト状態のまま残ります。
: ※「検索文字列の強調を解除」のショートカットキーは [Alt+F3] ですので、任意のタイミングで手動で解除してください。
: ※「検索文字列の強調を解除」のショートカットキーは [Alt+F3] ですので、任意のタイミングで手動で解除してください。
: ※'''''multiLinesEnable''' = <b style="color:#0000c0;">true</b>'' での複数行検索では、検索文字列はハイライトされません(Mery の仕様)。
* <b style="color:#c00;">false</b> なら、検索した文字列のハイライトを残しません。
* <b style="color:#c00;">false</b> なら、検索した文字列のハイライトを残しません。
: ※「検索文字列の強調表示」を手動で解除するのが面倒な人は <b style="color:#c00;">false</b> にしてください。
: ※「検索文字列の強調表示」を手動で解除するのが面倒な人は <b style="color:#c00;">false</b> にしてください。
57行目: 68行目:


==== 設定項目: ''hitCountEnable'' ====
==== 設定項目: ''hitCountEnable'' ====
マクロ「[[検索ヒット数表示(選択文字列)]]」の組み込み関数で、検索文字列の出現回数をステータスバーに表示させるかを指定します。
検索文字列の出現回数をステータスバーに表示させるかを指定します。<br>
''ref. ''「[[検索ヒット数表示(選択文字列)]]」マクロ
* <b style="color:#0000c0;">true</b> なら、検索ヒット数を表示します。
* <b style="color:#0000c0;">true</b> なら、検索ヒット数を表示します。
: ※ ヒット数のカウント方式は、基本的に Mery 標準の検索メソッドにあわせてありますが、検索ダイアログのオプションフラグに連動させることができないため '''''optionEnable''' = <b style="color:#0000c0;">true</b>'' の場合も '''''matchCaseEnable''''' と '''''onlyWordEnable''''' の設定でヒット数をカウントします。
: ※ ヒット数のカウント方式は、基本的に Mery 標準の検索メソッドにあわせてありますが、検索ダイアログのオプションフラグに連動させることができないため '''''optionEnable''' = <b style="color:#0000c0;">true</b>'' の場合も '''''matchCaseEnable''''' と '''''onlyWordEnable''''' の設定でヒット数をカウントします。
: ※ '''''onlyWordEnable''''' (単語のみ検索) オプションが有効のときの正確度には問題があるかもしれません。
: ※ '''''onlyWordEnable''''' (単語のみ検索) オプションが有効のときの正確度には問題があるかもしれません。
* <b style="color:#c00;">false</b> なら、検索ヒット数を表示しません。
* <b style="color:#c00;">false</b> なら、検索ヒット数を表示しません。
: ※ 別途で「検索ヒット数表示」マクロのような「選択範囲が変更された時」にステータス表示するイベントマクロを使用しているばあいは、イベントマクロによってステータス表示が上書きされます。
: ※ 別途で「検索ヒット数表示」マクロのような「選択範囲が変更された時」にステータス表示するイベントマクロを使用しているばあいは、イベントマクロによってステータス表示が上書きされます。
73行目: 86行目:


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


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


==== 設定項目: ''onlyWordEnable'' ====
==== 設定項目: ''onlyWordEnable'' ====
* <b style="color:#0000c0;">true</b> なら、「'''単語のみ検索する'''」オプションを有効化して「次/前の文字列を検索」と同様のジャンプ機能を実行できます。
* <b style="color:#0000c0;">true</b> なら、「'''単語のみ検索する'''」オプションを適用して「次/前の文字列を検索」と同様のジャンプ機能を実行します。
: ※ ジャンプ後も「検索/置換」ダイアログ内の「単語のみ検索する」オプションは有効化されたままになります。
: ※ 「検索/置換」ダイアログ内の「単語のみ検索する」オプションは、ジャンプ後も有効化されたままになります。
: <span style="color:#0000c0;">※ 実質的に「単語のみ検索」オプションが有効になるのは、検索文字列が「'''英単語''' (半角アルファベットと半角数字のみ)」のときだけです。</span> 検索文字列にアンダーバー <q>_</q> 以外の記号や空白文字、 ascii 外の文字がふくまれるばあいは、'''''onlyWordEnable''' = <b style="color:#0000c0;">true</b>'' であっても「単語のみ」オプションの ON/OFF 状態は無視されます(Mery 本体の仕様と同様)。
: <span style="color:#0000c0;">※ 実質的に「単語のみ検索」オプションが有効になるのは、検索文字列が「'''英単語のみ''' (半角アルファベットと半角数字のみ)」のときだけです。</span> 検索文字列にアンダーバー <q>_</q> 以外の記号や空白文字、 ascii 外の文字がふくまれるばあいは、'''''onlyWordEnable''' = <b style="color:#0000c0;">true</b>'' であっても「単語のみ」オプションの ON/OFF 状態は無視されます(Mery 本体の仕様と同様)。
<br>
<br>


93行目: 106行目:
<br>
<br>
* <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 本体の仕様)。 また、Mery 本体の「自動マーカー」機能による強調表示もされません。
* <b style="color:#c00;">false</b> で選択範囲が複数行だったばあいは、選択範囲をいったん解除してから、あらためてキャレット付近の <u>単語</u> を自動選択して「次/前の文字列を検索」と同様のジャンプをします。
: ※ 選択範囲が改行記号をふくむ複数行の状態からジャンプしたばあいは、ジャンプ後に「検索」ダイアログ内のオプションフラグの設定状態をリセットします (Mery ベータ版 ver 3.0.1 以降の場合はオプションフラグをクリアしません / 2020/05/11: 第4版)。
 
* <b style="color:#c00;">false</b> で選択範囲が複数行だったばあいは、選択範囲をいったん解除してから、あらためてキャレット付近の '''単語''' を自動選択して「次/前の文字列を検索」と同様のジャンプをします。
<br>
<br>
'''▲ ''optionEnable = <span style="color:#c00;">false</span>'' のとき ▲'''
'''▲ ''optionEnable = <span style="color:#c00;">false</span>'' のとき ▲'''
100行目: 115行目:


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


ダウンロード >> 「[[ファイル:次/前の文字列を検索・改.zip]]」
* マクロ「次の文字列を検索・改.js」
* マクロ「前の文字列を検索・改.js」
* 専用アイコン(マテリアルデザインっぽいアイコン)
<br>


== ソースコード ==
; 更新履歴
* 2019/09/07(第1版)
* 2019/09/07(第1版)
* 2019/09/09(第2版)
* 2019/09/09(第2版)
111行目: 130行目:
* 2019/12/01 - 2019/12/03(第3版)
* 2019/12/01 - 2019/12/03(第3版)
: 「単語のみ検索する」にも対応させた
: 「単語のみ検索する」にも対応させた
* 2020/05/11(第4版)
: '''[https://www.haijin-boys.com/software/mery/mery-3-0-0#13 Mery ver 3.0.1]''' で追加されたマルチカーソル機能(と矩形選択)への 対応・回避処理 を追加
: ※ Mery ver 2.x 上で実行したときの動作は 2019/12/03 版とおなじまま
<br>
== ソースコード ==


<source lang="javascript">
<source lang="javascript">
129行目: 154行目:
  * ----------------------------------------------
  * ----------------------------------------------
  * 「次/前の文字列を検索・改」
  * 「次/前の文字列を検索・改」
  * sukemaru, (2018/07/19 - 2019/12/03)
  * sukemaru, (2018/07/19 - 2020/05/11)
* https://www.haijin-boys.com/wiki/次/前の文字列を検索・改
  * ----------------------------------------------
  * ----------------------------------------------
  * 「次/前の文字列を検索」機能をカスタマイズ
  * 「次/前の文字列を検索」機能をカスタマイズ
143行目: 169行目:
  * ※「検索履歴なし」では、最新の履歴が "空" になる
  * ※「検索履歴なし」では、最新の履歴が "空" になる
  * ※ 実行後は「検索/置換」ダイアログ内の「正規表現」オプションは OFF になる
  * ※ 実行後は「検索/置換」ダイアログ内の「正規表現」オプションは OFF になる
*
* 2020/05/11:
* ※ Mery ver 3.0.x への対応(Mery ver 3.0.1 以上)
* ・矩形選択・複数選択で optionEnable=true を強制適用
* ・複数行検索で検索オプションを維持(定数 meFindKeepOptions を適用)
  */
  */


150行目: 181行目:


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




157行目: 188行目:
var optionEnable = false; // 推奨: false
var optionEnable = false; // 推奨: false
   // true  なら、検索ダイアログの「正規表現」以外のオプションが適用される
   // true  なら、検索ダイアログの「正規表現」以外のオプションが適用される
   // false なら、検索オプションをリセットする// 推奨: false
   // false なら、検索オプションをリセットする
   // ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されない
   // ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されない
  // ※Mery 3.0.1 以降で矩形選択や複数選択の状態からこのマクロを実行したときは、強制的に true を適用


var highlightEnable = false;
var highlightEnable = false;
188行目: 220行目:
     // false なら、選択範囲の文字列を部分的にふくむ単語も検索対象にする
     // false なら、選択範囲の文字列を部分的にふくむ単語も検索対象にする
     // ※ true の場合、ジャンプ後も検索ダイアログの「単語のみ検索する」は ON のままにする
     // ※ true の場合、ジャンプ後も検索ダイアログの「単語のみ検索する」は ON のままにする
     // ※ 検索文字列に半角英数字以外の文字が含まれているときは、実質的に無効
     // ※ 検索文字列に半角英数字以外の文字が含まれているときは、自動的に無効
    //  i.e. 非単語構成文字 /\W/ を含むなら無効( /^[A-Za-z0-9_]+$/ でのみ有効)


   var multiLinesEnable = true; // 推奨: true
   var multiLinesEnable = true; // 推奨: true
203行目: 236行目:
var st = s.Text;
var st = s.Text;
var sy = ScrollY;
var sy = ScrollY;
var meModeStream, meModeBox, meModeMulti;
var isSingleStream = ( ! meModeBox && ! meModeMulti );
var direction  = /^(?:next|down|true|1)$/i.test( String( findNext ) )
var direction  = /^(?:next|down|true|1)$/i.test( String( findNext ) )
               ? meFindNext : meFindPrevious;
               ? meFindNext : meFindPrevious;
209行目: 246行目:
var onlyWord  = onlyWordEnable  ? meFindReplaceOnlyWord : 0;
var onlyWord  = onlyWordEnable  ? meFindReplaceOnlyWord : 0;
var multiLines = ( multiLinesEnable && st.indexOf( "\n" ) > -1 );
var multiLines = ( multiLinesEnable && st.indexOf( "\n" ) > -1 );
onlyWord = ( multiLines || /\W/.test( st ) )
var keepOptions = ( multiLines && meFindKeepOptions )
          ? 0 : onlyWord;
                ? meFindKeepOptions : 0;
 
// ※ ただし、複数行選択のときは強制オフ
onlyWord = ( multiLines || /\W/.test( st ) )
        ? 0 : onlyWord;


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


223行目: 262行目:
   var flags = direction + findAround + matchCase + onlyWord;
   var flags = direction + findAround + matchCase + onlyWord;


   // 複数行選択では正規表現で検索
   // 複数行選択では正規表現で検索(検索オプションを維持)
   if ( multiLines ) {
   if ( multiLines ) {
     s.Find( st.replace( /[.*+?^=!:${}()|[\]\/\\]/g, "\\$&" ),
     s.Find( st.replace( /[.*+?^=!:${}()|[\]\/\\]/g, "\\$&" ),
             flags + meFindReplaceRegExp );
             flags + meFindReplaceRegExp + keepOptions );
   }
   }


233行目: 272行目:
     // 検索オプションをリセットして「次/前の文字列を検索」
     // 検索オプションをリセットして「次/前の文字列を検索」
     s.Find( "", flags );
     s.Find( "", flags );
     s.FindRepeat( direction + meFindRepeatWord );
     s.FindRepeat( direction + meFindRepeatWord ); // + meFindKeepOptions
   }
   }


   // 検索文字列を検索履歴から消す
   // 検索文字列を検索履歴から消す // multiLines || ! highlightEnable
   if ( multiLines || ! highlightEnable ) {
   if ( ! highlightEnable && ! keepOptions ) {
     s.Find( "", flags );
     s.Find( "", flags );
   }
   }
}
}
st = s.Text;


// 検索強調表示の有無
// 検索強調表示の有無
250行目: 288行目:


// 検索ヒット数をステータス表示
// 検索ヒット数をステータス表示
st = s.Text;
var hitStatus = ( st && hitCountEnable )
var hitStatus = ( st && hitCountEnable )
               ? ( multiLines || /\W/.test( st ) || ! onlyWord )
               ? ( onlyWord )
                 ? HitStatus( st, d.Text, matchCase, countMinimum = false )
                 ? WordHitStatus( st, d.Text, matchCase ) + " reg "
                 : WordHitStatus( st, d.Text, matchCase )
                 : HitStatus( st, d.Text, matchCase, countMinimum = false )
               : " ";
               : " ";
Status = hitStatus
Status = hitStatus
       + ( Status ? " " + Status + " " : "" )
       + ( Status ? " " + Status + " " : "" )
261行目: 299行目:


// 選択範囲変更イベントを発生させる
// 選択範囲変更イベントを発生させる
var anc = s.GetAnchorPos(),  act = s.GetActivePos();
if ( isSingleStream && Status.indexOf( "すべての文章に" ) == -1 ) {
s.SetActivePos( anc ),  s.SetActivePos( act, true );
  var anc = s.GetAnchorPos(),  act = s.GetActivePos();
  s.SetActivePos( anc ),  s.SetActivePos( act, true );
}
 
Redraw = true;
Redraw = true;


291行目: 332行目:
   var tPos = Math.min( s.GetActivePos(), s.GetAnchorPos() );
   var tPos = Math.min( s.GetActivePos(), s.GetAnchorPos() );
   var count = 0,  hit = 0;
   var count = 0,  hit = 0;
   var next = countMinimum ? word.length : 1;
   var offset = countMinimum ? word.length : 1;
   var pos = docu.indexOf( word );
   var pos = docu.indexOf( word );
   while ( pos >= 0 ) {
   while ( pos >= 0 ) {
     count ++;
     count ++;
     if ( pos == tPos ) { hit = count; }
     if ( pos == tPos ) { hit = count; }
     pos = docu.indexOf( word, pos + next );
     pos = docu.indexOf( word, pos + offset );
   }
   }
   word = docu = "";
   word = docu = "";
   return count ? ( "  ヒット数:" + count + " 件"
   return count ? ( "  ヒット数:" + count + " 件"
                   + " ( " + hit + " 件目 ) "  
                   + " ( " + hit + " 件目 ) "  
315行目: 355行目:
   var s    = editor.ActiveDocument.selection;
   var s    = editor.ActiveDocument.selection;
   var bPos  = Math.max( s.GetActivePos(), s.GetAnchorPos() );
   var bPos  = Math.max( s.GetActivePos(), s.GetAnchorPos() );
   var reg  = new RegExp( "\\b" + word + "\\b", matchCase ? "g" : "gi" );
   var reg  = RegExp( "\\b" + word + "\\b", matchCase ? "g" : "gi" );
   var count = ( docu.match( reg ) || [] ).length;
   var count = ( docu.match( reg ) || [] ).length;
   var hit  = ( docu.slice( 0, bPos ).match( reg ) || [] ).length;
   var hit  = ( docu.slice( 0, bPos ).match( reg ) || [] ).length;
   word = docu = "";
   word = docu = "";
   return count ? ( "  ヒット数:" + count + " 件"
   return count ? ( "  ヒット数:" + count + " 件"
                   + " ( " + hit + " 件目 ) "
                   + " ( " + hit + " 件目 ) "
326行目: 365行目:
}
}
</source>
</source>
<br>


== メモ ==


== メモ ==
*個人的には、通常の「次/前の文字列を検索」コマンドのショートカットキー [ Ctrl+Shift+ ↓ または ↑ ] は変更せず、このマクロ(検索強調なし)はツールバーアイコンからの実行専用にして、検索強調の要否で使い分けています。(sukemaru)
*個人的には、通常の「次/前の文字列を検索」コマンドのショートカットキー [ Ctrl+Shift+ ↓ または ↑ ] は変更せず、このマクロ(検索強調なし)はツールバーアイコンからの実行専用にして、検索強調の要否で使い分けています。(sukemaru)



2020年5月11日 (月) 12:05時点における版



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


機能

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

  • 「次/前の文字列を検索」コマンドでは、「検索/置換」ダイアログ内のオプションの ☑ 状態を適用したくない (適用したいオプション項目が決まっている
  • 選択範囲が改行をふくむ複数行(論理行)のばあいでも「次/前の文字列を検索」と同様のジャンプ機能がほしい

という個人的希望を実現する目論見です。

設定項目

このマクロの特色(上記の 目論見)を有効にするなら

  • optionEnable = false
  • multiLinesEnable = true

での運用をお勧めします(その他の設定項目はお好みで)。


▼ 優先オプション ▼

設定項目: findNext

  • "Next" なら「次(下)の文字列を検索」
  • "Prev" なら「前(上)の文字列を検索」
※ 実際のところ "Next"、"Down"、true、1 のいずれかなら「次」、それ以外の値なら「前」になるようにしてあります。
※ ZIP 書庫を ダウンロード した場合、あらかじめ「次」と「前」ふたつの JS ファイルを用意してあります。


設定項目: optionEnable

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

Mery ver 3.0.1 以降で 複数選択矩形選択 している状態からこのマクロを実行したときは、強制的に optionEnable = true での動作になります。

  • true なら、カスタマイズなしで、ショートカットキー [ Ctrl+Shift+ ↓ / ↑ ] の機能そのままに「次/前の文字列を検索」のジャンプを実行します。
[ Ctrl+Shift+ ↓ / ↑ ] の機能そのままでツールバーにマクロの アイコン を登録したいだけの場合は、true にしてください。
※「検索」ダイアログのオプションフラグ「大文字と小文字を区別する」や「文末まで検索したら文頭に移動する」が適用されます。
※ ジャンプした後も、「検索」ダイアログに検索文字列の履歴が残ります。
※ このマクロからは「検索」ダイアログのオプションフラグを取得できないので、設定項目 hitCountEnable = true にする場合、ヒット件数は matchCaseEnableonlyWordEnable の設定状態にしたがってカウントします。


  • false なら、「検索」ダイアログのオプションフラグを一度リセットしてから「次/前の文字列を検索」と同様のジャンプを実行します。
※ リセット(解除)されるオプションフラグは、以下の4項目です。
  • 「大文字と小文字を区別する」
  • 「正規表現を使用する」
  • 「単語のみを検索する」
  • 「文末まで検索したら文頭に移動する」
Mery ベータ版 ver 3.0.1 以降では「migemo を使用する」[1] も解除されます。
※「大文字と小文字を区別する」「単語のみを検索する」「文末まで検索したら文頭に移動する」については、個別の変数をもうけて再設定可能にしてあります。
※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されません。
※ 「検索」ダイアログのオプションフラグは、ジャンプの後も、マクロ実行前の状態に復旧されません。 このマクロの 設定項目で指定した各オプションフラグ の ON/OFF 状態になります。
※ ジャンプの後、「検索」ダイアログに検索文字列の履歴を残しません。
false にすると「検索」ダイアログに検索文字列の最新の履歴は空になるので、つづけて ショートカットキー操作での「次を検索 (F3)」と「前を検索 (Shift+F3)」のジャンプはできません(検索ダイアログが開きます)。


設定項目: highlightEnable

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

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


設定項目: hitCountEnable

検索文字列の出現回数をステータスバーに表示させるかを指定します。
ref. 検索ヒット数表示(選択文字列)」マクロ

  • true なら、検索ヒット数を表示します。
※ ヒット数のカウント方式は、基本的に Mery 標準の検索メソッドにあわせてありますが、検索ダイアログのオプションフラグに連動させることができないため optionEnable = true の場合も matchCaseEnableonlyWordEnable の設定でヒット数をカウントします。
onlyWordEnable (単語のみ検索) オプションが有効のときの正確度には問題があるかもしれません。
  • false なら、検索ヒット数を表示しません。
※ 別途で「検索ヒット数表示」マクロのような「選択範囲が変更された時」にステータス表示するイベントマクロを使用しているばあいは、イベントマクロによってステータス表示が上書きされます。


▲ 優先オプション ▲


optionEnable = false のとき ▼

設定項目: findAroundEnable

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


設定項目: matchCaseEnable

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


設定項目: onlyWordEnable

  • true なら、「単語のみ検索する」オプションを適用して「次/前の文字列を検索」と同様のジャンプ機能を実行します。
※ 「検索/置換」ダイアログ内の「単語のみ検索する」オプションは、ジャンプ後も有効化されたままになります。
※ 実質的に「単語のみ検索」オプションが有効になるのは、検索文字列が「英単語のみ (半角アルファベットと半角数字のみ)」のときだけです。 検索文字列にアンダーバー _ 以外の記号や空白文字、 ascii 外の文字がふくまれるばあいは、onlyWordEnable = true であっても「単語のみ」オプションの ON/OFF 状態は無視されます(Mery 本体の仕様と同様)。


設定項目: multiLinesEnable

選択範囲が改行をふくむ複数行のばあいでも「次/前の文字列を検索」と同様のジャンプを可能にするための独自オプションです (Mery 本体の機能として用意されている Document.Selection.Find( str, meFindReplaceRegExp ) メソッドを活用しているだけですが)。

multiLinesEnable = true でも選択範囲が改行をふくまない1行内(論理行)であれば、optionEnable = false説明内容 でジャンプを実行します。


  • true なら、選択範囲が複数行でも「次/前の文字列を検索」と同様のジャンプができます。
※ 選択範囲が改行記号をふくむ複数行の状態からジャンプしたばあいは、highlightEnable = true であっても「検索文字列の強調表示」はされません(Mery 本体の仕様)。 また、Mery 本体の「自動マーカー」機能による強調表示もされません。
※ 選択範囲が改行記号をふくむ複数行の状態からジャンプしたばあいは、ジャンプ後に「検索」ダイアログ内のオプションフラグの設定状態をリセットします (Mery ベータ版 ver 3.0.1 以降の場合はオプションフラグをクリアしません / 2020/05/11: 第4版)。
  • false で選択範囲が複数行だったばあいは、選択範囲をいったん解除してから、あらためてキャレット付近の 単語 を自動選択して「次/前の文字列を検索」と同様のジャンプをします。


optionEnable = false のとき ▲

ダウンロード

ダウンロード >> 「ファイル:次/前の文字列を検索・改.zip

  • マクロ「次の文字列を検索・改.js」
  • マクロ「前の文字列を検索・改.js」
  • 専用アイコン(マテリアルデザインっぽいアイコン)


更新履歴
  • 2019/09/07(第1版)
  • 2019/09/09(第2版)
検索方向「次/前」を変数で指定
検索ヒット数のステータス表示機能を追加
ソースコードが長くなったので、ZIP 書庫をアップロード
  • 2019/12/01 - 2019/12/03(第3版)
「単語のみ検索する」にも対応させた
  • 2020/05/11(第4版)
Mery ver 3.0.1 で追加されたマルチカーソル機能(と矩形選択)への 対応・回避処理 を追加
※ Mery ver 2.x 上で実行したときの動作は 2019/12/03 版とおなじまま


ソースコード

#title   = "次の文字列を検索"
#tooltip = "次の文字列を検索・改"
// #icon = "select_next.ico"
// #icon = "Mery用 マテリアルデザインっぽいアイコン.icl",124

// #title   = "前の文字列を検索"
// #tooltip = "前の文字列を検索・改"
// #icon    = "select_previous.ico"
// #icon    = "Mery用 マテリアルデザインっぽいアイコン.icl",125

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

/**
 * ----------------------------------------------
 * 「次/前の文字列を検索・改」
 * sukemaru, (2018/07/19 - 2020/05/11)
 * https://www.haijin-boys.com/wiki/次/前の文字列を検索・改
 * ----------------------------------------------
 * 「次/前の文字列を検索」機能をカスタマイズ
 * 
 * ・検索強調なし、検索履歴なしでジャンプ可
 * ・複数行選択からの検索ジャンプに対応
 * ・「検索ヒット数表示(選択文字列)」マクロ(機能強化版)の関数を移植して
 *    ヒット数をステータス表示できるようにした
 * 
 * → 推奨: ショートカット [ Shift+Ctrl+ ↓ / ↑ ] に登録して置きかえる
 * 
 * ※ 複数行選択でジャンプした場合は、強制的に「検索強調なし」「検索履歴なし」
 * ※「検索履歴なし」では、最新の履歴が "空" になる
 * ※ 実行後は「検索/置換」ダイアログ内の「正規表現」オプションは OFF になる
 * 
 * 2020/05/11:
 * ※ Mery ver 3.0.x への対応(Mery ver 3.0.1 以上)
 * ・矩形選択・複数選択で optionEnable=true を強制適用
 * ・複数行検索で検索オプションを維持(定数 meFindKeepOptions を適用)
 */

var start = new Date();

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

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


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

var optionEnable = false;		// 推奨: false
  // true  なら、検索ダイアログの「正規表現」以外のオプションが適用される
  // false なら、検索オプションをリセットする
  // ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されない
  // ※Mery 3.0.1 以降で矩形選択や複数選択の状態からこのマクロを実行したときは、強制的に true を適用

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

var hitCountEnable = true;
  // true  なら、検索文字列の出現回数をステータスバーに表示する
  // false なら、検索ヒット数をステータスバーに表示しない
  // ※ 検索ダイアログのオプションフラグの状態を取得できないので、
  //    optionEnable = true のばあいでも、
  //    matchCaseEnable と onlyWordEnable のフラグを利用する


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

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

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

  var onlyWordEnable = false;
    // true  なら、選択範囲の文字列と一致する単語を検索する(半角英数のみのとき)
    // false なら、選択範囲の文字列を部分的にふくむ単語も検索対象にする
    // ※ true の場合、ジャンプ後も検索ダイアログの「単語のみ検索する」は ON のままにする
    // ※ 検索文字列に半角英数字以外の文字が含まれているときは、自動的に無効
    //   i.e. 非単語構成文字 /\W/ を含むなら無効( /^[A-Za-z0-9_]+$/ でのみ有効)

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

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


Redraw = false,  Status = "";
var d  = editor.ActiveDocument,  s = d.selection;
var st = s.Text;
var sy = ScrollY;

var meModeStream, meModeBox, meModeMulti;
var isSingleStream = ( ! meModeBox && ! meModeMulti );

var direction  = /^(?:next|down|true|1)$/i.test( String( findNext ) )
               ? meFindNext : meFindPrevious;
var findAround = findAroundEnable ? meFindAround : 0;
var matchCase  = matchCaseEnable  ? meFindReplaceCase : 0;
var onlyWord   = onlyWordEnable   ? meFindReplaceOnlyWord : 0;
var multiLines = ( multiLinesEnable && st.indexOf( "\n" ) > -1 );
var keepOptions = ( multiLines && meFindKeepOptions )
                ? meFindKeepOptions : 0;

// ※ ただし、複数行選択のときは強制オフ
onlyWord = ( multiLines || /\W/.test( st ) )
         ? 0 : onlyWord;

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

// 検索オプションをリセットして検索する場合
else {
  var flags = direction + findAround + matchCase + onlyWord;

  // 複数行選択では正規表現で検索(検索オプションを維持)
  if ( multiLines ) {
    s.Find( st.replace( /[.*+?^=!:${}()|[\]\/\\]/g, "\\$&" ),
            flags + meFindReplaceRegExp + keepOptions );
  }

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

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

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

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

// 検索ヒット数をステータス表示
st = s.Text;
var hitStatus = ( st && hitCountEnable )
              ? ( onlyWord )
                ? WordHitStatus( st, d.Text, matchCase ) + " reg "
                : HitStatus( st, d.Text, matchCase, countMinimum = false )
              : " ";
Status = hitStatus
       + ( Status ? " " + Status + " " : "" )
       + TimerStatus( new Date, start );

// 選択範囲変更イベントを発生させる
if ( isSingleStream && Status.indexOf( "すべての文章に" ) == -1 ) {
  var anc = s.GetAnchorPos(),  act = s.GetActivePos();
  s.SetActivePos( anc ),  s.SetActivePos( act, true );
}

Redraw = true;


// ---------- ▼ 関数 ▼ ---------- //

/**
 * 関数 TimerStatus( end, start )
 * start からの経過時間を [ s.sss 秒 ] で返す
 */
function TimerStatus( end, start ) {
  var elapsed = end - start;
  // start からの経過時間を [ s.sss 秒 ] で返す
  return " [ "
         + ( elapsed / 1000 ).toFixed( 3 ).replace( /\./, ". " )
         + " sec. ]";
}

/**
 * 関数 HitStatus( strSelection, strDocuText, matchCase, countMinimum )
 * 選択文字列の出現回数を返す
 * https://www.haijin-boys.com/wiki/検索ヒット数表示(選択文字列)#機能強化バージョン
 */
function HitStatus( word, docu, matchCase, countMinimum ) {
  word     = matchCase ? word : word.toLowerCase();
  docu     = matchCase ? docu : docu.toLowerCase();
  var s    = editor.ActiveDocument.selection;
  var tPos = Math.min( s.GetActivePos(), s.GetAnchorPos() );
  var count = 0,  hit = 0;
  var offset = countMinimum ? word.length : 1;
  var pos = docu.indexOf( word );
  while ( pos >= 0 ) {
    count ++;
    if ( pos == tPos ) { hit = count; }
    pos = docu.indexOf( word, pos + offset );
  }
  word = docu = "";
  return count ? ( "  ヒット数:" + count + " 件"
                   + " ( " + hit + " 件目 ) " 
                 ).replace( /(\d)(?=(?:\d{3})+(?!\d))/g, "$1," )
               : " ";
}

/**
 * 関数 WordHitStatus( strSelection, strDocuText, matchCase )
 * 選択文字列の出現回数を返す(※単語のみ検索)
 * https://www.haijin-boys.com/wiki/検索ヒット数表示(選択文字列)#機能強化バージョン
 */
function WordHitStatus( word, docu, matchCase ) {
  word      = word.replace( /[.*+?^=!:${}()|[\]\/\\]/g, "\\$&" );
  var s     = editor.ActiveDocument.selection;
  var bPos  = Math.max( s.GetActivePos(), s.GetAnchorPos() );
  var reg   = RegExp( "\\b" + word + "\\b", matchCase ? "g" : "gi" );
  var count = ( docu.match( reg ) || [] ).length;
  var hit   = ( docu.slice( 0, bPos ).match( reg ) || [] ).length;
  word = docu = "";
  return count ? ( "  ヒット数:" + count + " 件"
                   + " ( " + hit + " 件目 ) "
                 ).replace( /(\d)(?=(?:\d{3})+(?!\d))/g, "$1," )
               : " ";
}


メモ

  • 個人的には、通常の「次/前の文字列を検索」コマンドのショートカットキー [ Ctrl+Shift+ ↓ または ↑ ] は変更せず、このマクロ(検索強調なし)はツールバーアイコンからの実行専用にして、検索強調の要否で使い分けています。(sukemaru)
  • 「単語のみ検索する」にあわせた検索ヒット数表示用の関数 WordHitStatus() の正確度について、あまり自信がありません (ふだん「単語のみ検索」を利用していないため)。 なにがしかの問題または改善点を見つけた方は、Mery 公式フォーラム などからお知らせください。(sukemaru)




スポンサーリンク