【雑談】メリーと遊ぼうその3

  1. おはようございます。
    私のパソコンではMaryくんがちょこちょこ動いたりしています。
    主にテキストのストーリーで動いてくれていますが、今後幅を広げてテキスト→ワードにコピってPDFの道を作ろうと思います。

    ということで2が長くなってきたような感じがしたので3号を作りました。
    なお、こちらではMeryユーザー皆々様のMery体験を教えて頂ければと思います
    Meryを使って「こんなことしてるよ!」「こんなことできたよ!」との声を
    ぜひKuroさんにお届けしましょう!

    ・・・(o_ _)Zzz

     |  瑞葉@わっふる  |  返信
  2. このテキストエディタに触発されてシンプルなエディタを作っていた人ですどうも。(このリンクはそのエディタなので関係ないですが) https://i.gyazo.com/d58fa4c7631f263e6261f1bdf2c600cb.png
    んでmeryの方はこんな感じに遊んでいます。
    https://i.gyazo.com/614e0c4a76c59eafced319bd3b6d8f3c.png
    なおちゃんとこんなのも保管されています。
    https://i.gyazo.com/0625175a5c921053f9e5e326538a8b92.png
    使いやすくて好きなので愛用しています。
    今度物語(ノベル)に使おうかと思います。
    ただreadme作成マクロとかあると良さそうだけどと思ったりはしますが、贅沢を言わず使っていきたいです。
    ちなみに、私はこのテキストエディタのデータの海に消えたバージョン、複数の場所に保管するようにしました。
    ちなみに求められたら見せれるようには・・・できますがね・・・(;||)

     |  瑞葉@わっふる  |  返信
  3. 前回のメリーと遊ぼうスレッドは下記を参照してください。

    【雑談】メリーと遊ぼう2
    https://www.haijin-boys.com/discussions/6398

     |  MSY-07  |  返信
  4. 瑞葉@わっふるさん、スレ立てありがとうございます。MSY-07 さん、過去スレへのリンクも助かります。

    > このテキストエディタに触発されてシンプルなエディタを作っていた人ですどうも。(このリンクはそのエディタなので関係ないですが)
    > https://i.gyazo.com/d58fa4c7631f263e6261f1bdf2c600cb.png

    お久しぶりですね。オリジンテキストエディタ、めっちゃシンプルですね。Windows 11 のメモ帳が重くなってしまった今、こういったシンプルなテキストエディターの需要は高まっていきそうです。

    > んでmeryの方はこんな感じに遊んでいます。
    > https://i.gyazo.com/614e0c4a76c59eafced319bd3b6d8f3c.png

    この背景!ダーク モードになって前回からさらにパワーアップしてますね😊

    > なおちゃんとこんなのも保管されています。
    > https://i.gyazo.com/0625175a5c921053f9e5e326538a8b92.png

    おっ、マテリアル カラーのアイコン!細かいところまでしっかり保管されてるのがすごい…。ご愛用ありがとうございます🙌

    > ただreadme作成マクロとかあると良さそうだけどと思ったりはしますが、贅沢を言わず使っていきたいです。

    前スレで話題に出ていましたが、AI の Gemini を使った相談マクロが便利ですよ。

    たとえば「readme のテンプレートを出力して」と入力すれば、readme のテンプレートや書き方をサクッと Mery に出力してくれます。

    > ちなみに、私はこのテキストエディタのデータの海に消えたバージョン、複数の場所に保管するようにしました。

    それはレアですね!昔のバージョンは、押し入れの奥を探さないと出てこないかもしれません😱

     |  Kuro  |  返信
  5. スレ立て乙です。

    テキストエディタの開発、自分好みのものを作れるなんて楽しそうですが、道のりが遠すぎて全くできる気がしません…😇 皆さんの探究心に、脱帽です。

    私の方はといえば前スレのGeminiに続き、今度はGPTを使うことにトライしてみました。
    キャプチャ: https://imgur.com/a/7qaZgJv

    OpenAI GPT に相談 - MeryWiki

    OpenAI APIの利用は有料にはなってしまうのですが、リクエスト内容を学習には使わないと言っているので無料版Geminiより安心感がありますね。 gpt-4o-mini というモデルを使っているのですが、これがなかなかコスパ良く、30往復くらいの会話を毎日使ったとしても $ 2/月 くらいに収まるかなんじゃないかなーと見積もっています。

    Kuroさん版Geminiマクロを参考に、コンテキストメニューを活用してみました。メニュー操作という選択肢が生まれたことで、文脈リセット機能も搭載できました!

     |  yuko  |  返信
  6. 「GPTに相談」、V8エンジン版も書いてみました。

    …と、それだけでは従来版と機能的な差がないので、V8ならではということでストリーミング通信に対応してみました。これは想像していた以上に、ChatGPTならぬMeryGPTな感じかも…😯
    キャプチャ: https://imgur.com/a/yakFidO

    OpenAI GPT に相談 - MeryWiki

     |  yuko  |  返信
  7. ストリーミング通信って何だろうと思ってキャプチャを拝見したら、びっくりしました!すごいですね、こんなことまでできるんですね。

    実は、OpenAI API は昨年末ぐらいに興味本位で無料枠に登録したのですが、まったく使わないうちに期限切れで終了してしまいまして…。今回試せなくて残念です。

    仕事で使うなら、課金すればセキュリティ的にも安心できそうですね。個人的には、技術的な好奇心だけで、課金してまで使いこなすような作業はなさそうで…😅

    そういえば、前回、非同期マクロ向けにカスタマイズした影響か、普通の JS マクロ (V8 ではなく、language 指定なし) を書いていたところ、構文エラーでダイアログが出たときに、Mery が 2 回ほどフリーズしました。

    こんな現象、ありませんか?🤔

     |  Kuro  |  返信
  8. Kuroさん

    > ストリーミング通信って何だろうと思ってキャプチャを拝見したら、びっくりしました!すごいですね、こんなことまでできるんですね。

    調べてみたところGeminiさんもストリーミングモードに対応していたので、それならばと「Geminiに相談」の方も対応してみました。ついでに「生成中、Shiftキーで中断」機能も shell.GetKeyState(nVirtKey) を使うことで搭載できてしまいました😋

    Google Gemini に相談 - MeryWiki

    > そういえば、前回、非同期マクロ向けにカスタマイズした影響か、普通の JS マクロ (V8 ではなく、language 指定なし) を書いていたところ、構文エラーでダイアログが出たときに、Mery が 2 回ほどフリーズしました。
    > こんな現象、ありませんか?🤔

    ちょっと状況は違いますが、前述の「GPTに相談 (V8版)」を作っていたときに、Mery終了後にゾンビプロセスが残る事象は一度遭遇しましたね。
    マクロのトライ&エラーで何度も例外上がったりしていた後だったので、マクロ動作が不正終了していたとかあったのか… でも何がきっかけだったのかは分からず、再現方法は不明です…。

    あとV8マクロを書いていて気付いたのですが、 #language = "v8" のときに該当マクロ内の構文エラー (括弧の数が合わないなど) があると、エラー表示無く、無言でマクロが終了するようです。

     |  yuko  |  返信
  9. > Google Gemini に相談 - MeryWiki

    通信環境によってなのか、ノートPCだとGeminiさんからの応答データに空行が入ってきてjsonパースエラーになるケースがあったので今、対処しました。
    そんなタイミングよく見てはいないでしょうが…万が一対処前のマクロを取ってしまわれた時のために、念のためお知らせ。

     |  yuko  |  返信
  10. 早速試させていただきました。おおっ、Gemini さんでもストリーミングできてる!😲 なんか SF 映画に出てきそうなハイテクなシステムで、テンション上がりまくりです!

    これはぜひ愛用させてもらいますね😊

    > ついでに「生成中、Shiftキーで中断」機能も shell.GetKeyState(nVirtKey) を使うことで搭載できてしまいました😋

    いいですね。おそらく、shell.GetKeyStateを実装してから、実際に使われるのはこれが初めてなんじゃないかしらw

    > ちょっと状況は違いますが、前述の「GPTに相談 (V8版)」を作っていたときに、Mery終了後にゾンビプロセスが残る事象は一度遭遇しましたね。

    V8 エンジンって、裏で WebView2 のプロセスが動いていて、Mery はそのプロセスが終わるのを待機してるんですよね。

    もし WebView2 が通信中とかで終了しない場合、Mery の終了がうまくいかないこともあるかもです。

    でも、もし再現方法がわかれば、ぜひ教えてくださいね。

    > あとV8マクロを書いていて気付いたのですが、 #language = “v8” のときに該当マクロ内の構文エラー (括弧の数が合わないなど) があると、エラー表示無く、無言でマクロが終了するようです。

    V8 エンジンのエラーが拾えない問題は前から確認していて、今のところ対策がない状態です。

    【参考】https://www.haijin-boys.com/discussions/7036#discussion-7046

    EmEditor さんの V8 マクロでも似たような問題があるみたいですが、秀丸エディタさんは対策済みとのことです。

    その対策というのが、スクリプトをevalで囲むというちょっと力技な方法で、セキュリティ的に気になる部分もあるので、Mery ではその方法は採用していないんですよね😩

    でも、もしエラーを拾いたい場合は、こんな感じで…

    #language = "v8"
    eval('const a = [;');
    

    evalで囲んであげるとエラーが拾えるようになります。ただ、どんな副作用があるかはわからないので注意が必要ですが😱

     |  Kuro  |  返信
  11. > 早速試させていただきました。おおっ、Gemini さんでもストリーミングできてる!😲 なんか SF 映画に出てきそうなハイテクなシステムで、テンション上がりまくりです!

    ゾゾゾーっと文字が入力されていく様は見ていて面白いですね。裏側では順次受け取った生成結果をゆっくり入力しているだけなのですが、人が考えながら入力しているのを見ているようで (人間より超高速ですが)、相手がいるような感覚になっちゃいますねw

    一晩寝たら、KuroさんのGemini執筆支援のようにテンプレートを簡単にコンテキストメニューに仕込めるようにしたらどうかとか、ChatGPTのようにあらかじめ生成方針を設定できる「カスタムインストラクション」を仕込めるようにしたらどうかとか、色々とアイデアが出てきてしまいました。今日もイジってみようと思います😊

    > いいですね。おそらく、shell.GetKeyStateを実装してから、実際に使われるのはこれが初めてなんじゃないかしらw

    こういう処理時間の長いものについては何かと使い所ありそうですよね。

    あと今更気付いたのですが、従来エンジンと #language = "v8" を使ったときとで shell.GetKeyState の挙動がちょっと異なるんですね。

    以下のような検証コードで、動いている最中にShiftキーを押したり離したりしてみると、従来エンジンではマクロ起動時のShiftキー状態をずっと保持、V8エンジンでは shell.GetKeyState を呼んだ瞬間のShiftキー状態を反映、といった動きをするようです。V8エンジンは実際のところ非同期で動いているという話と関係がありそうですね。

    // ロガー
    var console = {
        log: function (str) { outputBar.Writeln(str) }
    };
    
    var sel = document.selection;
    
    console.log("[test]");
    
    main();
    
    function main() {
        console.log(shell.GetKeyState(0x10));
        for (var i = 0; i < 5; i++) {
            Sleep(1000);
            console.log(shell.GetKeyState(0x10));
        }
    }
    

    これは、「マクロ起動時のキー状態を取りたいなら従来エンジンで、shell.GetKeyState 呼び出し時点のキー状態を取りたいならV8を使ってね」という感じで言えそうですね。その場合、shell.GetKeyState のリファレンスに記載はあった方がよさそうです。

    あるいは、「shell.GetKeyState に引数オプションを用意して、マクロ起動時のキー状態を取るか、shell.GetKeyState 呼び出し時点のキー状態を取るか」を選択できるようになると挙動が保証されて良いかもしれません。

    > V8 エンジンのエラーが拾えない問題は前から確認していて、今のところ対策がない状態です。

    なるほど eval … たしかにどこからコード流し込みができてしまうものか分からず、暗黙で行われるのはちょっと怖いですね。安全第一でいいと思います。

    ところで、技術的に不可能ということかもしれませんが、V8版「Geminiに相談」マクロなどで非同期処理中、入力だけでなく編集メニューやキーボードショートカットでの操作を塞ぐことは難しいでしょうか?

    動作中、例えば Ctrl+A, Ctrl+Z の操作や、キーボードショートカット割当済みのマクロなどが動作してしまうようなのですよね。ちなみに従来エンジン版であれば、前回の改善でそのあたりの操作も塞がれているようです。

     |  yuko  |  返信
  12. > ChatGPTのようにあらかじめ生成方針を設定できる「カスタムインストラクション」を仕込めるようにしたらどうかとか、色々とアイデアが出てきてしまいました。

    同じテンプレートの説明を何度も繰り返すことが多かったので、毎回できるだけ詳しく相談内容を書いていたのですが、それができるとめちゃくちゃ捗りそうですね😲

    > あと今更気付いたのですが、従来エンジンと #language = “v8” を使ったときとで shell.GetKeyState の挙動がちょっと異なるんですね。

    なるほど、これは意図的にそうしているわけではなくて、たまたまそうなっているだけですね。

    どうやらスクリプトエンジンの仕様のようで、EmEditor さんで試してみても、同期マクロの場合は同じ挙動でした。

    > これは、「マクロ起動時のキー状態を取りたいなら従来エンジンで、shell.GetKeyState 呼び出し時点のキー状態を取りたいならV8を使ってね」という感じで言えそうですね。その場合、shell.GetKeyState のリファレンスに記載はあった方がよさそうです。

    従来エンジンだからというわけではなく、同期か非同期かで挙動が変わるようです。

    従来エンジンでも、以前に yuko さんが作られた非同期になるマクロでは、shell.GetKeyStateでそのときのキーが取得できるみたいです。

    なので、残念ながら Mery 側からはshell.GetKeyStateの挙動に意図的に干渉するのは無理そうです。

    裏では Windows API のGetKeyState(winuser.h) を呼び出しているだけなので、特にできることはない感じですね。

    > ところで、技術的に不可能ということかもしれませんが、V8版「Geminiに相談」マクロなどで非同期処理中、入力だけでなく編集メニューやキーボードショートカットでの操作を塞ぐことは難しいでしょうか?

    うーん、ある意味では難しいですね。

    従来エンジン版でキーボード ショートカットが動作しなくなっているのは、意図的にそうしているわけではなく、Mery 側では同期処理だと思っているのに、マクロ側で非同期処理が行われている状態なので、副作用で Mery 側の処理がフリーズして、ショートカットが受け付けられなくなっているんです。

    できればショートカットは受け付けたかったのですが、どうしても無理でした😅

    また、コマンドを完全に塞いでしまうと、マクロからの操作 (たとえば、editor.ExecuteCommandByIDなど) が実行できなくなってしまいます。

    でも、非同期処理中にメニュー操作やショートカット キーを入力するのって、ユーザー側の意図的な操作だと思うので、それはユーザーの責任でいいんじゃないかと思うのですが、どうでしょうか?

    ちなみに、メニューからの操作ということで、非同期マクロの実行中は、[マクロ] メニューに [停止] という項目が表示されて、そこからマクロの実行を終了することもできるんですよ👍

     |  Kuro  |  返信
  13. カスタムインストラクション、搭載してみました!
    マクロ内でデフォルトのカスタムインストラクションを設定、さらに実行時のコンテキストメニューから一時的にカスタムインストラクションを変更できるようにもしてみました。

    その他にもプロンプトテンプレートを設定できるようにしたり、回答の言語設定ができるようにしてみたり… やり始めたら一日が溶けてしまいました…🤤

    Google Gemini に相談 - MeryWiki

    上記を仕込んでいる途中で分かったのですが、Gemini APIにリクエストするJSONを組み立てる際、 temperature という設定値を指定でき、この値を 0.0 (応答にブレがない = 独創性が減る) ~ 1.0 (応答にブレあり = 独創性が出る) の範囲で調整することで、回答の具合を調整できるようです。この値を調整して遊んでみても面白いかもです。私はプロンプトテンプレートのときだけ引き下げる (応答のブレを減らす) ようにしてみました。

    > なので、残念ながら Mery 側からはshell.GetKeyStateの挙動に意図的に干渉するのは無理そうです。
    > 裏では Windows API のGetKeyState(winuser.h) を呼び出しているだけなので、特にできることはない感じですね。

    なるほど、同期か非同期かで違ってくるということですね。承知しました。
    それさえ分かっていれば何かと応用はできそうですね!

    > でも、非同期処理中にメニュー操作やショートカット キーを入力するのって、ユーザー側の意図的な操作だと思うので、それはユーザーの責任でいいんじゃないかと思うのですが、どうでしょうか?

    そうですね、マクロ側に BeginUndoGroup(); を仕込んでいれば間違えたとしても Ctrl+Z で元通りですし、大きな問題はない気がします。

    個人的に気になるのは、従来エンジンとV8エンジンとでショートカットの受け付け具合が異なるところくらいでしょうか。私の環境ではTabキーのインデントをマクロ実行で行うカスタマイズをしていたりする関係で、従来エンジンの「副作用で Mery 側の処理がフリーズして、ショートカットが受け付けられなくなっている」の方が、「間違えてキータッチしてしまって入力してしまった…」といった状況を防げるので好ましいですね。

    とはいえ、

    • 間違えて入力した自分のせいであって、気を付けて使えばいい
    • 前述のとおり Ctrl-Z も効く
    • Tabキー単体にマクロを仕込んでいるおま環問題

    みたいなところはあるので、「これは仕様です」となっても特に不服はないです👌

     |  yuko  |  返信
  14. お疲れ様です!すっごいですね!早速試させていただきましたが、これはまさに神ツールですね。

    試しにサンプルのとおり、ござる口調にしてもらったところ、思わず笑ってしまいました😂

    テンプレートの編集部分もわかりやすくて、いい感じですね。以前投稿した私のマクロも、こんな風にわかりやすくしたいなぁって思いました。

    そういえば、temperatureって Google AI Studio にも搭載されてますよね。私もドキュメントを作成するときは、temperatureを下げてました。

    > 私の環境ではTabキーのインデントをマクロ実行で行うカスタマイズをしていたりする関係で、従来エンジンの「副作用で Mery 側の処理がフリーズして、ショートカットが受け付けられなくなっている」の方が、「間違えてキータッチしてしまって入力してしまった…」といった状況を防げるので好ましいですね。

    なんと…。マクロの実行中は別のマクロが発動しないようにしているつもりだったのですが、メニューの項目を無効化していただけで、ショートカットからは起動できちゃってたんですね。気づかなかったです。

    これはちょっと危険なので、マクロの実行中は別のマクロが発動しないように対策しておきますね。

    > 個人的に気になるのは、従来エンジンとV8エンジンとでショートカットの受け付け具合が異なるところくらいでしょうか。

    なるほど、そうですね。メニューからの操作や、直接的なコマンドの実行を塞ぐことは難しいですが、ショートカットの受け付けだけということであれば、キー操作を無効化することで対応できそうなので、やってみます👍

    あ、今、Gemini に相談してて、マクロのストリーミングで結果がバーッと長文で出力されてたのですが、折り返しなしだったので「うわぁー!」ってなりながら、途中でメニューから [右端で折り返し] をポチっとしまして、マクロの実行中にコマンドの操作ができると良い点をひとつ発見しましたw

     |  Kuro  |  返信
  15. > 試しにサンプルのとおり、ござる口調にしてもらったところ、思わず笑ってしまいました😂

    あとはカスタムインストラクションに「陽気に回答してください」とするのも、元気なGeminiさんがずっと楽しげに回答してくれるのでオススメですw

    あと、コンテキストメニューから行える「一時的なカスタムインストラクション」の設定処理、「一時的なカスタムインストラクション」の保持内容を誤って消してしまう瞬間があったのでちょっと修正しました… 走り書きはよくありませんね…😅
    もし使っているときに他にも気になる挙動があったりしたら、お知らせいただければ嬉しいです。

    > テンプレートの編集部分もわかりやすくて、いい感じですね。以前投稿した私のマクロも、こんな風にわかりやすくしたいなぁって思いました。

    JSONの構造体を、コンテキストメニューの順序と合わせるといい感じですよね。このJSONテンプレートな感じで、Kuroさんの「Geminiで執筆支援」のように、「翻訳」ジャンルなどで項目をまとめるような階層構造にも挑戦したいところです。

    > これはちょっと危険なので、マクロの実行中は別のマクロが発動しないように対策しておきますね。
    >
    > なるほど、そうですね。メニューからの操作や、直接的なコマンドの実行を塞ぐことは難しいですが、ショートカットの受け付けだけということであれば、キー操作を無効化することで対応できそうなので、やってみます👍

    ありがとうございます!その状態になると、とても安心です😊

    > あ、今、Gemini に相談してて、マクロのストリーミングで結果がバーッと長文で出力されてたのですが、折り返しなしだったので「うわぁー!」ってなりながら、途中でメニューから [右端で折り返し] をポチっとしまして、マクロの実行中にコマンドの操作ができると良い点をひとつ発見しましたw

    たしかに、コマンドが動く仕様はこの瞬間に輝きますねw
    ツールバーの [右端で折り返し] ボタンでもちゃんと動いてくれました。猛烈に入力されながら折り返しあり/なしが切り替わる姿、見慣れず何か不思議な感じですw

     |  yuko  |  返信
  16. > あとはカスタムインストラクションに「陽気に回答してください」とするのも、元気なGeminiさんがずっと楽しげに回答してくれるのでオススメですw
    これはいいですね。
    そして別口だけどAIっていろんなサポートできるよう調整できそうな気がするのはありそう。

    今現在素手悩んでるのはreadmeをマクロで組みたいのはあるけど、ここで詰んでる感じです
    var template = `
    ここでエラーはいてしまう・・・
    難しいね、と

     |  瑞葉@わっふる  |  返信
  17. コードはこんな感じ

    // READMEテンプレートを作成するマクロ
    
    var author = InputBox("作者名を入力してください", "README生成", "作者名");
    var softwareName = InputBox("ソフト名を入力してください", "README生成", "ソフト名");
    var version = InputBox("バージョンを入力してください", "README生成", "1.0.0");
    var currentDate = (new Date()).toISOString().split('T')[0];
    var licenseType = InputBox("種別(例: フリー、シェアウェアなど)を入力してください", "README生成", "フリー");
    var language = InputBox("開発言語を入力してください", "README生成", "JavaScript");
    var platform = InputBox("対応機種を入力してください", "README生成", "Windows/Mac");
    var copyright = InputBox("著作権者を入力してください", "README生成", "著作権者");
    var redistribution = InputBox("再配布の可否を入力してください", "README生成", "可");
    var reproduction = InputBox("転載の可否を入力してください", "README生成", "不可");
    var homepage = InputBox("ホームページURLを入力してください", "README生成", "http://example.com");
    var contact = InputBox("連絡先を入力してください", "README生成", "contact@example.com");
    
    // テンプレート生成
    var template = `
    README
    
    概要
    ============
    
    【 作者名 】 ${author}
    【 ソフト名 】 ${softwareName}
    【 バージョン 】 Ver${version}
    【 作成日 】 ${currentDate}
    【 種別 】 ${licenseType}
    【 開発言語 】 ${language}
    【 対応機種 】 ${platform}
    【 著作権者 】 ${copyright}
    【 再配布 】 ${redistribution}
    【 転載 】 ${reproduction}
    【 ホームページ 】 ${homepage}
    【 連絡先 】 ${contact}
    ============
    
    【 はじめに 】
    ここに内容を記載します
    【 ファイル構成 】
    ここに内容を記載します
    【 インストール 】
    ここに内容を記載します
    【 アンインストール 】
    ここに内容を記載します
    【 使い方 】
    ここに内容を記載します
    【 著作権 】
    ここに内容を記載します
    【 免責 】
    ここに内容を記載します
    【 謝辞 】
    ここに内容を記載します
    【 開発履歴 】
    ここに内容を記載します`;
    
    // エディタの現在行を取得
    var currentLine = Editor.GetCurrentLine();
    
    // 現在行のインデントを取得 (Mery の仕様に依存)
    var indent = "";
    for (var i = 0; i < Editor.GetLineIndentation(currentLine); i++) {
        indent += " ";
    }
    
    // テンプレートを挿入
    Editor.Insert(indent + template);```
    これで上手くいかないのがな・・・
    ただ、これでテンプレートのところでエラー吐くという・・・
     |  瑞葉@わっふる  |  返信
  18. あとWikiが500 Internal Server Error吐いてるから使いたいのに見れない・・・

     |  瑞葉@わっふる  |  返信
  19. > あとWikiが500 Internal Server Error吐いてるから使いたいのに見れない・・・
    いつの間にか治ってたのでAIに聞きつつコード書いてました。
    なおreadme作成マクロについては公開は現状検討に検討を重ね、今、検討が加速する感じです。
    ただ若干不便かもしれないけど・・・ってところかな。

     |  瑞葉@わっふる  |  返信
  20. >> yuko さん

    > あとはカスタムインストラクションに「陽気に回答してください」とするのも、元気なGeminiさんがずっと楽しげに回答してくれるのでオススメですw

    どんどん進化してますね。早速最新版にアップデートして、試させていただきました!

    文章の校正に使うと、Gemini さんのテンションが伝染するのか、校正された文章までやたら陽気になって、「お、おぅ!」って笑っちゃいました😂

    気づいたら Gemini さんがすっかり友達みたいな存在に…。これ、無料期間が終わっちゃったら寂しくなりそうです…。ずっと続いてくれるといいのになぁ。

    > このJSONテンプレートな感じで、Kuroさんの「Geminiで執筆支援」のように、「翻訳」ジャンルなどで項目をまとめるような階層構造にも挑戦したいところです。

    サブ メニューにすると、使うときは便利なんですけど、編集するとなるとちょっとハードルが上がっちゃいますよね。悩ましいポイントだなぁと思います。

    > ありがとうございます!その状態になると、とても安心です😊

    Ver 3.7.9 で対応してみました。ショートカット キーの入力を塞いでみたのですが、もし何か不具合とかあったら気軽に教えてもらえると嬉しいです。

    >> 瑞葉@わっふる さん

    > あとWikiが500 Internal Server Error吐いてるから使いたいのに見れない・・・

    すみません。レンタルサーバーのスペックがちょっと低めで、Wiki システムが重たくて落ちやすいんです…。私のポケットマネーではこれが限界でして…どうかご容赦ください🙏

    > var template = `
    > ここでエラーはいてしまう・・・

    おお!README テンプレートを作るマクロ、だいたい合ってますね!素晴らしいです。

    ただ、Mery のマクロはデフォルトで JScript9 (ES5 相当) が使われているので、複数行リテラル`はサポートされてないんですよね。これがエラーの原因だと思います。

    ES6 の機能を使える V8 エンジンに切り替えるには、マクロの先頭に次の指令を入れてみてください👇

    #language = "v8"
    

    あと、InputBox は Mery では使えないので、少しだけ変更が必要です。以下のようなかたちで書き直してみました。

    #language = "v8"
    
    // READMEテンプレートを作成するマクロ
    var author = prompt("作者名を入力してください", "作者名");
    var softwareName = prompt("ソフト名を入力してください", "ソフト名");
    var version = prompt("バージョンを入力してください", "1.0.0");
    var currentDate = (new Date()).toISOString().split('T')[0];
    var licenseType = prompt("種別(例: フリー、シェアウェアなど)を入力してください", "フリー");
    var language = prompt("開発言語を入力してください", "JavaScript");
    var platform = prompt("対応機種を入力してください", "Windows/Mac");
    var copyright = prompt("著作権者を入力してください", "著作権者");
    var redistribution = prompt("再配布の可否を入力してください", "可");
    var reproduction = prompt("転載の可否を入力してください", "不可");
    var homepage = prompt("ホームページURLを入力してください", "http://example.com");
    var contact = prompt("連絡先を入力してください", "contact@example.com");
    
    // テンプレート生成
    var template = `
    README
    
    概要
    ============
    
    【 作者名 】 ${author}
    【 ソフト名 】 ${softwareName}
    【 バージョン 】 Ver${version}
    【 作成日 】 ${currentDate}
    【 種別 】 ${licenseType}
    【 開発言語 】 ${language}
    【 対応機種 】 ${platform}
    【 著作権者 】 ${copyright}
    【 再配布 】 ${redistribution}
    【 転載 】 ${reproduction}
    【 ホームページ 】 ${homepage}
    【 連絡先 】 ${contact}
    ============
    
    【 はじめに 】
    ここに内容を記載します
    【 ファイル構成 】
    ここに内容を記載します
    【 インストール 】
    ここに内容を記載します
    【 アンインストール 】
    ここに内容を記載します
    【 使い方 】
    ここに内容を記載します
    【 著作権 】
    ここに内容を記載します
    【 免責 】
    ここに内容を記載します
    【 謝辞 】
    ここに内容を記載します
    【 開発履歴 】
    ここに内容を記載します`;
    
    // エディタの現在行を取得
    var currentLine = document.selection.GetActivePointY(mePosLogical);
    
    // 現在行のインデントを取得 (Mery の仕様に依存)
    var indent = "";
    var lineIndentation = getLineIndentation(currentLine);
    for (var i = 0; i < lineIndentation; i++) {
        indent += " ";
    }
    
    // テンプレートを挿入
    document.selection.Text = template.split("\n").map(s => indent + s).join("\n");
    
    function getLineIndentation(line) {
        var s = document.GetLine(line);
        // 行頭の空白を正規表現でマッチさせる
        const match = s.match(/^(\s*)/);
        // マッチ結果の長さを返す (マッチがあればその長さ、なければ 0)
        return match ? match[1].length : 0;
    }
    

    もし他に何か困ったことがあれば気軽に聞いてくださいね。

     |  Kuro  |  返信
  21. >> Kuro さん

    メリクリ更新、お疲れさまでした🎅
    最近もっぱら非同期マクロerな私には嬉しい更新ばかりで、堪能させていただきます!編集モードの論理行対応も、後ほど試させていただきますね😉

    Meryのメリクリ更新にあやかりまして、私の方もGeminiさんに相談するマクロを更新しておきますね。プロンプトテンプレート定義で、ジャンル別サブメニューにも対応してみました。

    Google Gemini に相談 - MeryWiki

    ※この修正でアクセラレータキーを変更してしまいました。ご勘弁を。

    > 気づいたら Gemini さんがすっかり友達みたいな存在に…。これ、無料期間が終わっちゃったら寂しくなりそうです…。ずっと続いてくれるといいのになぁ。

    本当ですねw
    たまに「そうじゃないんだよ~」みたいな回答もしてきますが、すっかり頼れる相棒で。大好きなMeryにこんな強力な武器が備わってしまい、もう、どうしてくれようか状態です。

    でもでも、無料期間が終わってもめちゃくちゃ良心的な価格で使えるんだろうと思っています。
    先日のGPT版の方のマクロ、平日は仕事でバンバン使っているのですが、それでも $0.01/日 ほどの利用料でして。このペースだと $1 を使うのに4ヶ月も5ヶ月もかかるのでは?という感じです。ビール缶1本分ほどを奢ったら半年も付き添ってくれると思うと、ありがたいものですw

    ということで各社、競って性能アップ & 低価格化が進んでいますから、Geminiさんもいずれ有償化されても年間 $2~3 くらいで運用できるんだろうなぁと楽観視しています。

    > Ver 3.7.9 で対応してみました。ショートカット キーの入力を塞いでみたのですが、もし何か不具合とかあったら気軽に教えてもらえると嬉しいです。

    先日のIME入力防止ともども、ご対応ありがとうございます!
    軽く触ってみた感じ、しっかりキー入力・マクロ動作がブロックされていて、いい感じです。
    何気に嬉しかったのは、「Gemini相談マクロのショートカットキー押下→コンテキストメニュー表示」までの間のコンマ数秒の間の入力もちゃんとブロックされていたところです。たまに早まってコンテキストメニューのアクセラレータキーを押してしまったりして、誤爆してしまっていたんですよね🤤

     |  yuko  |  返信
  22. >> yuko さん

    メリークリスマス!(…って、25 日になると、もうクリスマス終わった感じになりますよねw)

    > Meryのメリクリ更新にあやかりまして、私の方もGeminiさんに相談するマクロを更新しておきますね。

    わーい!ありがとうございます!お疲れさまです🎄

    テンプレート機能にジャンル別のサブメニュー対応、便利すぎます…!バッチリ問題なく動いてます。

    実は私も別のマクロでサブメニュー化したいものがあって、「メニューのコマンド ID ってどうやって管理するんだろう…?」と悩んでいたので、参考になります。(とはいえ、ソースを見ても理解が追いつかず…😅)

    > このペースだと $1 を使うのに4ヶ月も5ヶ月もかかるのでは?という感じです。ビール缶1本分ほどを奢ったら半年も付き添ってくれると思うと、ありがたいものですw

    確かに、そんなお手軽な感じなら安心して使えそうですね。

    やっぱり、API で収益化するのって難しいでしょうし、完全無料っていうサービスは無理っぽいですもんね。

    > 何気に嬉しかったのは、「Gemini相談マクロのショートカットキー押下→コンテキストメニュー表示」までの間のコンマ数秒の間の入力もちゃんとブロックされていたところです。

    そこまで細かく意識して実装したわけではないのですが、キー入力時にスクリプトが実行中かどうかをチェックする仕組みになってるので、自然とそうなったみたいです。うまく動作しているようで安心しました。

    あと、「Gemini に相談」マクロのソース (長いですよね…) をコピーするとき、マウスでぐいーんと範囲選択すると「【アーカイブ】ソースコード (従来エンジン版)」まで一緒に選択しちゃって、「あれ、動かない…?」ってなりがちだったので、Wiki のソース部分にマウスを乗せると右上にコピーボタンが出る拡張機能を入れておきました。これで少しラクになると思います👍

     |  Kuro  |  返信
  23. > 実は私も別のマクロでサブメニュー化したいものがあって、「メニューのコマンド ID ってどうやって管理するんだろう…?」と悩んでいたので、参考になります。(とはいえ、ソースを見ても理解が追いつかず…😅)

    まぁ結構、無理やりな方法ではあるのですが…😅

    TOP
    ├ 第1階層_アイテム1
    ├ 第1階層_アイテム2 (サブメニュー項目)
    │ ├ 第2階層_アイテム1
    │ └ 第2階層_アイテム2
    ├ 第1階層_アイテム3 (サブメニュー項目)
    │ ├ 第2階層_アイテム1
    │ └ 第2階層_アイテム2
    └ 第1階層_アイテム4
    

    というような構造を例にします。

    まず、各階層内のアイテム数は最大 99 (つまり最大2桁) という前提を置きます。

    そうすると「第1階層に所属するアイテムIDは1~99の範囲」になり、100以上の数値は好きに使えることになるので、「第2階層のアイテムIDは100以上を使う」という前提が置けます。

    次に第2階層のアイテムIDを作る際は、「100以上であること」「他の第2階層配下のアイテムIDと重複しないこと」さえ満たせればいいので、「<第1階層><第2階層(2桁固定)>」という文字列結合的な形式にすれば、ユニークなIDが作れることになります。

    ここまでのロジックをjson配列に上から繰り返し処理で採番していくと、以下のようなアイテムID (コマンドID) を割り振ることができます。

    TOP
    ├ 第1階層_アイテム1 →コマンドID 1
    ├ 第1階層_アイテム2 (サブメニュー項目)
    │ ├ 第2階層_アイテム1 →コマンドID 201 [第1階層アイテムID "2" + 第2階層アイテムID "01" (2桁にパディング)]
    │ └ 第2階層_アイテム2 →コマンドID 202 [第1階層アイテムID "2" + 第2階層アイテムID "02" (2桁にパディング)]
    ├ 第1階層_アイテム3 (サブメニュー項目)
    │ ├ 第2階層_アイテム1 →コマンドID 301 [第1階層アイテムID "3" + 第2階層アイテムID "01" (2桁にパディング)]
    │ └ 第2階層_アイテム2 →コマンドID 302 [第1階層アイテムID "3" + 第2階層アイテムID "02" (2桁にパディング)]
    └ 第1階層_アイテム4 コマンドID 4
    

    …と、いうような感じです。

    > あと、「Gemini に相談」マクロのソース (長いですよね…) をコピーするとき、マウスでぐいーんと範囲選択すると「【アーカイブ】ソースコード (従来エンジン版)」まで一緒に選択しちゃって、「あれ、動かない…?」ってなりがちだったので、Wiki のソース部分にマウスを乗せると右上にコピーボタンが出る拡張機能を入れておきました。これで少しラクになると思います👍

    ありがとうございます!
    実は同じことを思ったところでして、ダメ元で相談してみようと思っていたところなのでしたwエスパー対応、ありがとうございますw

     |  yuko  |  返信
  24. > あと、「Gemini に相談」マクロのソース (長いですよね…) をコピーするとき、マウスでぐいーんと範囲選択すると

    小技ですが、開始位置をクリックして終了位置をShiftクリックするとブラウザでも範囲選択できますよ。カーソルが表示されないのでわかり辛いですけど。ドラッグで選択するのが面倒な時に使ってます。

     |  村人  |  返信
  25. >> yuko さん

    サブメニュー化についてのご説明、ありがとうございます!なるほど、そんな仕組みだったんですね。

    その方法なら、ユニークな ID を割り振ることで、PROMPT_TEMPLATE の特定のサブメニューを簡単に取得できそうですね。

    メニューでクリックした項目から、メニュー定義の配列 (JSON オブジェクト?) の中でその位置を特定するのが難しくてちょっと困っていたので、すごく参考になりました😊

    > 実は同じことを思ったところでして、ダメ元で相談してみようと思っていたところなのでしたwエスパー対応、ありがとうございますw

    あはは、実は私も、これ誰かがご要望してきそうな気がしたので、先に手を打っておきましたw とりあえずうまく動作しているみたいでよかったです。

    コードブロックが 1 行しかないときは、なんだかペコペコしますけど😅

    >> 村人さん

    > 小技ですが、開始位置をクリックして終了位置をShiftクリックするとブラウザでも範囲選択できますよ。カーソルが表示されないのでわかり辛いですけど。ドラッグで選択するのが面倒な時に使ってます。

    おお、なるほど、その手がありましたか。スクロールバーで操作できるので、誤選択も防げそうですね。早速活用させてもらいます!

     |  Kuro  |  返信
  26. Kuroさん

    > コードブロックが 1 行しかないときは、なんだかペコペコしますけど😅

    たしかに、コードブロックがマウスオーバーで膨らんだり、しぼんだり…w

    ちなみにブラウザ上でCSSを調整できる「Stylus」を使って、以下のスタイルを適用してみたらペコペコが改善されました。もしWiki側でCSSを仕込めるのでしたら、これで改善できるかもしれません。

    ```css
    .pretoclip-copy-button {
    height: 0;
    margin-top: -7px;
    }
    ```

     |  yuko  |  返信
  27. 一応geminiのやつ更新しました!
    あとreadme作れるやつ完成しました、試行錯誤しつつ作ったのでまだサンプルしか出てこないけど
    そこから魔改造してねッて感じにしてます
    https://www.dropbox.com/scl/fi/95g15u6d4bo6f6a0aunrj/mery_readme-generator.zip?rlkey=vcjqqu9lvl5x0o3o0libg4v99&dl=0
    因みにここにしまってます(ZIPなので多分大丈夫。。。?)
    これウィキ二公開したいんだけど、うまく伝えれないなってなって難しくて・・w
    Maryのマクロで作ったものなので頑張ったんですけどね。

     |  瑞葉@わっふる  |  返信
  28. >> yuko さん

    > もしWiki側でCSSを仕込めるのでしたら、これで改善できるかもしれません。

    ありがとうございます!いただいた CSS を適用してみたところ、ペコペコが無事改善されました。

    この拡張機能を導入する際、どうやら HTTPS 通信でないと動作しないようで、ローカルの Wiki 環境 (HTTP) では検証できず、本番環境で一発勝負するしかなく、ペコペコしている状態を諦めて放置していました。

    > ちなみにブラウザ上でCSSを調整できる「Stylus」を使って、以下のスタイルを適用してみたらペコペコが改善されました。

    なるほど、そんな便利なツールがあるんですね。

    本番環境なので、スタイルをいろいろ試したり調整するのが難しかったのですが、おかげさまで助かりました😊

    >> 瑞葉@わっふるさん

    おお、Mery でちゃんと動くようになってますね!🎉

    マクロの最後のあたりですが、document.selection.Text = template;は現在のタブにtemplateを出力するので、editor.NewFile();は省略しても問題なさそうです。

    もし、新しいタブに出力したい場合は、こんな感じに書くといいかもです:

    editor.NewFile();
    editor.ActiveDocument.selection.Text = template;
    

    試してみてください!😊

     |  Kuro  |  返信
  29. > おお、Mery でちゃんと動くようになってますね!🎉
    >
    > マクロの最後のあたりですが、`document.selection.Text = template;`は現在のタブに`template`を出力するので、`editor.NewFile();`は省略しても問題なさそうです。
    >
    > もし、新しいタブに出力したい場合は、こんな感じに書くといいかもです:
    > ```
    > editor.NewFile();
    > editor.ActiveDocument.selection.Text = template;
    > ```
    > 試してみてください!😊

    ひょえええ!?
    これはありがたい!
    新しいタブに出力できて満足しました!
    さっきのZIPは更新したので多分同じリンクからDLできるはず・・・!

     |  瑞葉@わっふる  |  返信
スポンサーリンク