Meryのカッコに移動するコマンドについて

  1. Meryのコマンドに「対応するカッコに移動(Ctrl-])」はありますが、前や後のカッコに連続して移動できるコマンドはないのでしょうか。
    また、移動するカッコの種類を変更することはできないのでしょうか。

    マクロで実現できないかと考えたのですが、自分の手には余りました。
    検索履歴を汚さずに、beginとendにも対応したいです。

     |  enaka  |  返信
  2. こんばんは。

    > Meryのコマンドに「対応するカッコに移動(Ctrl-])」はありますが、前や後のカッコに連続して移動できるコマンドはないのでしょうか。

    現状では、直接連続で移動するコマンドはありません。

    ただ、[対応する括弧へ移動] コマンドは、カーソルが括弧の位置にない場合でも、自動で対応する括弧を探して移動してくれます。

    なので、連続して移動したい場合は、カーソルを少し右に動かして、括弧が隣接していない位置で再度コマンドを実行すると、次の括弧へ移動できます。

    もし VSCode のようにコマンドを繰り返して連続移動したい場合は、MeryWiki に yuko さんが投稿してくれている「選択範囲を広げる」マクロがおすすめです。私もよく使っています。

    【参考】選択範囲を広げる - MeryWiki
    https://www.haijin-boys.com/wiki/選択範囲を広げる

    > また、移動するカッコの種類を変更することはできないのでしょうか。

    残念ながら、括弧の種類を自由に設定することはできません。理由はこんな感じです:

    • 左括弧・右括弧のペアを自由に定義するとなると、設定画面の UI が複雑になってしまう
    • 括弧の種類自体も限られていて、複雑化に対して需要があまりない
    • Visual Studio や VSCode でも、ユーザーが自由に括弧の種類を設定できる仕組みは直接的には提供されていない

    そのため、括弧の種類は固定にして、皆さんのご意見も参考にしながら、よく使われそうな括弧だけを採用しています。

    【フォーラム】対応する括弧の強調・移動
    https://www.haijin-boys.com/discussions/7500

    【フォーラム】[括弧/引用符で選択範囲を自動的に囲む] いいですね!
    https://www.haijin-boys.com/discussions/7886

    > マクロで実現できないかと考えたのですが、自分の手には余りました。
    > 検索履歴を汚さずに、beginとendにも対応したいです。

    「begin」と「end」を括弧みたいに扱うのは、ちょっと特殊ですね😅

    仮に括弧の種類を自由に設定できたとしても、文字列単位で対応させるのは今の仕組みではかなり難しいです。

    個人的には Delphi も begin と end なので、面白い案件ではあるのですが… (こっそり Delphi モードだけ対応させる?なんて…)

    試しに挑戦してみたところ、括弧ではなく文字列 (単語) を認識させる場合、一気に難易度が上がりますね。

    • カーソル位置から前後で単語の切れ目を探す
    • 入れ子構造も単語単位で判定する
    • 動作速度を維持しつつ逆方向検索も考慮する

    こうなると、ほぼ構文解析レベルの作り込みが必要で、私も手に負えませんでした。

    ちなみに、以前、フォーラムの皆さんで協力して作ったマクロ版「対応する括弧に移動」があります。

    【参考】対応する括弧に移動 - MeryWiki
    https://www.haijin-boys.com/wiki/対応する括弧に移動

    ただ、マクロにしても begin と end に対応させるのは、やはりかなり難しいと思います…。

     |  Kuro  |  返信
  3. > 残念ながら、括弧の種類を自由に設定することはできません。理由はこんな感じです:

    対象を増やすのではなく、小カッコ()をジャンプ対象から外したかったのですが、減らすこともできないのですね。
    ちなみにテキストエディタnanoでは設定ファイルで

    set matchbrackets "(<[{)>]}"

    と対象のカッコを定義できるため、.nanorcだけでなく各言語用シンタックスファイルでカッコを変更できます。

    > 「begin」と「end」を括弧みたいに扱うのは、ちょっと特殊ですね😅
    >
    > 仮に括弧の種類を自由に設定できたとしても、文字列単位で対応させるのは今の仕組みではかなり難しいです。
    >
    > 個人的には Delphi も begin と end なので、面白い案件ではあるのですが… (こっそり Delphi モードだけ対応させる?なんて…)

    ALGOLブロック文の末裔は、Adaが死んでDelphiとRubyとVerilogだけになってしまいました。BASICは少し異端(笑)

    > こうなると、ほぼ構文解析レベルの作り込みが必要で、私も手に負えませんでした。

    もし鬼車にそのあたりを任せることができて、正規表現でカッコを検索できれば、

    \[|\]|\(|\)|\{|\}|(begin)|(end)

    のようにbeginとendを含むカッコを定義できます。
    正規表現自体が複数のカッコを使い分けるので非常にややこしいですが。

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

    > 対象を増やすのではなく、小カッコ()をジャンプ対象から外したかったのですが、減らすこともできないのですね。

    なるほど。はい、残念ながら現時点では、減らすこともできない仕様になっています。

    > ちなみにテキストエディタnanoでは設定ファイルで
    >
    > set matchbrackets “(<[{)>]}”
    >
    > と対象のカッコを定義できるため、.nanorcだけでなく各言語用シンタックスファイルでカッコを変更できます。

    言語ごとに設定できるようにする案もあったのですが、前回ご紹介したフォーラムのリンク先で検証してみたところ、主要な言語では括弧の種類にそれほど大きな違いはないという結論になりまして。

    シンプル志向の Mery としても、その方がわかりやすくて良いだろうということで、現在の「固定値によるシンプル設計」に落ち着いた、という経緯があります。

    言語ごとまでは対応できませんが、nano のように設定ファイルをいじれば変更できる程度の「隠しオプション」なら、作ってみてもいいかもしれませんね。

    このあたりは、検討してみようと思います。

    > ALGOLブロック文の末裔は、Adaが死んでDelphiとRubyとVerilogだけになってしまいました。BASICは少し異端(笑)

    うは、絶滅危惧種ですね…。

    その後も begin、end 対応の実装方法が気になって試行錯誤していたのですが、そこそこ動くようになって、Delphi で試したところ…

    Delphi って、case ofendtry finallyend のように、必ずしも beginend がセットになっているわけではないことに気づき、「ダメだこりゃ」となりました🫠

    > もし鬼車にそのあたりを任せることができて、正規表現でカッコを検索できれば、
    >
    > [|]|(|)|{|}|(begin)|(end)
    >
    > のようにbeginとendを含むカッコを定義できます。

    括弧を検索するだけなら、その方法でいけそうですね。

    ただ、「対応する括弧へ移動」となると入れ子構造の解析が必要になるので、正規表現だけでやるのは難しいかなと思います。

    …正規表現の達人なら、できてしまうのかもしれませんが😅

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