「
次/前の文字列を検索・改
」を編集中 (節単位)
ナビゲーションに移動
検索に移動
警告:
ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。
ログイン
または
アカウントを作成
すれば、あなたの編集はその利用者名とともに表示されるほか、さまざまなメリットもあります。
スパム攻撃防止用のチェックです。 決して、ここには、値の入力は
しない
でください!
=== ソースコード === <syntaxhighlight lang="javascript" style="height:80em; overflow:auto;"> #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-12) * 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, meFindKeepOptions; var isSingleStream = ( ! meModeStream || s.Mode == meModeStream ); 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," ) : " "; } </syntaxhighlight>
編集内容の要約:
MeryWikiへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細は
MeryWiki:著作権
を参照)。
著作権保護されている作品は、許諾なしに投稿しないでください!
このページを編集するには、下記の数式を計算してその答えを欄に入力してください (
ヘルプ
):
いちたすには =
キャンセル
編集ヘルプ
(新しいウィンドウで開きます)
スポンサーリンク
ナビゲーション メニュー
個人用ツール
ログインしていません
トーク
投稿記録
アカウント作成
ログイン
名前空間
ページ
議論
日本語
表示
閲覧
編集
履歴表示
その他
検索
スポンサーリンク
スポンサーリンク
案内
メインページ
ヘルプ
よくある質問
マクロリファレンス
マクロライブラリ
プラグインライブラリ
構文ファイル
テーマ
寄付・開発支援
練習用ページ
開発室
開発者のブログ
ツール
スポンサーリンク