「
次/前の文字列を検索・改
」を編集中
2019年12月11日 (水) 01:42時点における
Sukemaru
(
トーク
|
投稿記録
)
による版
(
→
機能
)
(
差分
)
← 古い版
|
最新版
(
差分
) |
新しい版 →
(
差分
)
ナビゲーションに移動
検索に移動
警告: このページの古い版を編集しています。
公開すると、この版以降になされた変更がすべて失われます。
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
== 機能 == [https://www.haijin-boys.com/software/mery/mery-tips#2 ショートカットキー [ Ctrl+Shift+ ↓ または ↑ ]] の機能「[[ヘルプ:検索#次の文字列を検索|次/前の文字列を検索]]」コマンドをカスタマイズしたマクロです。 *「次/前の文字列を検索」コマンドでは、「検索/置換」ダイアログ内のオプションの ☑ 状態を適用したくない ('''適用したいオプション項目が決まっている''') *'''選択範囲が改行をふくむ複数行'''(論理行)のばあいでも「次/前の文字列を検索」と同様のジャンプ機能がほしい という個人的希望を実現する目論見です。 <br><br> ; ダウンロード >> 「[[メディア:次/前の文字列を検索・改.zip]]」(アイコン入り) <br><br> == 設定項目 == このマクロの特色(上記の <q>目論見</q>)を有効にするなら * '''''optionEnable''' = <b style="color:#c00;">false</b>'' * '''''multiLinesEnable''' = <b style="color:#0000c0;">true</b>'' での運用をお勧めします(その他の設定項目はお好みで)。 <br><br> ---- '''▼ 優先オプション ▼''' <br><br> ==== 設定項目: ''findNext'' ==== * <b style="color:#0000c0;">"Next"</b> なら「次(下)の文字列を検索」 * <b style="color:#c00;">"Prev"</b> なら「前(上)の文字列を検索」 : ※ 実際のところ "Next"、"Down"、true、1 のいずれかなら「次」、それ以外の値なら「前」になるようにしてあります。 : ※ ZIP 書庫を [[#ダウンロード|ダウンロード]] した場合、「次」と「前」ふたつの JS ファイルがあらかじめ用意されています。 <br> ==== 設定項目: ''optionEnable'' ==== 「検索」ダイアログのオプションフラグを使用するかしないかを指定します。 <br><br> * <b style="color:#0000c0;">true</b> なら、カスタマイズなしで、ショートカットキー [ Ctrl+Shift+ ↓ / ↑ ] の機能そのままに「次/前の文字列を検索」のジャンプを実行します。 : <u>[ Ctrl+Shift+ ↓ / ↑ ] の機能そのままでツールバーにマクロの '''アイコン''' を登録したいだけの場合は、<b style="color:#0000c0;">true</b> にしてください。</u> : ※「検索」ダイアログのオプションフラグ「大文字と小文字を区別する」や「文末まで検索したら文頭に移動する」が適用されます。 : ※ ジャンプした後も、「検索」ダイアログに検索文字列の履歴が残ります。 <br><div id="false"> * <b style="color:#c00;">false</b> なら、「検索」ダイアログのオプションフラグを一度リセットしてから「次/前の文字列を検索」と同様のジャンプを実行します。 : ※ リセット(解除)されるオプションフラグは、以下の4項目です。 :* 「大文字と小文字を区別する」 :* 「正規表現を使用する」 :* 「単語のみを検索する」 :* 「文末まで検索したら文頭に移動する」 : ※「大文字と小文字を区別する」「単語のみを検索する」「文末まで検索したら文頭に移動する」については、個別の変数をもうけて再設定可能にしてあります。 : ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されません。 : <span style="color:#c00;">※ 「検索」ダイアログのオプションフラグは、ジャンプの後も、マクロ実行前の状態に復旧されません。</span> このマクロの [[#false2|設定項目で指定した各オプションフラグ]] の ON/OFF 状態になります。 : ※ ジャンプの後、「検索」ダイアログに検索文字列の履歴を残しません。 : ※ '''false''' にすると「検索」ダイアログに検索文字列の最新の履歴は空になるので、つづけて <span style="color:#c00;">ショートカットキー操作での「次を検索 (F3)」と「前を検索 (Shift+F3)」のジャンプはできません</span>(検索ダイアログが開きます)。 <br> ==== 設定項目: ''highlightEnable'' ==== ジャンプした後に「'''検索文字列の強調表示'''」を残すかどうかを指定します。 * <b style="color:#0000c0;">true</b> なら、検索した文字列はハイライト状態のまま残ります。 : ※「検索文字列の強調を解除」のショートカットキーは [Alt+F3] ですので、任意のタイミングで手動で解除してください。 * <b style="color:#c00;">false</b> なら、検索した文字列のハイライトを残しません。 : ※「検索文字列の強調表示」を手動で解除するのが面倒な人は <b style="color:#c00;">false</b> にしてください。 : ※「自動マーカー」が有効なら自動マーカーによる強調表示は残ります。 <br> ==== 設定項目: ''hitCountEnable'' ==== マクロ「[[検索ヒット数表示(選択文字列)]]」の組み込み関数で、検索文字列の出現回数をステータスバーに表示させるかを指定します。 * <b style="color:#0000c0;">true</b> なら、検索ヒット数を表示します。 : ※ ヒット数のカウント方式は、基本的に Mery 標準の検索メソッドにあわせてありますが、検索ダイアログのオプションフラグに連動させることができないため '''''optionEnable''' = <b style="color:#0000c0;">true</b>'' の場合も '''''matchCaseEnable''''' と '''''onlyWordEnable''''' の設定でヒット数をカウントします。 : ※ '''''onlyWordEnable''''' (単語のみ検索) オプションが有効のときの正確度には問題があるかもしれません。 * <b style="color:#c00;">false</b> なら、検索ヒット数を表示しません。 : ※ 別途で「検索ヒット数表示」マクロのような「選択範囲が変更された時」にステータス表示するイベントマクロを使用しているばあいは、イベントマクロによってステータス表示が上書きされます。 <br> '''▲ 優先オプション ▲''' <br><br> ---- '''▼ ''optionEnable = <span id="false2" style="color:#c00;">false</span>'' のとき ▼''' <br><br> ==== 設定項目: ''findAroundEnable'' ==== * <b style="color:#0000c0;">true</b> なら、「'''文末まで検索したら文頭に移動する'''」オプションを有効化して、「次/前の文字列を検索」と同様のジャンプ機能を実行できます。 : ※ ジャンプ後も「検索/置換」ダイアログ内の「文末まで検索したら文頭に移動する」オプションは有効化されたままになります。 <br> ==== 設定項目: ''matchCaseEnable'' ==== * <b style="color:#0000c0;">true</b> なら、「'''大文字と小文字を区別する'''」オプションを有効化して「次/前の文字列を検索」と同様のジャンプ機能を実行できます。 : ※ ジャンプ後も「検索/置換」ダイアログ内の「大文字と小文字を区別する」オプションは有効化されたままになります。 <br> ==== 設定項目: ''onlyWordEnable'' ==== * <b style="color:#0000c0;">true</b> なら、「'''単語のみ検索する'''」オプションを有効化して「次/前の文字列を検索」と同様のジャンプ機能を実行できます。 : ※ ジャンプ後も「検索/置換」ダイアログ内の「単語のみ検索する」オプションは有効化されたままになります。 : <span style="color:#0000c0;">※ 実質的に「単語のみ検索」オプションが有効になるのは、検索文字列が「半角アルファベットと半角数字だけ」のときだけです。</span> 検索文字列にアンダーバー <q>_</q> 以外の記号や ascii 外の文字がふくまれるばあいは、'''''onlyWordEnable''' = <b style="color:#0000c0;">true</b>'' であっても「単語のみ」オプションの ON/OFF 状態は無視されます(Mery 本体の仕様)。 <br> ==== 設定項目: ''multiLinesEnable'' ==== '''選択範囲が改行をふくむ複数行のばあい'''でも「次/前の文字列を検索」と同様のジャンプを可能にするための独自オプションです (Mery 本体の機能として用意されている <syntaxhighlight lang="javascript" inline style="white-space:nowrap">Document.Selection.Find( str, meFindReplaceRegExp )</syntaxhighlight> メソッドを活用しているだけですが)。 : '''''multiLinesEnable''' = <b style="color:#0000c0;">true</b>'' でも選択範囲が改行をふくまない1行内(論理行)であれば、'''''optionEnable''' = <b style="color:#c00;">false</b>'' の [[#false|説明内容]] でジャンプを実行します。 <br> * <b style="color:#0000c0;">true</b> なら、選択範囲が複数行でも「次/前の文字列を検索」と同様のジャンプができます。 : ※ 選択範囲が改行記号をふくむ複数行の状態からジャンプしたばあいは、'''''highlightEnable''' = <b style="color:#0000c0;">true</b>'' であっても「検索文字列の強調表示」はされません(Mery 本体の仕様)。 * <b style="color:#c00;">false</b> で選択範囲が複数行だったばあいは、選択範囲をいったん解除してから、あらためてキャレット付近の <u>単語</u> を自動選択して「次/前の文字列を検索」と同様のジャンプをします。 <br> '''▲ ''optionEnable = <span style="color:#c00;">false</span>'' のとき ▲''' <br><br> == ダウンロード == ダウンロード >> 「[[ファイル:次/前の文字列を検索・改.zip]]」(アイコン入り) == ソースコード == * 2019/09/07(第1版) * 2019/09/09(第2版) : 検索方向「次/前」を変数で指定 : 検索ヒット数のステータス表示機能を追加 : ソースコードが長くなったので、ZIP 書庫をアップロード * 2019/12/01 - 2019/12/03(第3版) : 「単語のみ検索する」にも対応させた <source lang="javascript"> #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 - 2019/12/03) * ---------------------------------------------- * 「次/前の文字列を検索」機能をカスタマイズ * * ・検索強調なし、検索履歴なしでジャンプ可 * ・複数行選択からの検索ジャンプに対応 * ・「検索ヒット数表示(選択文字列)」マクロ(機能強化版)の関数を移植して * ヒット数をステータス表示できるようにした * * → 推奨: ショートカット [ Shift+Ctrl+ ↓ / ↑ ] に登録して置きかえる * * ※ 複数行選択でジャンプした場合は、強制的に「検索強調なし」「検索履歴なし」 * ※「検索履歴なし」では、最新の履歴が "空" になる * ※ 実行後は「検索/置換」ダイアログ内の「正規表現」オプションは OFF になる */ var start = new Date(); // ---------- ▼ 設定項目 ▼ ---------- // ■ 検索する方向 ( 次: "Next" / 前: "Prev" ) var findNext = "Next"; /* optionEnable, highlightEnable 両方を false にすると、検索履歴に残さない */ var optionEnable = false; // 推奨: false // true なら、検索ダイアログの「正規表現」以外のオプションが適用される // false なら、検索オプションをリセットする// 推奨: false // ※「終了したら閉じる」と、ベータ版 2.6.10 で追加された「インクリメンタルサーチ」のオプションフラグは解除されない 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 のままにする // ※ 検索文字列に半角英数字以外の文字が含まれているときは、実質的に無効 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 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 ); onlyWord = ( multiLines || /\W/.test( st ) ) ? 0 : onlyWord; // 検索オプションを適用して検索する場合 ※「次/前の文字列を検索」コマンド if ( optionEnable ) { editor.ExecuteCommandByID( 2137 - direction ); // editor.ExecuteCommandByID( MEID_SEARCH_NEXT_WORD = 2136 ); // editor.ExecuteCommandByID( MEID_SEARCH_PREV_WORD = 2137 ); } // 検索オプションをリセットして検索する場合 else { var flags = direction + findAround + matchCase + onlyWord; // 複数行選択では正規表現で検索 if ( multiLines ) { s.Find( st.replace( /[.*+?^=!:${}()|[\]\/\\]/g, "\\$&" ), flags + meFindReplaceRegExp ); } // 1行内の範囲選択または単語自動選択からの検索 else { // 検索オプションをリセットして「次/前の文字列を検索」 s.Find( "", flags ); s.FindRepeat( direction + meFindRepeatWord ); } // 検索文字列を検索履歴から消す if ( multiLines || ! highlightEnable ) { s.Find( "", flags ); } } st = s.Text; // 検索強調表示の有無 d.HighlightFind = highlightEnable; // スクロール位置を調整 ScrollY = ( ScrollY == sy ) ? sy : s.GetActivePointY( mePosView ); // 検索ヒット数をステータス表示 var hitStatus = ( st && hitCountEnable ) ? ( multiLines || /\W/.test( st ) || ! onlyWord ) ? HitStatus( st, d.Text, matchCase, countMinimum = false ) : WordHitStatus( st, d.Text, matchCase ) : " "; Status = hitStatus + ( Status ? " " + Status + " " : "" ) + TimerStatus( new Date, start ); // 選択範囲変更イベントを発生させる 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 next = countMinimum ? word.length : 1; var pos = docu.indexOf( word ); while ( pos >= 0 ) { count ++; if ( pos == tPos ) { hit = count; } pos = docu.indexOf( word, pos + next ); } 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 = new 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," ) : " "; } </source> == メモ == *個人的には、通常の「次/前の文字列を検索」コマンドのショートカットキー [ Ctrl+Shift+ ↓ または ↑ ] は変更せず、このマクロ(検索強調なし)はツールバーアイコンからの実行専用にして、検索強調の要否で使い分けています。(sukemaru) *[[利用者:Sukemaru#Find() メソッド と FindRepeat() メソッド の 定数|個人的な覚え書き]] のページに [[マクロリファレンス:Selection インターフェイス#FindRepeat メソッド|FindRepeat メソッド]] で「大文字と小文字を区別」や「末尾まで検索したら先頭から検索」オプションを使うために [[マクロリファレンス:Selection インターフェイス#Find メソッド|Find メソッド]] を併用する方法の説明を書いています。(sukemaru) *「単語のみ検索する」にあわせた検索ヒット数表示用の関数 ''WordHitStatus()'' の正確度について、あまり自信がありません (ふだん「単語のみ検索」を利用していないため)。 なにがしかの問題または改善点を見つけた方は、[https://www.haijin-boys.com/discussions Mery 公式フォーラム] などからお知らせください。(sukemaru) <br> ---- <br>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク