自動マーカーについて

  1. >>Kuro さん
    マクロでつくった選択範囲の文字列をつねに自動マーカーの対象にしていただきたいのですが、いかがでしょうか?
    気がついたかぎりでは、最終的に SetAnchorPos() で選択範囲を確定するパターンで自動マーカーが利かないようです。(Mery 2.6.12)

    たとえば以下のようなマクロを実行して「Mery」という文字列を選択状態にしたとき、文書内にあるほかの「Mery」という単語は自動マーカーによる強調表示がされませんでした。

    #title = "TEST"
    var str = "Mery";
    document.selection.Text = str;
    document.selection.SetAnchorPos( document.selection.GetActivePos() - str.length );

    さいごの行を SetAnchorPos() から GetActivePos( true ) や CharLeft( true ) にすると自動マーカーは利くようです。

    #title = "TEST"
    var str = "Mery";
    document.selection.Text = str;
    document.selection.SetActivePos( document.selection.GetActivePos() - str.length, true );
    #title = "TEST"
    var str = "Mery";
    document.Write( str );
    document.selection.CharLeft( true, str.length );

    CharLeft( true ) は以前質問させていただいたように折り返し表示との相性問題がありますし、アンカーとキャレットの前後関係を選択的にかつシンプルに記述するうえで SetAnchorPos() を最後に置きたい状況もあるとおもうのです。 :(

    また、以下のような「次の文字列を検索」して「検索文字列の強調を解除」するマクロのばあい、検索ハイライトを消したあとに残った選択範囲とおなじ文字列は自動マーカーにより強調されるようです。

    #title = "TEST"
    document.selection.FindRepeat( meFindNext + meFindRepeatWord );
    document.HighlightFind = false;

    ご確認とご検討をよろしくお願いします。

     |  sukemaru  |  返信
  2. マクロライブラリ >> キーアサイン集 >> 「選択範囲の始点終点を交替」マクロ
    https://www.haijin-boys.com/wiki/キーアサイン集#選択範囲の始点終点を交替
    は SetAnchorPos() を後ろに置いているパターンだったので、以下のように SetActivePos( true ) が後ろになるよう書きかえてみましたが、実行すると自動マーカーのハイライトは解除されてしまいました…。 :o
    SetAnchorPos() が後ろだからという条件だけではないようですね。

    with ( document.selection ) {
      var anp = GetAnchorPos();
      var acp = GetActivePos();
      SetAnchorPos( acp );
      SetActivePos( anp, true );
    }
     |  sukemaru  |  返信
  3. > 気がついたかぎりでは、最終的に SetAnchorPos() で選択範囲を確定するパターンで自動マーカーが利かないようです。(Mery 2.6.12)

    自動マーカーが発動するのは「キャレットが移動」したときのみです。
    SetAnchorPos メソッドはキャレットを動かしませんので、自動マーカーも発動しないです。

    エディタエンジンの仕様上、キャレットの移動はメッセージが飛んでくるのでキャッチできるのですが、選択範囲の移動はキャッチできないので、対応は困難かと思います。

    ご不便をおかけして申し訳ございませんが、SetActivePos などで代用いただけますようお願い申し上げます。

     |  Kuro  |  返信
  4. 追伸: 根本的な改善にはなりませんが、対症療法としてマクロを実行したあとに強制的に 1 度だけ自動マーカーの更新処理を入れるという対応でよければ実装可能です。

     |  Kuro  |  返信
  5. >>Kuroさん
    ご返信、ありがとうございます。
    > 追伸: 根本的な改善にはなりませんが、対症療法としてマクロを実行したあとに強制的に 1 度だけ自動マーカーの更新処理を入れるという対応でよければ実装可能です。
    「Redraw = true; をスイッチにできないでしょうか?」 とお願いしようかとおもっていたのですが、「マクロの実行後」を強制スイッチにするというのはとてもシンプルで素敵ですね。ぜひお願いします! :D

    先の「選択範囲の始点終点を交替」マクロは

    with (document.selection) {
      var anp = GetAnchorPos();
      var acp = GetActivePos();
      SetActivePos( acp );	
      SetActivePos( anp, true );
    }

    とすることで解決しましたが、Text = "hoge" や Write( "hoge" ) でテキストを操作するマクロだとやはりシンプルに SetAnchorPos( GetActivePos() - "hoge".length ) と記述したいところです(というか、自前のマクロはそんなのばっかりでして)。
    または StrtOfLine() をはさんでから操作した文字列を選択範囲にしなおせば自動マーカーが利くようでしたが、キャレット位置取得の変数とかものすごく無駄な行が増えてしまい、自作マクロのデタラメなコードがさらにカオスなことに… :(

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

    > 「Redraw = true; をスイッチにできないでしょうか?」 とお願いしようかとおもっていたのですが、「マクロの実行後」を強制スイッチにするというのはとてもシンプルで素敵ですね。ぜひお願いします! :D

    Redraw プロパティ、なんでもできる万能っ子みたいな扱いになってる!?(w

    マクロ実行中は自動マーカーの動作は見えませんから、マクロ実行後に自動更新で良さそうですね。では、次のバージョンでは対応しておきます。

    > または StrtOfLine() をはさんでから操作した文字列を選択範囲にしなおせば自動マーカーが利くようでしたが、キャレット位置取得の変数とかものすごく無駄な行が増えてしまい、自作マクロのデタラメなコードがさらにカオスなことに… :(

    確かに、自動マーカーの発動までを考慮してマクロを書くと大変ややこしいことになりそうですね ^^;

    次のバージョンの公開日程はまだちょっと決まっていないのですが、年内には公開できると思いますので、作成中のマクロは差し支えなければ、「自動マーカーの更新」は考慮しない状態でお作りくださいませ。

     |  Kuro  |  返信
  7. > マクロ実行中は自動マーカーの動作は見えませんから、マクロ実行後に自動更新で良さそうですね。では、次のバージョンでは対応しておきます。
    > 次のバージョンの公開日程はまだちょっと決まっていないのですが、年内には公開できると思いますので、作成中のマクロは差し支えなければ、「自動マーカーの更新」は考慮しない状態でお作りくださいませ

    You are the Boss!!
    ありがとうございます。 :)
    是非ぜひよろしくお願いします。

    > Redraw プロパティ、なんでもできる万能っ子みたいな扱いになってる!?(w
    マクロ終了をスイッチに、というのもお願いする案として思い浮かんだのですが、undo がらみで将来的に Redraw に手を入れるのかもしれないから便乗するかたちで… みたいな。
    こんなニッチなお願いにまさか次のバージョンで対応していただけるとは思いもしませんでした。 :D

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