【報告】マルチカーソル解除

  1. マルチカーソルの解除方法については『マルチカーソル実装によるマクロなどへの影響』スレッドでKuroさんから

    > document.selection.SetActivePos(0, true); などのカーソル位置を絶対値で指定するメソッドはマルチカーソルを解除して移動します。

    このように案内されていましたし、doMultiAction()内でもシングルカーソル動作のための解除に使用されています。ただ、元々のカーソル位置と新しく設定するカーソル位置がピッタリ同じ場合、解除できないパターンが有るようです

    s.SetActivePos(s.GetActivePos(),true);	// 解除される
    s.SetActivePos(s.GetActivePos(),false);	// 解除されない
    s.SetActivePos(s.GetActivePos());		// 解除されない
    

    フラグ指定がtrueの場合だとどんな場合でも解除できるようです
    falseや省略した場合にカーソルが移動しなかった場合はマルチカーソルを解除できません。カーソルが移動すればfalseや省略でも解除できるようです。

    trueの元々の意味は『文字を選択した状態で移動する≒アンカーを維持する』、falseはその逆なので、意味合い的には役割が逆転しているようにも感じますが、とはいえそもそもマルチカーソル解除のためのメソッドではないのだし、意味合いとかそういうアレでもなさそうですが、一応報告でした。

     |  シリル  |  返信
  2. ご報告ありがとうございます。

    > > document.selection.SetActivePos(0, true); などのカーソル位置を絶対値で指定するメソッドはマルチカーソルを解除して移動します。

    doMultiAction を投稿した時点ではマルチカーソルを解除する方法がそれぐらいしかなかったためですね ^^;

    > このように案内されていましたし、doMultiAction()内でもシングルカーソル動作のための解除に使用されています。ただ、元々のカーソル位置と新しく設定するカーソル位置がピッタリ同じ場合、解除できないパターンが有るようです

    混乱を招くような試作品を投稿してしまい申し訳ございません。

    doMultiAction はまだマクロのマルチカーソル対応の方向性が見えていない段階でひとつの案として投稿させていただいたものなので、その中で使用している記述はそれを推奨するものではありません。

    もう御覧いただいていると思いますが、doMultiAction は別のスレッドでさらなる改良が施されてますねー。ワクワク ^^

    SetActivePos はもともとカーソルの移動が伴わない場合は何もしない仕様なので、この仕様は互換性維持のため従来どおりとしています。(変にマルチカーソル仕様を混ぜると余計にややこしくなりそうです)

    マルチカーソルの解除方法につきましては、Ver 3.0.1 でマクロ仕様を追加しています。

    マルチカーソルを解除する場合は、

    document.selection.Clear();
    

    か、

    document.selection.Mode = meModeStream;
    

    を使っていただくと確実です。

    2 つはほぼ同じですが、document.selection.Clear(); は通常選択も解除しますが、document.selection.Mode = meModeStream; は、通常選択のみの場合は何もしません。

    > マルチカーソル解除のためのメソッドではないのだし、意味合いとかそういうアレでもなさそうですが、一応報告でした。

    そうなんですよね。すべてのメソッドをマルチカーソルを考慮した仕様に変更しているわけではなくて、たまたまマルチカーソルが解除されるからサンプルマクロで使っちゃっただけでした、すみません… ^^;

    いずれにせよマクロによるマルチカーソルの操作は非常に大きな課題だと考えています。

    多くのエディターではまだ実現されていない領域なので、これが簡単にできるような仕組みを考えるのは楽しいです。(やっぱ無理ですわーってなるかもですがw

    現在、Ver 3.0.1 以降のマクロ仕様を整理したマクロリファレンス (試験的な機能も含む) を書いているところです。

    この土日は外出自粛するので作業が捗ると思います。

     |  Kuro  |  返信
  3. お返事ありがとうございます

    > 混乱を招くような試作品を投稿してしまい申し訳ございません。

    いいえ、とんでもない!スマートでシンプルな冴えたやり方だと思います、インクルードしてコールバック!

    > もう御覧いただいていると思いますが、doMultiAction は別のスレッドでさらなる改良が施されてますねー。ワクワク ^^

    はい、見てました。アンカーとアクティブ、どっちか前でどっちか後ろかなど考えていると単純なことのはずなのにプシューと頭が回らなくなります。なんだろう歳のせいでしょうか?オーバーヒートする感じじゃなくて思考しようとしたことがスーッと消えていくようなこの感じ……

    > document.selection.Clear();

    あっ!!!そうでしたすみません。知ってたはずでした。これを見た時、Clearって削除じゃないよね、たぶん解除だよね、後で確認しておこっと思ったはずなのにすっかり忘れていました。ごめんなさい。

    今、使ってみて解除されることを確認しました。
    Collapse()なんかは複数範囲が解除されつつもマルチカーソルは残るという良い感じです

    念力を使ってコマンドIDを調査してみた所、2257が『すべて検索して選択』かな、むっ2260が不思議な挙動をするな、うっ頭が、というところで終わりました

    > いずれにせよマクロによるマルチカーソルの操作は非常に大きな課題だと考えています。
    >
    > 多くのエディターではまだ実現されていない領域なので、これが簡単にできるような仕組みを考えるのは楽しいです。(やっぱ無理ですわーってなるかもですがw
    >
    > 現在、Ver 3.0.1 以降のマクロ仕様を整理したマクロリファレンス (試験的な機能も含む) を書いているところです。
    >
    > この土日は外出自粛するので作業が捗ると思います。

    ちょー楽しみにしています私も出来る限り頑張りますが、無理しないでくださいね
    最近私はペペロンチーノを作る時オリーブオイルのソースの中にサラダ用の和風ごまドレッシングを入れてます

    <ついでにちょこっと今さら聞けない質問>
    iniファイルってコメント書けましたっけ?

     |  シリル  |  返信
  4. 横から失礼します。

    > コマンドIDを調査してみた所、2257が『すべて検索して選択』かな、むっ2260が不思議な挙動をするな、
    私も「コンパクトメニュー」マクロ用に調べました。
    ※ 定数リテラルっぽい記述部分にはとりあえず Mery.ini の [Keyboard] セクション内の "HogeFugaAction=" のものをつっこんであるだけで "定数リテラル" ではありません、変数です。 :|

     
    // 2.7.5
    editor.ExecuteCommandByID( FileCloseOthers = 2249 );	// ●他のタブをすべて閉じる
    editor.ExecuteCommandByID( FileCloseLeft = 2250 );		// ●左のタブをすべて閉じる
    editor.ExecuteCommandByID( FileCloseRight = 2251 );		// ●右のタブをすべて閉じる
    
    // 2.8.0
    editor.ExecuteCommandByID( ViewMacrosBarLabels = 2252 );	// ●マクロのラベルを表示
    
    // 2.8.7
    editor.ExecuteCommandByID( FileNewGroup = 2253 );		// ●新しいウインドウに移動
    
    // 3.0.0
    editor.ExecuteCommandByID( EditSplitSelIntoLines = 2254 );		// ●選択範囲を行に分ける
    editor.ExecuteCommandByID( EditAddCursorToNextLine = 2255 );	// ●次の行にカーソルを追加
    editor.ExecuteCommandByID( EditAddCursorToPrevLine = 2256 );	// ●前の行にカーソルを追加
    editor.ExecuteCommandByID( SearchFindAllAndSelect = 2257 );		// ●すべて検索して選択
    editor.ExecuteCommandByID( SearchAddNextMatch = 2258 );			// ●選択範囲に次の候補を追加
    editor.ExecuteCommandByID( SearchSkipCurrentMatch = 2259 );		// ●スキップして次の候補を追加
    editor.ExecuteCommandByID( SearchUndoSelection = 2260 );		// ●選択範囲を元に戻す
    editor.ExecuteCommandByID( SearchRedoSelection = 2261 );		// ●選択範囲をやり直し
    

    > iniファイルってコメント書けましたっけ?
    以前、隠しオプションとか直接編集した部分にコメントつけようとしたことがありますが、書けないみたいでした(書いても Mery.ini の内容が Mery 側から更新されるときに消し飛ぶ)。
    Mery を起動している状態でもセクションやキーの前後関係の入れかえをして上書き保存をすれば並び順は維持されるようなので、頻繁に(?)参照/編集する項目を上のほうにしたりしてます。
    あと、 Mery 本体の [オプション] や各種ダイアログ、メニュー項目などから変更できないキー(隠しオプションなど)は、Mery の起動中に値を変更しても再起動後に書き戻されないことが多いようです。

    >> @Kuro さん
    editor.ExecuteCommandByID() 用の引数についてですが、Plugin.h 内の「SQL整形」 MEID_TOOLS_SQL_FORMAT = 2179 と「ドキュメントの整形」 MEID_TOOLS_XML_FORMAT = 2180 を渡してみると、どうやらふたつのコマンドの定数が逆になっているようです。
    私個人的には SQL ファイルを編集することがないもので、「HTMLドキュメントの整形」だけが ExecuteCommandByID() から起動できないのかな? とおもっていたのですが。 :|
    … ご確認お願いします。

     |  sukemaru  |  返信
  5. >> シリル さん

    ご返信ありがとうございます。

    > いいえ、とんでもない!スマートでシンプルな冴えたやり方だと思います、インクルードしてコールバック!

    そんなことないです (w

    ほんとはインクルードするだけで行ければ良かったのですが、JavaScript の知識が浅いもので方法が分かりませんでした ^^;

    > アンカーとアクティブ、どっちか前でどっちか後ろかなど考えていると単純なことのはずなのにプシューと頭が回らなくなります。

    私もそんな感じです。選択範囲が反対になるとサパーリ…

    > これを見た時、Clearって削除じゃないよね、たぶん解除だよね、後で確認しておこっと思ったはずなのにすっかり忘れていました。

    そうなんですよね。選択範囲の解除は ClearSelection とかなら分かりやすそうですが、selection.ClearSelection() って書くと馬から落馬する、みたいな感じになってしまうので Clear にしました。

    > 念力を使ってコマンドIDを調査してみた所、2257が『すべて検索して選択』かな、むっ2260が不思議な挙動をするな、うっ頭が、というところで終わりました

    GitHub ですね…。はい、忘れているわけではなくて更新しようとは思っているんですよー。

    しかし、まだ機能追加や仕様変更が発生する可能性があるので本体側の開発が落ち着いてからですね。

    > ペペロンチーノを作る時オリーブオイルのソースの中にサラダ用の和風ごまドレッシングを入れてます

    おおー、なんか合いそうな感じですね。私は一時期、粉チーズを隠し味に混ぜていたことがありますが、食後の皿にくっついたチーズを洗うのが大変なのでやめました

    > iniファイルってコメント書けましたっけ?

    sukemaru さんが回答してくれていますが、一般的な INI コメント「;」は使えません。これは開発環境 Delphi の手抜き仕様のせいだと言われています。

    [Display]
    GeneralForeColor=-16777208
    GeneralBackColor=-16777211
    MyComment01=ペペロンチーノ
    GeneralStyle=0
    SelectionForeColor=536870911
    SelectionBackColor=14120960
    

    ↑使われていないキーを使って無理やりコメントを残すというのはできるかもしれませんが、セクションによってはまるごと書き換えられてしまうところもありますし、位置が保持される保証もないので推奨はできませんね。

    >> sukemaru さん

    > メニュー項目などから変更できないキー(隠しオプションなど)は、Mery の起動中に値を変更しても再起動後に書き戻されないことが多いようです。

    INI に書き戻してしまうと隠しオプションがバレてしまいますからね。

    > Plugin.h 内の「SQL整形」 MEID_TOOLS_SQL_FORMAT = 2179 と「ドキュメントの整形」 MEID_TOOLS_XML_FORMAT = 2180

    確認してきました。これは更新漏れですね。

    Delphi 版の mPlugin.pas は実際に Mery の開発で使用しているものなので確実なのですが、plugin.h のほうは気が付いたときに手書きで付け加えていってるだけなので、たまに更新漏れが発生したり、Delphi の書き方で書いちゃってたりすることがあります ^^;

    そもそも C 言語のビルド環境すらないのでコンパイルが通るかどうかもチェックしてません…。

    時間ができたら plugin.h も整備しておきますね。

     |  Kuro  |  返信
  6. 追伸:

    [Display]
    GeneralForeColor=-16777208
    GeneralBackColor=-16777211
    #ペペロンチーノ
    GeneralStyle=0
    SelectionForeColor=536870911
    SelectionBackColor=14120960
    

    ↑ # がコメントとして使えるかも…?

    # コメントは消えずに残ってる気がするのですが、気のせいだったらすみません。

     |  Kuro  |  返信
  7. お返事ありがとうございます

    > # コメントは消えずに残ってる気がするのですが、気のせいだったらすみません。

    使えました!どうもありがとうございます
    右側にもかけるのかな?と思って実験したところ

    [Display]
    CaretColor=#803840 #ペペロンチーノ
    

    ↑隠し機能の場合、消えはしないけど無効とみなされて標準色になっていました

    [Display]
    #CaretColor=#803840
    

    行頭に置いて無効化も出来ました

    [Keyboard]
    FileNewAction=Ctrl+N #ペペロンチーノ
    

    ↑隠しではない時、コメント(のつもり)の部分だけでなくて、値まで消えちゃいました↓

    [Keyboard]
    FileNewAction=
    

    右側には書かない方がいいですね

    [Keyboard]
    #FileNewAction=
    …
    FileNewAction=Ctrl+N
    

    ↑隠しでない項目を行頭で無効化すると[Keyboard]セクションの末尾に新しく追加されるようなので、これもやめておいた方が良さそうです

    1行使ってコメント行とするならいけそうです、目印にもなりますし便利そうです。どうもありがとうございました

     |  シリル  |  返信
  8. ご返信ありがとうございます。

    確かに…。Delphi だけかもしれませんが、INI ファイルの仕様的に「キー=値」で管理されているので、「=」より右側に書くと値として扱われてしまいますね ^^;

    > 隠しでない項目を行頭で無効化すると[Keyboard]セクションの末尾に新しく追加されるようなので、これもやめておいた方が良さそうです

    そうですね。他にも、セクションによっては Mery 終了時にセクションごと消してから書き直してるものもあるので、そういう場合も使えないと思います。([Macros\] とか [Modes\] とか…)

    # を使ったコメントは、やってみたらたまたまできただけなので、動作保証はできませんがご了承くださいませ。

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