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

提供:MeryWiki
ナビゲーションに移動 検索に移動
244行目: 244行目:


== メモ ==
== メモ ==
; [[マクロリファレンス:Selection インターフェイス#Find メソッド|Find()]] メソッドと [[マクロリファレンス:Selection インターフェイス#FindRepeat メソッド|FindRepeat()]] メソッドの定数
[[利用者:Sukemaru#Find() メソッドと FindRepeat() メソッドの 定数|個人的な覚え書き]] [[マクロリファレンス:Selection インターフェイス#FindRepeat メソッド|FindRepeat メソッド]] で「大文字と小文字を区別」や「末尾まで検索したら先頭から検索」オプションを使うために [[マクロリファレンス:Selection インターフェイス#Find メソッド|Find メソッド]] を併用する方法を書いてあります。(sukemaru)
<source lang="javascript">
document.selection.Find() メソッド
指定のパターンを検索します。
 
0: meFindPrevious カーソル位置から前を検索します。
1: meFindNext カーソル位置から次を検索します。
2: meFindReplaceCase 検索する単語の大文字と小文字を区別します。
4: meFindReplaceOnlyWord 完全に一致する単語を検索します。
8: meFindAround 文書の末尾まで検索したら先頭から検索を開始します。
16: meFindReplaceRegExp 正規表現で検索します。
 
 
document.selection.FindRepeat() メソッド
前回検索した文字列を検索します。
 
0: meFindPrevious カーソル位置から前を検索します。
1: meFindNext カーソル位置から次を検索します。
2: meFindRepeatWord 選択範囲が空の場合はカーソル位置の単語を検索します。
</source>

2019年9月8日 (日) 16:10時点における版

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


機能

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

設定項目: optionEnable

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

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


設定項目: highlightEnable

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

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



optionEnable = false のとき ▼

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


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


設定項目: multiLinesEnable

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

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

「次の文字列を検索・改」

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

/**
 * ------------------------------------
 * 「次の文字列を検索・改」
 * sukemaru, (2019/09/07)
 * ------------------------------------
 * 「次の文字列を検索」機能をカスタマイズ
 * 
 *  複数行選択から検索に対応
 * ※ 複数行からの場合は、検索強調なし、履歴なし
 */

// ---------- ▼ 設定項目 ▼ ----------
// optionEnable と highlightEnable 両方を false にすると、最新の検索履歴を空にする

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

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


// ▼ 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_NEXT_WORD = 2136 );
}

// 検索オプションをリセットして検索する場合
else {
  var findAround = findAroundEnable ? meFindAround : 0;
  var matchCase = matchCaseEnable ? meFindReplaceCase : 0;
  // 検索オプションをリセット
  s.Find( "", 1 + findAround + matchCase );

  // 複数行選択から検索する場合
  if ( multiLinesEnable && s.Text.indexOf( "\n" ) > -1 ) {
    s.Find( s.Text.replace( /\W/g, "\\$&" )
          , meFindNext + meFindReplaceRegExp + findAround + matchCase );
    s.Find( "", 1 + findAround + matchCase );
  }

  // 1行内の範囲選択または単語自動選択から検索する場合
  else {
    s.FindRepeat( meFindNext + meFindRepeatWord );
    if ( ! highlightEnable )  {
      s.Find( "", 1 + findAround + matchCase );
    }
  }
}

// 検索強調表示の有無
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 );


「前の文字列を検索・改」

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

/**
 * ------------------------------------
 * 「前の文字列を検索・改」
 * sukemaru, (2019/09/07)
 * ------------------------------------
 * 「前の文字列を検索」機能をカスタマイズ
 * 
 *  複数行選択から検索に対応
 * ※ 複数行からの場合は、検索強調なし、履歴なし
 */

// ---------- ▼ 設定項目 ▼ ----------
// optionEnable と highlightEnable 両方を false にすると、最新の検索履歴を空にする

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

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


// ▼ 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 );
  }

  // 1行内の範囲選択または単語自動選択から検索する場合
  else {
    s.FindRepeat( meFindPrevious + meFindRepeatWord );
    if ( ! highlightEnable )  {
      s.Find( "", 0 + findAround + matchCase );
    }
  }
}

// 検索強調表示の有無
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 );

メモ

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

スポンサーリンク