検索ダイヤログの入力欄でマクロが使えない

  1. 以前フォーラムで教えて頂いた以下のマクロを、Ctrl-C,Ctrl-Xに割り当てて便利に使用しています。
    しかし、検索ダイヤログの検索する文字列の入力欄では、割り当てたマクロが動作していないことに今更気が付きました。
    検索ダイヤログのキーバインドをマクロで上書きすることはできないでしょうか?

    #title = "コピー"
    #tooltip = "選択範囲が空の場合は、単語を選択してコピーする。"
    #include "Common.js"
    /*
    Copyright (c) Kuro. All rights reserved.
    Licensed under the MIT License.
    */
    var sel = document.selection;
    
    // 選択範囲が空の場合は、単語を選択する
    if (sel.IsEmpty) {
        sel.SelectWord();
    }
    
    sel.Copy();
    
    #title = "カット"
    #tooltip = "選択範囲が空の場合は、行末まで選択してカットする。"
    #include "Common.js"
    /*
    Copyright (c) Kuro. All rights reserved.
    Licensed under the MIT License.
    */
    var sel = document.selection;
    
    // 選択範囲が空の場合は、行末まで選択する
    if (sel.IsEmpty) {
        sel.EndOfLine(true, mePosLogical);
    }
    
    sel.Cut();
    

    別件追記
    PCRE2版正規表現の試用を続けていますが、自分の使い道では全く問題がなく拍子抜けです(おい)
    今のところの体感では、レスポンス、速度とも鬼雲鬼車と違いは判りませんでした。

    Meryを使い続けて今さらですが、正規表現無効時もグロブを*と?だけでも使えるオプションが欲しいと思いました。
    正規表現の使い方が難しいという方でも、*と?だけならすぐに使えるはず。

     |  enaka  |  返信
  2. ご愛用いただきありがとうございます。

    > 検索ダイヤログのキーバインドをマクロで上書きすることはできないでしょうか?

    現状の仕様では、検索ダイアログ内の入力欄に対してマクロのキーバインドを上書きすることはできません。

    検索ダイアログの入力欄には Windows 標準のコンボボックスを使用しています。

    また、現在のマクロ API はエディタ本体の編集領域を対象としているため、検索ダイアログの入力欄を操作することはできません。

    そのため、仮にキーバインドを上書きできたとしても、マクロ内で使用されている document.selection をそのまま検索ダイアログの入力欄に適用することはできません。

    さらに、Windows 標準のコンボボックスには SelectWord() のようなエディタ固有の機能も存在しないため、同様の操作をそのまま再現することは難しい状況です。

    一方で、Windows 標準のコントロールということもあり、AutoHotkey などの外部ツールからであれば操作できると思います。

    > PCRE2版正規表現の試用を続けていますが、自分の使い道では全く問題がなく拍子抜けです(おい)

    PCRE2 の動作検証にご協力いただき、ありがとうございます。

    鬼雲・鬼車とは Mery 側の実装が大きく異なりますが、特に問題なくご利用いただけているとのことで安心しました。

    PCRE2 は JIT コンパイルに対応しているため、条件が合えばかなり高速に動作します。

    とはいえ、鬼車も十分高速なので、通常の利用では速度差を体感することは少ないかもしれません。私自身も違いはほとんど分かりません😅

    ただ、後方検索では検索方法の都合上、正規表現の内容によってはバックトラックが増えて処理時間が長くなることがあります。

    そのため、極端なケースに備えて検索をキャンセルできる仕組みについては、今後の課題の一つだと考えています。

    また、PCRE2 が持つ先頭文字情報やビットマップ情報を活用することで、検索前の絞り込み処理をある程度最適化できる可能性も見えてきました。

    あとは置換後文字列ですね。

    鬼車には置換文字列の仕様がないため、\1\k<name> などを利用できるよう独自実装しています。

    一方、PCRE2 では $1${n}$`$'$_$+${*MARK} に加え、JavaScript 互換の $<name> なども用意されているようなので、このあたりへの対応も検討しています。

    > Meryを使い続けて今さらですが、正規表現無効時もグロブを*と?だけでも使えるオプションが欲しいと思いました。

    ワイルドカードですね。確かに、正規表現に慣れていない方にとっては、ワイルドカードの方が直感的で分かりやすい面もあると思います。

    MS Word が現在でも正規表現ではなくワイルドカード方式を採用していることを考えると、一定の需要はあるのかもしれません。

    ただ、ワイルドカードも *? だけでなく、[abc][a-z] のような表現もあるようで、簡易的な正規表現に近いものと言えそうです。

    正規表現はすでにワイルドカード的な表現をカバーしているので、機能としてはワイルドカードの上位互換になります。

    そのため、対応するとしても、秀丸エディタさんのように「よくある質問」などで正規表現の基本的な使い方を案内するだけでも十分かもしれません。

    【参考】ワイルドカードと同等の検索をしたい場合(Ver9.52対応版)
    https://help.maruo.co.jp/hidemaru/html/190_CmdSearch_Regular_Wildcard.html

    ちなみに、実装方法についても検討してみました。

    「正規表現技術入門」を読了したので、自前でワイルドカード、つまり「なんちゃって正規表現」エンジンをゼロから作るのも面白そうだなとは思いますが、実用機能としてはなかなか難しそうです🤔

    他に考えられるのは、正規表現として解釈される文字をエスケープした上で、*.* に、?. に変換して正規表現エンジンに丸投げする方法ですね。

    その場合は、文字クラスやエスケープ記法など、ワイルドカード特有の仕様をどこまでサポートするかが悩ましいところです。

    それから、すでに正規表現を使っているユーザーさんからすると、ワイルドカード自体が不要な機能になってしまうため、オプション項目として場所を取ることに対して反対意見もありそうです。

    [正規表現] オプション自体を [ワイルドカード] オプションに置き換えるという案も考えられますが、正規表現とワイルドカードを使い分けたいケースを考えると悩ましいところです。

    というわけで、これまでのところ「正規表現は使わないが、ワイルドカードなら使いたい」というご要望はいただいたことがなく、実際にどの程度の需要があるのかは判断が難しいところです。

    以上を踏まえると、現時点では正規表現機能に集約する方がシンプルで分かりやすいと考えています。

    ワイルドカードオプションについては、今後のご要望や実装コストとのバランスを見ながら検討したいと思います。

     |  Kuro  |  返信
  3. 回答ありがとうございます。

    > 現状の仕様では、検索ダイアログ内の入力欄に対してマクロのキーバインドを上書きすることはできません。

    わかりました。
    今まで気が付かなかったぐらいなので、できなくても大した問題ではないです(笑)

    > PCRE2 は JIT コンパイルに対応しているため、条件が合えばかなり高速に動作します。
    >
    > とはいえ、鬼車も十分高速なので、通常の利用では速度差を体感することは少ないかもしれません。私自身も違いはほとんど分かりません😅

    確かに少し複雑な正規表現で再度同じ検索をすると、ちょっと早くなっている気がしないでも。

    > 一方、PCRE2 では `$1` や `${n}`、`` $` ``、`$'`、`$_`、`$+`、`${*MARK}` に加え、JavaScript 互換の `$<name>` なども用意されているようなので、このあたりへの対応も検討しています。

    複雑な語順の入れ替え等をしようとしたとき、訳が分からなくなることがあるので、これはうれしいです。

    > というわけで、これまでのところ「正規表現は使わないが、ワイルドカードなら使いたい」というご要望はいただいたことがなく、実際にどの程度の需要があるのかは判断が難しいところです。

    正規表現「を」対象に検索する際、エスケープが複雑でなかなか思い通りにヒットしないことがあり、単純なワイルドカードがあれば簡単にできると考えていました。
    [...]まで含めると、おっしゃる通り正規表現のみでいいと思います。

    > ワイルドカードオプションについては、今後のご要望や実装コストとのバランスを見ながら検討したいと思います。

    単純にSystem.Masks.TMaskを呼ぶだけとは済みませんが、OpenBSD由来のlibglobを見る限りやることは意外と単純。
    https://github.com/void-linux/libglob

     |  enaka  |  返信
  4. ご返信ありがとうございます。

    > 正規表現「を」対象に検索する際、エスケープが複雑でなかなか思い通りにヒットしないことがあり、単純なワイルドカードがあれば簡単にできると考えていました。

    なるほど、そういった用途でしたか。

    ワイルドカードほど単純ではありませんが、Mery では \Q\E を使って正規表現のメタ文字を無効化できます。これを利用すると、個別にエスケープしなくても検索できます。

    【参考】正規表現でメタ文字を無効化する機能
    https://www.haijin-boys.com/software/mery/mery-3-4-0#3

    PCRE2 では標準機能として提供されていますが、鬼雲・鬼車でも利用できるようにしているので、よろしければお試しください。

    > 単純にSystem.Masks.TMaskを呼ぶだけとは済みませんが、OpenBSD由来のlibglobを見る限りやることは意外と単純。

    そうですね。私も少し調べてみましたが、ワイルドカードのマッチング処理そのものは比較的シンプルそうですね。

    ただ、これらは基本的に文字列がパターンに一致するかを判定するためのものなので、テキストの中から一致する部分文字列を探すという Mery の検索機能とは少し性質が異なります。

    そのため、単純に 1 文字ずつ進めてマッチングを繰り返すような実装では検索速度が厳しくなりそうです。

    正規表現エンジンで使われているような各種の検索最適化を行わないと、実用的な速度を出すのは難しいかもしれません。

    とはいえ、正規表現そのものを検索したい場合など、ワイルドカード検索のほうが扱いやすい場面があるというご意見は参考になりました。

    現時点では需要がどの程度あるのか分かりませんが、今後の開発の参考にさせていただきたいと思います。

     |  Kuro  |  返信
  5. > ワイルドカードほど単純ではありませんが、Mery では `\Q` と `\E` を使って正規表現のメタ文字を無効化できます。これを利用すると、個別にエスケープしなくても検索できます。

    完全に忘却していました。駝鳥頭だから忘れるまでが速いこと速いこと。

    あと、レスポンスがよくなったのは、KB5089573のおかげもあるかもしれません。
    CPUターボ処理が賢くなったためか、以下のCopilot Keyboardでは常用してもいいかもと思えるくらいになりました。

    https://download.microsoft.com/download/6eebb215-87ad-4425-a54e-7772d028b6c7/CopilotKeyboard_x64_1.0.0.7575.msi

     |  enaka  |  返信
  6. ご返信ありがとうございます。

    \Q\E は比較的マイナーな機能なので、忘れてしまうのも無理はないかもしれません。

    私はたまたま正規表現を勉強していた時期だったので覚えていただけです。

    しかし、勉強中の正規表現は検索履歴から消えてしまうと、もう思い出せませんね。

    検索ダイアログの [検索する文字列] に [お気に入り] 機能でも付けようかしら…

    > あと、レスポンスがよくなったのは、KB5089573のおかげもあるかもしれません。

    KB5089573 の影響については興味深いですね。

    Copilot Keyboard は某エリンギ雑談以来そっとアンインストールしてしまいましたが、軽くなっているのであれば試してみる価値はありそうですね。

    サイトを見てみたら、カイルくん復活してるし!

    最初からカイルくんを入れていたら叩かれそうですが、知らないキャラクターばかりの中に後から追加されると「おっ!」となるので、不思議なものです。

    とはいえ、まだインストールする覚悟はしていません😅

    メイン PC をクリーンインストールしたばかりなので、できれば汚したくないところです…。

     |  Kuro  |  返信
スポンサーリンク