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  |  返信
  5. > 言語ごとまでは対応できませんが、nano のように設定ファイルをいじれば変更できる程度の「隠しオプション」なら、作ってみてもいいかもしれませんね。
    >
    > このあたりは、検討してみようと思います。

    よろしくお願いします。

    > Delphi って、`case of` ~ `end` や `try finally` ~ `end` のように、必ずしも `begin` と `end` がセットになっているわけではないことに気づき、「ダメだこりゃ」となりました🫠

    1対1で対応しているだけBASICよりましです。
    breakのように途中で抜けるため、終り側のNEXT~やEND~が分岐で複数あったりするので(禁止している処理系もある)。

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

    前の/後のカッコへ移動、だけのコマンドもあると助かります。

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

    前方検索と後方検索で正規表現を分ける必要がありますね。

    前方
    \[|\(|\{|(begin)|(case of)|(try finally)|......
    後方
    \]|\)|\}|(end)

    以下雑談
    > > ALGOLブロック文の末裔は、Adaが死んでDelphiとRubyとVerilogだけになってしまいました。BASICは少し異端(笑)
    >
    > うは、絶滅危惧種ですね…。

    F22のソフトはAdaですべて開発したそうですが、F35では開発者を集められなくてC++にしたそうです。
    当初はAdaのコードをC++に変換して開発期間を圧縮する予定が、変換結果が理解できず全部新規開発することになったとか。
    最新鋭機F35の30年前に開発され、理解できないソフトで飛んでいる世界最強戦闘機F22とは💦
    自分が生まれた頃、最新鋭機F15の30年前といえばゼロ戦で比較にもならなかったんだが💦

     |  enaka  |  返信
  6. > 1対1で対応しているだけBASICよりましです。

    た、たしかに… ^^;

    しかし、begin、end の対応はほんと難しいですね。途中で心が折れました…

    > 前の/後のカッコへ移動、だけのコマンドもあると助かります。

    移動するだけであれば、マクロで対応できると思います。教えていただいた正規表現をベースにすると、こんな感じでいけるかと。

    #title = "次の括弧へ移動"
    document.selection.Find("\\[|\\(|\\{|(?<!\\w)(begin|case|try)(?!\\w)", meFindNext | meFindReplaceCase | meFindReplaceRegExp | meFindKeepOptions);
    
    #title = "前の括弧へ移動"
    document.selection.Find("\\]|\\)|\\}|(?<!\\w)end(?!\\w)", meFindPrevious | meFindReplaceCase | meFindReplaceRegExp | meFindKeepOptions);
    

    meFindKeepOptions フラグを付けておくと、マクロ実行時に検索ダイアログのオプションが変更されるのを防げます。

    > 当初はAdaのコードをC++に変換して開発期間を圧縮する予定が、変換結果が理解できず全部新規開発することになったとか。

    ひえぇ…その話、めちゃくちゃ分かります。

    昔は VB → Java みたいな置き換え案件も多かったけど、まともに変換できるツールなんてほぼ無かったですよね。気づいたら「全部作り直し」パターン (笑)

    > 最新鋭機F35の30年前に開発され、理解できないソフトで飛んでいる世界最強戦闘機F22とは💦

    プログラマーとしては、バグで動かないより、なぜか動いてしまっているほうが何倍も恐ろしいですよね😱

     |  Kuro  |  返信
  7. > しかし、begin、end の対応はほんと難しいですね。途中で心が折れました…

    なんとかなるよ、絶対大丈夫だよ(お約束)

    > > 前の/後のカッコへ移動、だけのコマンドもあると助かります。
    >
    > 移動するだけであれば、マクロで対応できると思います。教えていただいた正規表現をベースにすると、こんな感じでいけるかと。

    おお凄い、これから試してみますね。検索履歴には残らないでしょうか?

    > 昔は VB → Java みたいな置き換え案件も多かったけど、まともに変換できるツールなんてほぼ無かったですよね。気づいたら「全部作り直し」パターン (笑)

    米陸軍の年金計算の6000万行のCOBOLのコードを、イーロンマスクがAIでJavaに変換して数か月でリリースする、という春頃のニュースはどうなったんでしょうね。
     
    > プログラマーとしては、バグで動かないより、なぜか動いてしまっているほうが何倍も恐ろしいですよね😱

    今、世界中で起こっていること。
    AIが書いたプログラム、なんか分からないけど動いてるからヨシ(仕事猫感)

     |  enaka  |  返信
  8. > なんとかなるよ、絶対大丈夫だよ(お約束)

    さすがにググりました。CC さくらでしたかー。これは不覚。ギリギリ見てはいたけど、そこまでガチじゃない世代です😅

    > おお凄い、これから試してみますね。検索履歴には残らないでしょうか?

    検索履歴のことを気にされていたようでしたので、履歴に残らないことは確認しました。

    Mery のあまり知られていない機能としては、マクロの記録はキー操作だけと思われがちですが、検索ダイアログを開いて検索する操作などもマクロに記録できます。

    そこからカスタマイズしていくと、意外と簡単なんですよ。

    > 米陸軍の年金計算の6000万行のCOBOLのコードを、イーロンマスクがAIでJavaに変換して数か月でリリースする、という春頃のニュースはどうなったんでしょうね。

    COBOL → Java 案件とか、絶対やりたくないやつですね。会計システムでそれ系をやったとき、メンタル死にかけた時代ありましたー😱

    > 今、世界中で起こっていること。
    > AIが書いたプログラム、なんか分からないけど動いてるからヨシ(仕事猫感)

    言われてみれば本当にそうですね。夏休みの宿題も AI にやらせる時代ですし、情報の洪水の中で、ただぽかーんと空を見上げてしまうことが増えました。

    最近では、Windows のネイティブアプリすら開発できる人が減ってきている…なんて話もあったりなかったり😒

     |  Kuro  |  返信
  9. > さすがにググりました。CC さくらでしたかー。これは不覚。ギリギリ見てはいたけど、そこまでガチじゃない世代です😅

    新シリーズも完結は2年前。新シリーズはシレっと作中時代が更新されてドローン空撮やスマホのGPSが出ていて笑いました。ヤバい子がヤバい道具を手にしとる💦

    > 検索履歴のことを気にされていたようでしたので、履歴に残らないことは確認しました。
    >
    > Mery のあまり知られていない機能としては、マクロの記録はキー操作だけと思われがちですが、検索ダイアログを開いて検索する操作などもマクロに記録できます。

    検索ダイアログを出さず裏で検索キーワードとオプションを設定してそのまま検索して移動後に跡を残さず設定を元に戻すことがやりたかったのです。
    検索機能を利用しているのだけれども、一見そのように見えないみたいな。

    > COBOL → Java 案件とか、絶対やりたくないやつですね。会計システムでそれ系をやったとき、メンタル死にかけた時代ありましたー😱

    それが只のCOBOLで完結していればまだましで、ベンダロックオンされた仕様も中身も不明なライブラリモジュールやバローズの魔改造コンパイラが使われていた日には。

    または、Cで書かれたプログラムのマイグレーション案件と聞かされて来てみれば、CなのはB5000とMCPのエミュレータで本体はCOBOL61だったもんで、思わず「もう、無理だと思うよ」と会長閣下になっていた。

    > 最近では、Windows のネイティブアプリすら開発できる人が減ってきている…なんて話もあったりなかったり😒

    シアトルの求人広告の「Windowsの開発経験者求む」のネタを思い出しました。広告主の名は...
    MFCといいSilverlightといい経験値をドブに捨てるような真似を続けられ、.NETやUWPだって何時はしごを外されるかわからないとなれば、それは開発者だって離れていくというものでしょう。
    諸行無常、驕れる者も久しからず。

     |  enaka  |  返信
  10. > 新シリーズも完結は2年前。新シリーズはシレっと作中時代が更新されてドローン空撮やスマホのGPSが出ていて笑いました。ヤバい子がヤバい道具を手にしとる💦

    そんなに長く続いてたんですね。サザエさん時空じゃなかったとは…😂

    現代ツールを使いこなす姿、ちょっと見てみたいかもです。

    > > Mery のあまり知られていない機能としては、マクロの記録はキー操作だけと思われがちですが、検索ダイアログを開いて検索する操作などもマクロに記録できます。
    >
    > 検索ダイアログを出さず裏で検索キーワードとオプションを設定してそのまま検索して移動後に跡を残さず設定を元に戻すことがやりたかったのです。
    > 検索機能を利用しているのだけれども、一見そのように見えないみたいな。

    ちょっと誤解されそうな書き方だったので補足ですが、マクロに記録されるのは「検索ダイアログを開く操作」ではなく、実際に行った「検索そのもの」です。

    なので、マクロを実行しても検索ダイアログが出てくるわけではありません。

    ついでに、document.HighlightFind = false; を入れておくと、検索した文字列の強調表示も解除できます。

    #title = "次の括弧へ移動"
    document.selection.Find("\\[|\\(|\\{|(?<!\\w)(begin|case|try)(?!\\w)", meFindNext | meFindReplaceCase | meFindReplaceRegExp | meFindKeepOptions);
    document.HighlightFind = false;
    

    > MFCといいSilverlightといい経験値をドブに捨てるような真似を続けられ、.NETやUWPだって何時はしごを外されるかわからないとなれば、それは開発者だって離れていくというものでしょう。
    > 諸行無常、驕れる者も久しからず。

    おまけに Win32 アプリのことをクラシックアプリと呼ばせたり、Win32 アプリ向けには新しい Windows の機能を渡さなかったり…ほんとひどい話ですよね。

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