マクロコマンドから「表示」の「色の反転」を取得したい

  1. 連続の発言になってしまい、お騒がせしています。

    「編集可能」なら「背景色は黒色」、「書込禁止」なら「背景色は白色」の使い方を模索中です。

    「書込禁止」状態を判別して、「色の反転」を実行してみましたが、「色の反転」は、最後の状態が保存されているので、無条件には実行できない事が判りました。
    「色の反転」の状態が取得できれば、条件の分岐が可能となり、目的の機能が実現できます。

    可能であれば、マクロコマンドから「表示」の「色の反転」を取得できるように要望します。

    よろしく、お願いします。

     |  大石剛司  |  返信
  2. 書き込みありがとうございます。

    > 「編集可能」なら「背景色は黒色」、「書込禁止」なら「背景色は白色」の使い方を模索中です。
    [色の反転] 機能はそもそも、夜、目が疲れないようにするための機能だったので、そのような使われ方は想定していませんでした。

    > 可能であれば、マクロコマンドから「表示」の「色の反転」を取得できるように要望します。
    [色の反転] に限らず、各種、オプションの項目にもマクロからアクセスできるような仕組みがあると、さらに幅が広がると思います。[色の反転] やテーマの切り替えなどがマクロからできれば良いですね。

    でも、けっこうマニアックなマクロを書く人向けの機能となりますので、時間をかけて開発しても喜ぶ人が少ないという点で、なかなか開発のモチベーションが… ^^;

     |  Kuro  |  返信
  3. > [色の反転] に限らず、各種、オプションの項目にもマクロからアクセスできるような仕組みがあると、さらに幅が広がると思います。[色の反転] やテーマの切り替えなどがマクロからできれば良いですね。

    マクロのポップアップメニューで折り返しを自分用に作ろうとして断念したことがあります。折返しは、1.無し、2.指定文字数、3.ウィンドウ端がありますけど、私は3がいらないので3の時は1に切り替えるようにして、1項目でトグルっぽくしちゃえと思ったんですが現在の状態がわからないとチェックも付けられないしとあきらめました。
    まぁCtrl+1とCtrl+2で切り替えられるので覚えました。どっちがどっちだったかは覚えられないんですけど(←覚える気がない)

    フォント、フォントサイズ、行間、縦書き、辺りがテーマと一緒にワンタッチ(マクロ)で切り替えられると物書きさんには嬉しいかもしれません。私は日本語の文章でも横書きの方が慣れてますのでアレですけど。

    タブの桁数は4で問題ない派ですけど、アセンブラとか使う人に取ってはタブ8に気軽にマクロで切り替えできればかなりクリティカルヒットかもしれません。

    表向きシンプルな設定で、やろうと思えばマクロで切り替えできるというのはすごく良さそうと思いますが、うーん……ワンタッチすら、ひと手間かもしれないですね、あ、イベントを使えばいらなくなるのかな、マクロの導入自体が面倒かも?うーん、喜ぶ人は多いと思うんですけど、どうでしょうね、取り敢えず私はオプションの項目にマクロからアクセスできる仕組みに賛成一票です

     |  シリル  |  返信
  4. > マクロのポップアップメニューで折り返しを自分用に作ろうとして断念したことがあります。

    自己レスですが、Bleatさんがマクロライブラリに「折返しトグル切り替え」をアップしてくれてる!
    すごいなぁ、できるんだ……黙ってアップして去っていく感じがカッコいいなぁ
    多分、私の発言を見て作ってくださったんですよね?
    どうもありがとうございます。

     |  シリル  |  返信
  5. > フォント、フォントサイズ、行間、縦書き、辺りがテーマと一緒にワンタッチ(マクロ)で切り替えられると物書きさんには嬉しいかもしれません。私は日本語の文章でも横書きの方が慣れてますのでアレですけど。
    そうですね、編集モードやテーマごとに設定を複数作成できるエディタはたくさんありますので、そういったニーズのほうが多いのだと思います。

    私は面倒くさがり屋なので、いちいちモードごとに設定するテキストエディタが苦手だったので、設定を一本化したシンプルなテキストエディタが欲しくて Mery を開発したという経緯がございますから、なかなか気が進まないところです… ^^;

    設定を複数作成できるエディタとしましては、フリーソフトではサクラエディタさんや gPad さん。有料ですと、EmEditor さん、縦書きも必要であれば秀丸エディタさんなどが定番ですので、モードごとに設定をしたい場合はこれらをオススメしております。

    ちなみに、Mery で、マクロからオプション項目へのアクセスは、やりたくないというわけではなく、作るのが大変なのと、まだベータ版ということでオプション項目が変動しがちなので、その都度、マクロに機能を追加・削除が必要となることなどもありまして、保留としておりますのでご了承くださいませ。

     |  Kuro  |  返信
  6. > 自己レスですが、Bleatさんがマクロライブラリに「折返しトグル切り替え」をアップしてくれてる!
    うは、ほんとですね!
    さらに、「書き換え禁止モード色反転」も投稿してくださっているようです。

    マクロを作成してくださっているみなさんのためにも、マクロ関連の機能強化も検討していきたいところです。

     |  Kuro  |  返信
  7. > 私は面倒くさがり屋なので、いちいちモードごとに設定するテキストエディタが苦手だったので、設定を一本化したシンプルなテキストエディタが欲しくて Mery を開発したという経緯がございますから、なかなか気が進まないところです… ^^;

    Kuroさんは充分すぎるほど丁寧にMeryを開発なさっていると思うので、モチベーションの上がらないことはその、そうですよね。放かって良いと思います

    > ちなみに、Mery で、マクロからオプション項目へのアクセスは、やりたくないというわけではなく、作るのが大変なのと、まだベータ版ということでオプション項目が変動しがちなので、その都度、マクロに機能を追加・削除が必要となることなどもありまして、保留としておりますのでご了承くださいませ。

    はい、了解しました
    それに、現状でも限りなく近い機能を実現できることはBleatさんが実証してくれたわけですし

     |  シリル  |  返信
  8. そう言っていただけると助かります。

    マクロからオプション項目へ直接アクセスさせるための仕組みを用意するのは上記の通りの理由で、すぐには対応できそうにありませんが、INI ファイル経由でオプション項目を取得・設定できる仕組みを考えてみました。

    マクロ側に追加するメソッドとしては、下記の 6 つ。

    ReadSettings
    → INI ファイルからオプション項目などの設定を読み込んで画面に反映させます
    WriteSettings
    → オプション項目などの設定を INI ファイルに書き出します
    ReadSettingInteger("セクション", "キー", "デフォルト値")
    → INI ファイルから設定を数値型で読み込みます
    ReadSettingString("セクション", "キー", "デフォルト値")
    → INI ファイルから設定を文字型で読み込みます
    WriteSettingInteger("セクション", "キー", "設定値")
    → INI ファイルに設定を数値型で書き出します
    WriteSettingString("セクション", "キー", "設定値")
    → INI ファイルに設定を文字型で書き出します

    Mery はポータブル用途 (USB メモリなど) を考慮して、INI ファイルへの設定の書き出しは、なるべく回数を抑えています。

    オプション画面で「OK」ボタンを押したときは INI ファイルが更新されますが、例えば「色の反転」などをメニューから選択したときなどは INI ファイルに、すぐには反映されません。

    なので、上記のメソッドを組み合わせて…

    // INI ファイルを強制的に更新 (これが大事)
    editor.WriteSettings();
    // INI ファイルから設定値を読み込む
    var x = editor.ReadSettingInteger("View", "InvertColor", 0);
    // 設定値を使って何かする
    alert(x);
    // INI ファイルに設定を書き出す
    editor.WriteSettingInteger("View", "InvertColor", 1);
    // INI ファイルの内容を画面に反映させる
    editor.ReadSettings();

    こんな感じで、INI ファイルを経由してマクロからオプション項目を取得、変更できるような仕組みを考えてみました。

    ただし、編集モードごとの設定項目や、テーマごとの設定項目は、INI ファイルの肥大化を防ぐために、ユーザがカスタマイズしたときにしか INI ファイルに書き出されない仕様になっているので、上記の案は、全体のオプション項目と、エディタの設定項目ぐらいに限られますが…。

    これならそれほど時間がかからず実装できる気がします。

     |  Kuro  |  返信
  9. > これならそれほど時間がかからず実装できる気がします。

    おおー!個人的には、わかり易くて良さそうに思います

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

    > おおー!個人的には、わかり易くて良さそうに思います
    オプション項目それぞれに直接アクセスする機能を設けるより、分かりやすいかもしれませんね。

    あと、この機能を実装しておけば、オリジナルのマクロの設定を簡単に Mery.ini に保存・読み込みできるので、夢が広がりそうな気がしてきました ^^

     |  Kuro  |  返信
  11. > あと、この機能を実装しておけば、オリジナルのマクロの設定を簡単に Mery.ini に保存・読み込みできるので、夢が広がりそうな気がしてきました ^^

    あー!ひょっとして……と思ってたんです
    [Himitsu]
    Naisho=xxxx
    こんな感じで勝手に決めて、マクロが実行終了しても次の実行まで、変数を!持てるということですよね。何かで持ちたいと考えたことがありました。何でそう思ったのだったか……忘れましたが(←)楽しくなってきました!

     |  シリル  |  返信
  12. おや、素敵なことになりそうですね。

    > Mery はポータブル用途 (USB メモリなど) を考慮して、INI ファイルへの設定の書き出しは、なるべく回数を抑えています。
    > オプション画面で「OK」ボタンを押したときは INI ファイルが更新されますが、例えば「色の反転」などをメニューから選択したときなどは INI ファイルに、すぐには反映されません。
    そうなんです。これがマクロ開発上の壁になっていたんですよね。
    「ポップアップメニューで検索先にジャンプ」マクロを改造していたときに、「自動マーカー ON/OFF」や検索ダイアログの「大文字/小文字 を区別」「正規表現 ON/OFF」等のオプションの値を Mery.ini から取得し同期する仕組みにできないか頭をひねったような記憶があります…。あと、こちらのトピックでも話題にあがっていた「折り返し方法の3モードトグル切り替え」の自作を試みたときにも、結局 include ライブラリから JSON ファイルに設定を書き出すことにしました(アイコンのデザインが決まらなくてお蔵入りしてますが)。
    まあ私の事情はさておき、マクロでできることの範囲がひろがりそうで楽しみです。 :)

    > INI ファイル経由でオプション項目を取得・設定できる仕組みを考えてみました。

    > ReadSettingInteger("セクション", "キー", "デフォルト値")
    > ReadSettingString("セクション", "キー", "デフォルト値")
    むむ、読み込みで設定値を取得するさいにも第三引数が必要なんでしょうか? 扱い方がちょっと難しそうですね。

    > あと、この機能を実装しておけば、オリジナルのマクロの設定を簡単に Mery.ini に保存・読み込みできるので、夢が広がりそうな気がしてきました ^^
    おお、JSON への書き出しよりも便利そうですね。すでに肥大化していて数百キロバイトになっているウチの Mery.ini ですが、まだまだ頑張ってもらわないとって感じで。 :D

     |  sukemaru  |  返信
  13. >> シリル さん
    まさにその通りです。

    そう言われてみると確かに!マクロの設定が保存できることはもちろんですが、今まで、マクロにはグローバル変数のようなものが持てなかったのですが、そういう用途でも使えそうですね。

    …でも、そんな使い方になってくると、EraseSection("セクション") のような、設定値の削除メソッドも必要になってくるのかもしれません。記述を誤ると設定が消滅するので危険極まりないメソッドですが ^^;

    とりあえず、Read と Write だけで良いかなぁ…

    >> sukemaru さん
    ご意見ありがとうございます。

    > 検索ダイアログの「大文字/小文字 を区別」「正規表現 ON/OFF」等のオプションの値
    残念ながら、今回、実装できそうなのは主にオプション画面の設定項目のみで、検索ダイアログの設定値までは想定していませんでした。

    そこまで必要となるとちょっと一筋縄ではいかなくなりますね… ^^;

    ないよりはあったほうがマシ、ぐらいの軽い思いつきで提案してみた機能でしたが、そう言われてみると、どこからどこまでが対象なの?とかそういったご質問も出てきそうな気がしてきて、気軽には実装できないような気がして来ました…。

    > むむ、読み込みで設定値を取得するさいにも第三引数が必要なんでしょうか? 扱い方がちょっと難しそうですね。
    読み込み時にそもそもその項目が INI ファイルに存在しなかった場合に使用される値が "デフォルト値" で指定した値、というのを想定していました。

    > すでに肥大化していて数百キロバイトになっているウチの Mery.ini
    最近のアプリケーションは設定ファイル、数十メガのものもたくさんありますからね、気にしたらいけません!^^

     |  Kuro  |  返信
  14. 返信ありがとうございます。

    > グローバル変数
    まさにその使い道をまっさきに想像しました。セクション名を [MacroSettings] にして複数のマクロから共通で参照できるキーをつくれそうだなぁと(どう活かせるかまで具体的に考えているわけではありませんが)。

    > 残念ながら、今回、実装できそうなのは主にオプション画面の設定項目のみで、検索ダイアログの設定値までは想定していませんでした。
    > ないよりはあったほうがマシ、ぐらいの軽い思いつきで提案してみた機能でしたが、そう言われてみると、どこからどこまでが対象なの?とかそういったご質問も出てきそうな気がしてきて、気軽には実装できないような気がして来ました…。
    お手数おかけしますがマクロリファレンスで "参照できる INI 内のセクション" を公開していただくか
    あるいは "どの設定値を読み書きできるかは自分でさがしてみてね" という方針でも。 :)

    > > 読み込みで設定値を取得するさいにも第三引数が必要なんでしょうか?
    > 読み込み時にそもそもその項目が INI ファイルに存在しなかった場合に使用される値が "デフォルト値" で指定した値、というのを想定していました。
    なるほど、 ReadSettingStr/Int で参照して変数などに代入したさいに NaN, null, undefined にならないような仕組みということでしょうか? もしかすると参照キー名をミスタイプしてしてしまったまま実行したときにマクロがエラーを返してくれないとデバッグしづらくなるかもしれませんが… 扱いやすいかどうかは単純に「慣れろ」というところかもしれませんね。

    Kuroさんの開発方針が定まっていれば、あとはマクロで利用する側が柔軟に活用していけばよいのでしょうが、どうやっても
    > そういったご質問も出てきそうな気がしてきて
    の部分だけは可能性として排除できませんから仕方ないことかとおもいます。
    個人的に楽しみな機能ですので、うまく折り合いがついて実装されることを期待して待たせていただきます。 :D

     |  sukemaru  |  返信
  15. > > 検索ダイアログの「大文字/小文字 を区別」「正規表現 ON/OFF」等のオプションの値
    > 残念ながら、今回、実装できそうなのは主にオプション画面の設定項目のみで、検索ダイアログの設定値までは想定していませんでした。
    件の「ポップアップメニューで検索先にジャンプ」マクロの include 版は、おもいつきでチマチマと機能を追加してたせいで、今となっては何がどうなっているのか自分でもわからなくなっています。もし INI のキーの読み書き・同期できるようになっても、もうコードの書き直しはできない気がします…。
    検索ダイアログの設定値のことは忘れていただいて、オプションパネルの設定項目のみでお進めくださいませ。 :)

    自己レスですが
    > 「折り返し方法の3モードトグル切り替え」
    のマクロはとりあえずアイコンを作って Bleat さんの「折り返しトグル切り替え」のページに追加させていただきました。こういうマクロの場合は、設定状態を INI と同期できないと標準メニューや標準ショートカットから切り替えするときとの整合性がとれなくなるんですよね。
    Read/WriteSettings メソッドに期待大!
    Read/WriteSettings メソッドに期待大!

     |  sukemaru  |  返信
  16. > …でも、そんな使い方になってくると、EraseSection("セクション") のような、設定値の削除メソッドも必要になってくるのかもしれません。記述を誤ると設定が消滅するので危険極まりないメソッドですが ^^;

    安易に使わないことが極意……みたいな位置付けになっちゃうかもですね
    Eraseは元よりiniへのアクセス自体

    そういう仕組みができたとして自分でマクロを作るのは楽しそうですけど、なんとなく、なんとなーく、根拠はないですけど、人が作った、iniにアクセスするマクロは使いたくないな―的なことはちょっとだけ思います

    だけど、折返しトグル程度は諦められるとしても、どうしてもグローバルで持ちたい場合もあるかもしれないし、いくつかのオプション項目をワンタッチでで切り替えられるとかなり便利と思います。

    背景画像は切り替えられるでしょうか?
    実は原稿用紙のような背景画像を作成するマクロを作ったんですが、私のちっぽけな興味と未熟さのため、Jscriptではなくて、さらに面倒な下調べや設定をマクロ使用者に強いるので完成度が低く、こりゃダメだと思ってモジモジしてます。
    切り替えられると嬉しいです。原稿用紙マクロと今回の提案は直接は関係ないですが。

     |  シリル  |  返信
  17. > > お手数おかけしますがマクロリファレンスで "参照できる INI 内のセクション" を公開
    マクロからオプション項目に直接アクセスする仕組みを作るとマクロリファレンスのメンテが大変ですし仕様変更にも対応が大変なので、INI を扱えるメソッドを用意すればマクロリファレンス更新しなくて済むかと思って提案したのですけど、本末転倒ですね… ^^;

    "どの設定値を読み書きできるかは自分でさがしてみてね" で、お願いできると助かります。正直、どこまで反映されるかは私も把握できていません。

    オプション項目によってはリアルタイムで強制的に反映させると不具合が発生するものもあると思いますし、すべての項目において動作検証を行うとなるととんでもなく時間がかかりそうですから、隠し機能にしておきたいレベルです…。

    > なるほど、 ReadSettingStr/Int で参照して変数などに代入したさいに NaN, null, undefined にならないような仕組みということでしょうか?
    そうなのかもしれませんが、私が考えた仕組みではなく、プログラミング言語で INI ファイルから値を読み込むメソッドでは "デフォルト値" を指定する仕様が一般的なので拝借してみました。

    > 個人的に楽しみな機能ですので、うまく折り合いがついて実装されることを期待して待たせていただきます。 :D
    ありがとうございます。そうなんですよね…、マクロの仕様についてはみなさん賛否両論あって、収拾がつかなくなってしまいますから、「いいね」か「いらね」の 2 択でお願いできれば助かります (w

     |  Kuro  |  返信
  18. ご返信ありがとうございます。

    > そういう仕組みができたとして自分でマクロを作るのは楽しそうですけど、なんとなく、なんとなーく、根拠はないですけど、人が作った、iniにアクセスするマクロは使いたくないな―的なことはちょっとだけ思います
    勝手に設定を変更されてしまう恐れもありますから、セキュリティ的な観点から考えるとよろしくないかもしれないですね。検索履歴とかの情報にもアクセスできてしまいますし… ^^;

    まぁ、マクロで JavaScript を採用している時点でそのようなリスクはすでにあるわけですが…。

    > 背景画像は切り替えられるでしょうか?
    はい、試作品を作ってみていますが、マクロから背景画像の切り替えはできました。画像のパスは絶対パスになりますが。

    しかしながら、うーん、セキュリティ的なリスクを考慮すると、やはり、このアイデアは没案件でしょうか…。

     |  Kuro  |  返信
  19. > しかしながら、うーん、セキュリティ的なリスクを考慮すると、やはり、このアイデアは没案件でしょうか…。

    迷わせてしまってすみません、なんとなくiniになにかされるのがヤだな~くらいの感覚だったんです。公開されたマクロについては、変なのがあったら誰かが気づいて注意喚起してくれるのではないでしょうか?(←他力本願)
    まぁきっと大丈夫ですよ

    ……私は連打癖があるんです。Alt+Xの文字コード変換など連打しちゃいますし、数値の変換なども「10進!16進!ソレソレソレ!フゥーーー!」ってなもんで。

    ついついポンポンっと押しちゃって1回目の書き込みが終わる前に2回目のマクロがなにかしようとしてエラーに、という、いけない妄想もしてしまいますが、これはもうしょうがないというか『連打するな』ですね。

    今回の提案について私は「いいね」に一票です

     |  シリル  |  返信
  20. > セキュリティ的なリスクを考慮すると、やはり、このアイデアは没案件でしょうか…。
    あぁぁ、なんと、悲しいことをおっしゃる!?
    JavaScript マクロの範疇でも FileSystemObject や ADODB などからファイルの書き換えや削除などやりたい放題できることを鑑みれば、セキュリティ的なリスクなんて言っても…。
    逆に現状の仕様でも、書き換え前の INI ファイルをバックアップ保存するコードを作ることもできますし(バックアップ用メソッドがあればさらに楽でしょうが)、連打対策なら当該マクロの前回実行日時を保存して参照する仕組みもつくれます(現状では JSON に、将来的には mery.ini に)。
    「折り返しトグル切り替え」マクロは JSON (w/ IO.js) の使い方の簡単なサンプルとして、あえて Bleat さんのとは違うかたちでコードを記述しています。

    > 隠し機能にしておきたいレベルです…。
    個人的にはそれでもよいかなとおもいますが、マクロライブラリにアップロードしたばあいに "あやしいマクロ" 扱いになっちゃいますね。 XD
    あるいは、マクロライブラリに "実験的マクロ(人柱用)" みたいなグループを作って、ZIP アップロードではなくソースコードだけを貼っておくようにするとか。

    私の場合は自分専用にマクロをつくるなら問答無用で INI でも書き換えさせてしまうでしょうけど、マクロライブラリに公開用のコードなら「Mery.iniの設定を書き換えてオプションを変更します」の確認ダイアログを出すかどうかの設定用変数を仕込みますね、多分。 Read/WriteSettingInt() メソッドで当該マクロの初回起動フラグとかも仕込めるわけですから、最初の実行時だけダイアログで「このマクロを実行するたびに確認ダイアログを表示させますか?」を選択できる仕組みもつくれそうです。

    > Alt+X
    > 連打癖
    余談ですが、Alt+X の文字コード切り替えってキャレットの右側が対象ならステータスバーの表示と(ついでに [from]charCodeAt() メソッドの挙動とも)おなじになるんだけどなぁ… なんて。
    連打癖なら私も。自作マクロはトグル機能のもの(//行コメント、"引用符"、Yes/No、キャレット移動、折り返し)や対の機能を持つもの(行を上/下に移動、インデント/逆インデント、±スペース×2字下げ)などが多いので、ついつい。

     |  sukemaru  |  返信
  21. >> シリル さん
    ご返信ありがとうございます。
    そうですよね、マクロから INI ファイルを勝手にいじられると不安になるキモチ、わかります。

    > 迷わせてしまってすみません
    いえいえ、セキュリティ的な問題ですから、そういったご意見をいただき、「そういわれてみると!」と強く思いました。

    > ついついポンポンっと押しちゃって1回目の書き込みが終わる前に2回目のマクロがなにかしようとしてエラー
    マクロの実行はシングルスレッド (同時に複数発動しない仕様) なので、その点は大丈夫だと思います。

    > 今回の提案について私は「いいね」に一票です
    ありがとうございます。

    試作品を作ってみた感じですと、結構自由度が高くて、セキュリティ的な問題以外にも、隠し機能にしている項目もマクロから変更できてしまうので、隠してる意味がなくなってしまうっていう問題も出てきましたが… ^^;

    >> sukemaru さん
    ご返信ありがとうございます。

    > FileSystemObject や ADODB などからファイルの書き換えや削除などやりたい放題
    確かにそうなんですよね。それに、Excel や Word のマクロでもやりたい放題できるわけですし…。

    > あるいは、マクロライブラリに "実験的マクロ(人柱用)" みたいなグループを作って、ZIP アップロードではなくソースコードだけを貼っておくようにするとか。
    難しいところですねー。
    とりあえず、他のテキストエディタのマクロはそういった機能、ないのかな?と思って調べてみたところ、秀〇さんでは writeinistr, writeininum, getinistr, getininum、E〇Editor さんでは GetProfileInt, GetProfileString, WriteProfileInt, WriteProfileString など、INI ファイルやレジストリに直接アクセスするためのメソッドが用意されていました。

    しかし、有料でデジタル署名もついているアプリケーションだから許される機能なのかも…。Mery は野良アプリなので、やはりセキュリティ的な面では弱いですから…。(逆に、野良アプリだから Windows からは厳しい扱いを受けるから大丈夫なのかも? w)

    > 最初の実行時だけダイアログで「このマクロを実行するたびに確認ダイアログを表示させますか?」を選択できる仕組みもつくれそうです。
    マクロの作者様がそういったお気遣いをしてくれるとありがたいです。

    とりあえずは、前回提案した EraseSection など、設定削除の機能を用意しなければ、設定を読み書きするだけなので、悪意のあるマクロで設定を全部消された!などは防げるとは思うのですが…。

    > Alt+X の文字コード切り替えってキャレットの右側が対象
    これは、Microsoft の Word やワードパッドの仕様 (左側が対象) に準拠していますのでご了承くださいませ。

    しかーし、どうしましょう。結構面白そうな機能なのですが、セキュリティという言葉に弱いのですー ^^;

     |  Kuro  |  返信
  22. > 悪意のあるマクロ
    考え出すとキリがなさそうですよね…

    たとえばですが、トリガー(セーフティ)的な「隠し機能」を実装するというのはいかがでしょうか?

    ① INI ファイル内に「隠し機能」 "IniEditableByMacro=1" キーをユーザーが用意していないと、マクロ(WriteSetting メソッド)による INI の書き換えをさせない
    ② または、ゼロバイトのダミーファイル "IniEditableByMacro" を Mery フォルダか Macros フォルダにユーザーが用意していないと、マクロ(WriteSetting メソッド)による INI の書き換えをさせない

    ただし、①の場合は WriteSettingInt() メソッドで当該キーを容易に書き換えできてしまうかもしれません(→ 1 以外の値にされて他のマクロで WriteSetting メソッドが使用できなくなる)。 :(

    ②の着想としては、CCleaner の "portable.dat" や foobar2000 の "portable_mode_enabled" (レジストリやユーザーフォルダに干渉させない仕組み)みたいなかんじで。
    実行ファイル(ここではマクロ)の挙動をユーザーが可視的に管理できるという点で、悪意のあるマクロによる不如意な INI の書き込みを防ぐことができます。
    でも、②の場合も既存の JavaScript マクロの仕様で "portable.dat" や "portable_mode_enabled" ファイルを勝手に作れるようなコードが実現可能という…。 :(

    やはり見えない仮想的悪意への対策は考えてもキリがない…。 すでに現状でも「やろうとおもえばやりたい放題できる」のですから「悪用できる仕組みがなければ心配ない」ともいえないわけですので、ただただ前向きにご検討いただきたいところです。
    いや、むしろ「Mery.ini 以外の部分に迷惑をかけるわけじゃないからイイでしょ! テヘッ」っと開き直ってみてはいかがでしょうか。 :D

     |  sukemaru  |  返信
  23. >>sukemaruさん
    >連打癖なら私も。自作マクロはトグル機能のもの(//行コメント、"引用符"、Yes/No、キャレット移動、折り返し)や対の機能を持つもの(行を上/下に移動、インデント/逆インデント、±スペース×2字下げ)などが多いので、ついつい。

    同好の士を発見しましたwナカーマ
    だけどおかしいな、連打するとエラーになりませんか?
    https://imgur.com/a/K85Ofwp
    このように。『折り返しトグル切り替えD.js』でも確認しました。まぁ外部のファイルにアクセスするマクロは、というかマクロに限らずですが、避けられない宿命なのだろうなと諦めています。
    includeライブラリは私には難しくて手が出ませんが、あっひょっとして中でスレッド分けたりしてるんでしょうか?……いやそんなことしないか。うーむ

    1秒に数百万命令をこなすPCが、人間の連打に耐えられないほどですから、ファイルアクセスは極端に重い……と思ってます
    ほぼデフォルトのiniの中身が1として、数百キロに肥大したiniの中身が例えば20として、じゃぁ20倍かかるかというと、ファイルアクセス自体に1000(テキトー)とか掛かってるから1001が1020になったところでそんなに変わらない。起動が遅いとすれば他に原因が……あるんじゃないかなぁ。きちんと調べたわけじゃないというか、調べ方すらわかんないですけど

    私自身の反省も含めて、やはり『連打するな』なのかと思いますが

    >> ついついポンポンっと押しちゃって1回目の書き込みが終わる前に2回目のマクロがなにかしようとしてエラー
    >マクロの実行はシングルスレッド (同時に複数発動しない仕様) なので、その点は大丈夫だと思います。

    Kuroさんにはこのように言っていただいているので大丈夫なのかな
    まぁ連打についてはもういいですよね。シリルの奴はしつこくていけません←
    そんなことよりも得られる利益の方が遥かに大きいわけですし

    >>Kuroさん
    > セキュリティ的な問題以外にも、隠し機能にしている項目もマクロから変更できてしまうので、隠してる意味がなくなってしまうっていう問題も出てきましたが… ^^;
    > しかーし、どうしましょう。結構面白そうな機能なのですが、セキュリティという言葉に弱いのですー ^^;

    いつも真面目に真摯に対応するKuroさんの性格が現れていると思います
    ここは1つMery本体とマクロやプラグインを切り離して考えてみてはいかがでしょうか?Mery本体のことじゃないから、知らないもん!です
    Zipでマクロをアップしている場合ダウンロードの際に注意する旨を表示しているわけですし。
    速度についても、Mery標準機能の根幹部分に関わるアルゴリズムは考慮されて欲しいと思いますが、私も含めて、どこの馬の骨が作るかしれないマクロの動作速度まで気にする必要は全く無いわけで、JavaScriptを採用しているわけですし、積極的に無責任な感じで良いのではないでしょうか

     |  シリル  |  返信
  24. ご提案いただき、ありがとうございます。

    > ① INI ファイル内に「隠し機能」 "IniEditableByMacro=1" キーをユーザーが用意していないと、マクロ(WriteSetting メソッド)による INI の書き換えをさせない
    なるほど!と思いましたが、確かにおっしゃる通り、INI ファイルを書き換えられてしまう恐れはありますね。

    あとは、悪意がなく、一時変数的に INI を使っているだけのマクロも、普通のユーザさん (IniEditableByMacro を知らない人) には動かせなくなってしまいますね… ^^;

    > ② または、ゼロバイトのダミーファイル "IniEditableByMacro" を Mery フォルダか Macros フォルダにユーザーが用意していないと、マクロ(WriteSetting メソッド)による INI の書き換えをさせない
    これなら、マクロを配布する人がファイルをダミーファイルを一緒に配布すればいいから、普通のユーザさんが使えないっていう問題は解決されそうですが、おっしゃる通り、JavaScript で生成できてしまうので、悪意のある人ならそれぐらいは、やってのけそうですもんね ^^;

    > ②の着想としては、CCleaner の "portable.dat" や foobar2000 の "portable_mode_enabled" (レジストリやユーザーフォルダに干渉させない仕組み)みたいなかんじで。
    そういわれてふと思い出しました。
    本件とはまったく関係のない小ネタですが、Ver 2.6.14 からは、上記のソフトを参考にして MeryPortable.ini というファイルを配置しておけば、Mery.ini が存在しなくても強制的にポータブルモードで起動して、Mery.ini を Mery.exe と同じフォルダに生成するようになっていますね。(特にメリットはないですが… w)

    > いや、むしろ「Mery.ini 以外の部分に迷惑をかけるわけじゃないからイイでしょ! テヘッ」っと開き直ってみてはいかがでしょうか。 :D
    確かに、Mery 以外に影響は及ばないですし、設定が消えるわけではなく、運が悪くてもちょっと設定が変わっちゃうぐらいですもんね。

    ReadSettings メソッド (設定を強制的に反映させる機能) で設定を強制反映できるので、例えば、悪意のあるマクロで "選択中のマクロ" を書き換えて ReadSettings メソッドで強制的に設定を反映させると、ユーザが意図しないうちに F4 キーで怪しいマクロが発動…!

    なんていうことも思いつきますが、ReadSettings メソッドで強制的に反映させられる項目はオプション項目のみなので、登録済みのマクロや、外部ツールの設定、検索履歴および検索の設定などのプライベートな部分はいくら書き換えても ReadSettings で強制的に反映させることはできません。

    そのあたりの項目は WriteSettingInteger, WriteSettingsString メソッドで INI ファイル自体を書き換えることは可能ですが、書き換えても Mery の仕様で終了時に Mery.ini が上書きされるので元に戻るから安心ですね。

    とりあえず、ベータ版ですし、実装してみましょうか。

     |  Kuro  |  返信
  25. ご返信ありがとうございます。

    > だけどおかしいな、連打するとエラーになりませんか?
    あらら、少なくとも、Mery.ini を書き換えるマクロメソッドの試作品では連打や、キーを押しっぱなしにしてすごい勢いで連続起動させても大丈夫でした。(試した PC が SSD だから余裕があっただけという話も無きにしも非ずですが)

    > includeライブラリは私には難しくて手が出ませんが、あっひょっとして中でスレッド分けたりしてるんでしょうか?……いやそんなことしないか。うーむ
    JavaScript もシングルスレッドのはずですが、IO.js を見てみましたけど謎ですね。ファイルの入出力に ADODB っていう ActiveXObject を使われているみたいなので、それが Mery 本体とは別のスレッドで発動しているのかも…?

    > Kuroさんにはこのように言っていただいているので大丈夫なのかな
    はいー、今回実装予定のマクロメソッドは Mery の本体側の機能でシングルスレッドで入出力しますので、いくら連打してもそういった問題は発生しないはずです。

    逆に、ファイルの読み書きに時間がかかる場合はフリーズしたみたいになりますが、マクロをいくら連打しても、かならず1回ごとのマクロの終了を待ってから次のが発動しますので安心です。

    > いつも真面目に真摯に対応するKuroさんの性格が現れていると思います
    心配性なだけです ^^;

    > ここは1つMery本体とマクロやプラグインを切り離して考えてみてはいかがでしょうか?Mery本体のことじゃないから、知らないもん!です
    はい、利用規約には「いかなる損害も作者に責任なし」って書いてありますので、基本的には無責任です (w

    今まで、みなさんが安心してマクロを使ってこられたのかどうかは分かりませんが、その機能が実装されたがために怖くてマクロを使えないやい!ってなると悲しいですからね。

    MeryWiki のマクロライブラリは多くの有志のみなさんのお力で成り立っていますので、作者に責任がないとしても、慎重になってしまいますね~ ^^;

    > 速度についても、Mery標準機能の根幹部分に関わるアルゴリズムは考慮されて欲しいと思いますが、私も含めて、どこの馬の骨が作るかしれないマクロの動作速度まで気にする必要は全く無いわけで、JavaScriptを採用しているわけですし、積極的に無責任な感じで良いのではないでしょうか
    Mery のマクロ自体は Windows Script Host を利用していますので基本的な速度はマイクロソフト次第という感じですが、MeryWiki にマクロを投稿してくださっているみなさんは馬の骨ではなく、虎の穴って感じの達人さんばかりです ^^

    とりあえず、ほかのエディタでも同じような機能が実装されてるんだなーということが分かったので、次のバージョンでは実装する方向で進めてみようと思います。ベータですから、不評なら廃止する感じで~。

     |  Kuro  |  返信
  26. > Kuro さん
    ありがとうございます。

    > とりあえず、ベータ版ですし、実装してみましょうか。
    とりあえずボツは回避という方向ですね。
    これで見送りになってしまったら、これまでの私の書き込みは「マクロは悪用できます」という "余計な情報を敷衍しただけ" ということになりそうで、内心ハラハラしてました。 :|
    まずは一安心。 :)

     |  sukemaru  |  返信
  27. ファイルへのアクセスは1000倍どころではなくとてつもなく遅い
    だからスクリプト書く場合できる限り(ある程度のRAM消費で済む限り)
    何度も書き込まずRAMメモリ上で全て終わらせて最後に書き込むのだ

    さらにOSとかで遅延書き込みとか休止とか設定によっては入ってたりするから
    書き込んだつもりでも実際にはまだ書き込んでないということもありえるし
    そんなわけで数秒かかることもある

    3Gで動作しているうちの例えば5周期ほどかかる命令と比較すると
    書き込みに1秒かかった場合で6億倍、
    0.01秒かかったとすると600万倍ということになる

     |  クリ廃止  |  返信
  28. > シリル さん
    > ナカーマ (・∀・)人(・∀・)
    トグル系マクロは基本的に無害なものが多いですからね。 新しくマクロを書いている最中とか、煮詰まって古い自作マクロのアイコンをムキョー!!と喚きながら連打したり。 :D

    > 連打するとエラーになりませんか?
    私のPCが10年前時点でもローエンドだった1コア2スレッドのXPで内部処理速度や I/O 速度自体が遅いから、かえって大丈夫だったりするのかしら?
    うちの場合、前レスにあげたようなトグル操作その他の軽いマクロではエラー/プチフリなどはありません。また、重いマクロで処理が追いつかずに一時的に固まることはあっても、マクロのコードや処理自体に不正がないかぎりエラーになることはあまりないです。
    (webアクセス系は SSL/TSL がらみで使えないとか、「開けゴマ」マクロで実在しないパスの実行で JS 側のエラーになるとかはあります。あとマクロの登録数が多いので「マクロのカスタマイズ」で OK を押したあとに2分ぐらい固まる…)

    ActiveXObject は別スレッドで走るということでトラブルを引き起こしているということも考えられますが、肥大化・フラグメントした INI への書き出しならいざしらず、最小限の内容だけを書き換える JSON ファイルが相手のことですから違う気がします(数字1バイトの書き換えなのでファイルへアクセス・専有時間はわずかなはず)。

    IO.js が対象でエラーが出ているようですので、セキュリティソフトによるチェックが足を引っぱっていたりするのかもしれませんね。"スクリプトシールド" や "ファイルシステムシールド"、"挙動監視シールド" (← Avast6) のような個別設定部分で除外可能なら Mery\Macros\include\*.js や Mery\Macros\MacroSettings\*.json を除外登録してみてはいかがでしょうか? セキュリティソフトのチェックにより中途半端なところでスクリプトの処理がとまってしまうのかも。

    > includeライブラリは私には難しくて
    『デフォルトの構文定義の拡充について』のトピックに include ライブラリのオブジェクト/プロパティ/関数名のための Mery Macro JS 用拡張語群をうpしておきましたので、よろしければご利用ください。
    https://www.haijin-boys.com/discussions/3655#discussion-4130
    私自身はこの構文ファイル拡張のおかげでぼんやりと理解できるようになったかんじです。 :)

    この強調構文を追加適用して IO.js ファイルを開いてみると…

    e.g.1
    IsExist 関数の場合であれば。IO.js ファイル内の

    IsExist: function(p) { ... 

    のブロックがこの関数の定義部分ですので、引数に p (パス)が必要であることがわかり
    インデントをさかのぼって上位プロパティ名 Path に属するということ、さらに上の IO オブジェクト配下にあることがわかります。
    よって自作マクロで利用するときは IO.Path.IsExist( p ) と記述すればよいわけです。

    e.g.2
    Serialize 関数であれば

    Serialize: function(obj, name) { ... 

    のブロックにより二つの引数をとることがわかります。
    引数 name については

    var _GetSerializePath = function(name) { ... 

    のブロックにより、第2引数で直接指定された名前か JS ファイルのベース名であるということになり(→省略された場合は JS のベース名が JSON のファイル名として使われる)
    第1引数 obj は Serialize() で JSON に書き出したいオブジェクト名(または変数名)であるということになります(こちらについては予備知識が必要かも)。

    include ライブラリを使った自作マクロの固有設定の読み書きについては、前のレスに書いたように「折り返しトグル」の Bleat 版と sukemaru 版が雛形になるとおもいます。Bleat さんのは IO.js 内のサンプル構文に則った書き方、sukemaru のは自作マクロ用としてなじみやすい?初歩的な書き方となっています。
    設定用の変数オブジェクト var setting={}; を用意し、設定項目を setting.hoge = "hoge"; setting.fuga = true; setting.piyo = 0; のようにプロパティとして定義/代入してやれば、IO.Serialize( setting ); で JSON ファイルに設定項目を保存できます。
    設定項目は setting={ hoge: "hoge", fuga: true, piyo: 0 }; という書き方でも可。
    設定項目の読み込みは setting = IO.Deserialize( setting ); です。

     |  sukemaru  |  返信
  29. > IO.js が対象でエラーが出ているようですので、セキュリティソフトによるチェックが足を引っぱっていたりするのかもしれませんね。

    ウイルス呼ばわりされてしまってはIO.js くんが可哀想です
    一応、ウィルスバスターのリアルタイムスキャンを切った状態でも同じエラーが出ることを確認しました

    > 私のPCが10年前時点でもローエンドだった1コア2スレッドのXPで内部処理速度や I/O 速度自体が遅いから、かえって大丈夫だったりするのかしら?

    安物のキーボードで、利き手ではない左手でポンポンポンっと打っても出ちゃうんですよね。逆に右手で本気出してダダダダダッ!とすると出るまでに10回以上かかったりして「あれ、どうしたエラー、がんばれ」と思うようにもなってしまいました

    > ActiveXObject は別スレッドで走るということでトラブルを引き起こしているということも考えられますが、肥大化・フラグメントした INI への書き出しならいざしらず、最小限の内容だけを書き換える JSON ファイルが相手のことですから違う気がします(数字1バイトの書き換えなのでファイルへアクセス・専有時間はわずかなはず)。

    私は物の例えで1000という数字をテキトーに出しましたが、クリ廃止さんのご指摘どおりファイルアクセスはとてつもなく遅くなります。INIだろうがJSONだろうが肥大化してようが数字1バイトだろうが関係なく重いものだと思っています。

    ただ、今回の場合は、OSの都合が絡んだ遅延だろうなと思うようになりました。XPでは起こらないということですし、私の連打速度のさじ加減でも「遅くしたら出ないだろう」「早くしたらすぐ出ちゃうだろう」という予想が外れてムラがあるからです

    > (webアクセス系は SSL/TSL がらみで使えないとか、「開けゴマ」マクロで実在しないパスの実行で JS 側のエラーになるとかはあります。あとマクロの登録数が多いので「マクロのカスタマイズ」で OK を押したあとに2分ぐらい固まる…)

    2分固まるという話は以前も聞きましたけど、すみません、楽しくなっちゃうw
    そんなに固まったら使いものにならないでしょ!逆に見たい!固まってるところを!

    > > includeライブラリは私には難しくて
    > Mery Macro JS 用拡張語群をうpしておきましたので、

    ほんとにありがとうございます
    しかし、正直な所、βとはいえ新たなメソッドへの期待が高まる今、妙なエラーが出る物は使いたくないなーと……解説頂いたのに申し訳ないですが、私のマクロメモにコピペさせていただきましたので大事に取っておきます

     |  シリル  |  返信
  30. セキュリティについて追加提案なのですが、さきに提案したゼロバイトのダミーファイルではなく、ホワイトリスト形式の新規 INI ファイルとしたほうが都合がよさそうな…。

    自作マクロA、マクロBによる mery.ini の書き換えは許可したいけど、ダウンロードしたマクロによる mery.ini の書き換えは禁止したい… というようなケースに個別対応するためには、ダミーファイルの有無だけでマクロによる mery.ini へのアクセス可否を一括決定するよりも、ホワイトリストとして用意されたファイルに「mery.ini への書き込みを許可するマクロ」をひとつひとつ列挙していくほうがよいのではないかなぁと。

    希望的観測ですが、ダウンロードしたマクロでも Wiki のページ内で動作内容や注意事項がきちんと説明されていたり、ソースコード内のコメント文の補記で機序が分かるようになっているものならば、普通のユーザーさんにとっても判断材料になるかとおもいます。
    逆に、判断できないようなマクロを安易に許可してしまうことを防ぐ意味で、Kuro さんにとってもマクロ開発者にとっても利用者にも、このような明示的な方法にある程度は意味があるのではないかと。
    (mery.ini 以外の INI ファイルにテキストを書き込むマクロとなると単純ではないので、マクロにあまり詳しくない方でもソースコードに ActiveXObject という単語があれば警戒するような気もしますし、ADODB.Stream とかいう聞き慣れない単語があれば簡単に許可してよいかどうか判断に迷ってほしいものです ← INI ファイルの先頭にコメント文を入れておいて注意喚起するとか)

    かさねがさね思いつくまま勝手な提案で申し訳ありませんが、もしも先のダミーファイルによるセーフティを採用する方針でしたら、ご検討お願いします。

     |  sukemaru  |  返信
  31. > ウイルス呼ばわりされてしまってはIO.js くんが可哀想です
    > 一応、ウィルスバスターのリアルタイムスキャンを切った状態でも同じエラーが出ることを確認しました
    私も「折り返しトグル切り替えD.js」を導入して、連打の実験をしてみましたが、問題なく動作しているようです。

    設定の保存先を、SSD、HDD、USB メモリ、ネットワーク上の共有フォルダに変更してマクロを連打してみましたが、IO.js で問題なく書き込めています。

    USB メモリの場合はファイルの読み書きが遅いですが、マクロ 1 回ごとの動作速度が遅くなるだけで、何度連打してもエラーはでませんでした。

    試した環境は
    Windows 10 (1809) 64bit, Core 2 Duo E8500
    Windows 7 64bit, Pentium G6950
    で、いずれもエラーは再現できませんでした。

    > ただ、今回の場合は、OSの都合が絡んだ遅延だろうなと思うようになりました。XPでは起こらないということですし、私の連打速度のさじ加減でも「遅くしたら出ないだろう」「早くしたらすぐ出ちゃうだろう」という予想が外れてムラがあるからです
    ウイルス対策ソフト以外ですと、例えばファイルの変更を監視するソフトのような常駐アプリケーションとの競合していたり、なども考えられますね。

    > しかし、正直な所、βとはいえ新たなメソッドへの期待が高まる今、妙なエラーが出る物は使いたくない
    新たなメソッドはファイル入出力が関係していますので、もしかすると同じ環境で実行した場合、同様のエラーが発生することも考えられますので、IO.js のエラーの原因は私も気になりますね…。

     |  Kuro  |  返信
  32. クリ廃止さんのいうように、ハードウェア構成とファイルシステムの相性で I/O の待機・遅延・割り込みなどが絡みあっているのかもしれませんね。

    「マクロのカスタマイズ」はなるべく触らないようにしていて、基本的に新規の自作マクロやダウンロードしたマクロは登録済みの "TEST.js" に貼りつけて試験運用しています。正式採用するマクロができたときは、登録してマクロバーの配置換えをして大人しく2分待ちます。 :)
    アイコンを製作するときは何度も Mery を再起動するのですが、マクロの数そのもののせいかカスタムアイコンのせいか分からないけれど、立ち上がりに20秒近くかかったりも。 :|

    旧世代ローエンドPC使いとしては、新規メソッドでの INI への読み書きと Mery.Info.js や IO.js での INI や JSON へのアクセスとで実効速度に差が出るかどうなるかが気になるところ。
    Read/WriteSetting メソッドが実装されたら、まずは「折り返しトグル切り替えD」マクロをベースに「INI バージョン」を作ろうとおもいます(検索ジャンプは触りたくない)。
    …本トピックの表題案件「色の反転」マクロにつきましては、どなたか他のマクロ職人の方がお作りになりますよね。 :)

     |  sukemaru  |  返信
  33. ご提案いただきありがとうございます。

    > かさねがさね思いつくまま勝手な提案で申し訳ありませんが、もしも先のダミーファイルによるセーフティを採用する方針でしたら、ご検討お願いします。
    ダミーファイルによる対策は JavaScript で生成すれば何とでもなるので、採用は考えていませんでした。

    > 自作マクロA、マクロBによる mery.ini の書き換えは許可したいけど、ダウンロードしたマクロによる mery.ini の書き換えは禁止したい… というようなケースに個別対応
    確かに、ホワイトリスト方式だと完全に自己責任ということになりますね。JavaScript からホワイトリストの内容を書き換えられてしまうとアレですが… ^^;

    > (mery.ini 以外の INI ファイルにテキストを書き込むマクロとなると単純ではないので、マクロにあまり詳しくない方でもソースコードに ActiveXObject という単語があれば警戒するような気もしますし、ADODB.Stream とかいう聞き慣れない単語があれば簡単に許可してよいかどうか判断に迷ってほしいものです ← INI ファイルの先頭にコメント文を入れておいて注意喚起するとか)

    ひえ…。そこまで考慮すると難しいですね。うーん…、これ以上は私の手に負えないような気がしてきました。複雑な仕様と、みなさんの安全を考えると、やはり本案件は没のほうが良さそうですね。

     |  Kuro  |  返信
  34. 主旨のわかりづらい発言をしてしまい、済みませんでした。

    もし INI 形式でホワイトリストをつくれるのでしたら、ホワイトリストファイル冒頭に行コメントとして
    「# mery.ini の書き換えを許可するマクロをこのホワイトリストに登録するさいは、ユーザーご自身の判断と責任のうえでお願いします」
    のような注意書きをあらかじめ記述済みでパッケージできるのではないかなぁ、と。
    あと、ダウンロードしたマクロを使う方には自分で安全管理の意識をもってほしいですね、ということです。

    開発にあたっての難易についてわからず勝手な提案をさせていただきましたが、余計なところは Kuro さんのご判断でスパっと切り捨てちゃってください。 :)

     |  sukemaru  |  返信
  35. みなさん、ご意見ありがとうございます。

    マクロから各種オプション項目へアクセスする手段で、実装が容易なものということで軽い気持ちで提案してみた機能でしたが、ちょっと考えが甘かったですね、すみません。

    みなさんからご意見をいただきまして、マクロから勝手に INI をいじられる不安、ファイルの入出力の負荷に関する懸念事項、セキュリティ上の問題と、その対策の難しさなど、様々な課題があることが分かりました。

    それらを考慮したうえできちんとした機能としてご提供できれば良いのですが、現在の私の技術力ではそこまでのものが作れそうにありませんので、色々ご意見をいただいておきながら申し訳ございませんが、この機能の実装は中止とさせていただきます。

    Mery は野良アプリということもあって、セキュリティ的な問題にはどうしても後ろ向きになってしまいますね。

    これに懲りず、また、忌憚のないご意見をいただければ幸いです。

     |  Kuro  |  返信
  36. このトピックでの懸案はいったん凍結ということになっていますが、マクロライブラリに「Mery.ini のオプション値を取得する」マクロを投稿しました。「検索ジャンプ」マクロの人柱版で使った「行の表示方法」を取得するコードに汎用性を加えたものになっています。
    https://www.haijin-boys.com/wiki/Mery.iniのオプション値を取得

    > ファイルの入出力の負荷に関する懸念事項
    により Write/ReadSettings() メソッドの追加が見送られましたので、標準メニューバー、ツールバーアイコン、右クリックメニュー、ショートカットキー、マクロ等でエディタの設定状態を変更しているばあい INI の内容が最新の状態とはならないから、特別なにができるというわけでもないのが悲しいところ。 :(
    いまのところ Mery.ini の「隠し機能」の設定状態を参照しやすくなるという程度しか能がなく、Kuro さんにとっては傍迷惑なマクロかもしれません。 :|

    Write/ReadSettings() メソッドにかわるものとして、新規「イベント」として「エディタの "表示" 設定に変更があった時」を追加することをご検討いただけないでしょうか?

    ① IO.js をインクルードした「イベントマクロ」で表示設定の変更を監視して JSON ファイルに設定状態を書き出しておき、
    ② べつのマクロ(これもイベントマクロ?)からこの JSON を参照して、エディタの表示設定を任意に変更する
    というコンボで、「書き換え禁止」や「編集モード」などに連動させて「色の反転」などの表示設定の変更ができるとおもうのです(変更できるのは ExecuteCommandByID や WshShell.SendKeys などで操作できる範囲で、とはなりますが)。

    「折り返しトグル」のような連打系マクロ(笑)をパチパチ叩いたときの「イベント」の連続発生で IO がらみのエラーが起きることは予想されますが、「イベントマクロ」、「includeライブラリ」、 ExecuteCommandByID() や WshShell.SendKeys() など自己責任要素満載の多重コンボですので、運用責任についての一切合財はユーザー負担としていただければとおもいます。 :)
    ベータ版 2.6.15 での Zen モード搭載(好評!)によりエディタの表示状態の細かいカスタマイズについての要望も増えそうな雰囲気もありますので、よろしくご検討のほどお願いします。

    p.s. 連打ネタ(笑)の追加になりますが、「文書の先頭か末尾」にキャレットを移動するトグル系マクロも投稿しました。2in1モード or 4in1モード を選択できますので、無駄にパチパチ叩いて遊べます。 :D

     |  sukemaru  |  返信
  37. マクロのご投稿ありがとうございます。
    試してみましたところ、これは面白いマクロですね。私が想定していた ReadSettingString メソッドと同等の機能な感じです。

    > Kuro さんにとっては傍迷惑なマクロかもしれません。 :|

    取得するだけでしたら、まったく問題ございません。

    > Write/ReadSettings() メソッドにかわるものとして、新規「イベント」として「エディタの "表示" 設定に変更があった時」を追加することをご検討いただけないでしょうか?

    確かに、Write/ReadSettings が凍結となったため、別の方法を、というお気持ちは分かります。

    でも、私がこのフォーラムで Write/ReadSettings メソッドを提案した理由は、オプション項目が変動するたびにマクロ機能のメンテナンスをするのが大変なので、みなさんで INI 経由で自由にやっていただければ…というわけだったので…

    「"表示" 設定に変更があった時」のようにオプション項目の増減にともなってイベント発動の有無を管理していくのは、面倒くさがり屋の私には、ちょっとツラそうです。

    > ファイルの入出力の負荷に関する懸念事項

    これは、IO.js で外部ファイルにアクセスしてしまうとダメじゃないでしょうか…マクロからファイルの読み書きをされるのが精神衛生上よろしくないというご意見がありまして、マクロメソッドの実装を中止したわけですし… ^^;

    > ベータ版 2.6.15 での Zen モード搭載(好評!)によりエディタの表示状態の細かいカスタマイズについての要望も増えそうな雰囲気もありますので、よろしくご検討のほどお願いします。

    そうなんですよね、記号を表示したい人や表示させたくない人やで、私もちょっと困っていますので、もうマクロでできるなら自由にやってちょーだいよ。と丸投げしたいところではあります (w

    細かいカスタマイズ (隠しオプション) は Microsoft ストアの有料版を作ったときとか、寄付特典とか、電子書籍「Mery 裏技ブック」を買ってくれた人向けの特典として仕込んでいますので、今回、フォーラムで提案させていただいた Write/ReadSettings は、それらをマクロから簡単に設定できちゃう仕組みでしたから、サービスしたつもりだったのですが…

    あ、いらないんならイイヤーと、私の諦めが早かったのはそのせいです (w

    もちろんセキュリティ的に~とか言われちゃうと野良アプリな Mery では太刀打ちできないという悲しさもあります。

    そういうわけで、「"表示" 設定に変更があった時」ではありませんが、Mery の内部仕様として「編集モードが変更された時」のイベントはオプションが変更された時など、割と頻繁に発動します。("表示" メニューなどの細かい変更には追従しませんが…)

    仕組み上、オプション項目とマクロを結びつけるのは非常に開発工数のかかりそうな案件なので、ご容赦いただけると幸いです。

    みなさん Write/ReadSettings 案で妥協してくださいよー。と心の声を漏らしつつ…。

     |  Kuro  |  返信
  38. > ReadSettingString メソッドと同等の機能な感じです
    細かく検証はしていませんが、オプション値が数値なら Number で返るようになってる …はず。
    「行の表示方法」だけでもあのコードが有効活用できるのが救いです。まあ、それがきっかけでしたし。

    > 「"表示" 設定に変更があった時」の新規「イベント」
    につきましては、私としてもあくまでも次善的な提案でして、仮に実装していただけたとしても、実際にイベントマクロで監視して JSON に書き出すとなると IO.js の読込みコストなどとあわせた I/O の負荷がどうなるのか私には予想できません。 先の シリル さんの連打の例のように『エラー頻発』なんてこともありそうですよね。
    …今後を見込むなら、イベントとして「Zen モードに切り替えたとき」を取得できたり、ExecuteCommandByID() などで「Zen モードに切り替え」できるように、という需要はありそうな気もします。

    > もうマクロでできるなら自由にやってちょーだいよ。と丸投げしたいところではあります
    私自身、今までのところでは折り返し方法以外の [表示] 設定をチョコチョコと変えることはないのですが、先の「折り返しトグル」マクロの仕組みが上出来だったので調子にのって色々とやってみたくなっています (← Zen モードの影響も大)。
    自分用のマクロとして使うだけなら「ファイルを開いた時」(既存のマクロで "編集モードの変更" に使ってます)や「タブを移動した時」「フォーカスを受けた/失った時」のイベントを監視するだけでよさそうにおもうのですが、公開用にすると『もの足りない』ということになりそうな気がして。 :|

    > 細かいカスタマイズ (隠しオプション) は … 特典として仕込んでいますので
    そのさいは、是非 MeryConfig.exe もつけてください。 :)

    > Write/ReadSettings 案で妥協してくださいよー。と心の声
    Write/ReadSettings は "妥協" じゃなくて "BEST” だとおもうのです、本当に。 ← マクロの連打(笑)さえしなければ :D
    私としましては凍結するのは WriteSettingStr/Interger メソッドだけとし、 Write/ReadSettings メソッド(あわよくば ReadSettingStr/Int も)についてはベータ版に(仮)導入していただき、テストしてみたいです。

    自分の環境でうまくないイベントやマクロはさ駆除すればいいだけじゃん、と言ってみる

     |  sukemaru  |  返信
  39. > > ReadSettingString メソッドと同等の機能な感じです
    > 細かく検証はしていませんが、オプション値が数値なら Number で返るようになってる …はず。
    すみません、ReadSettingString と表記したのは型まで意識した深い意味はなく、設定を読み込める機能という例えでした。

    > 実際にイベントマクロで監視して JSON に書き出すとなると IO.js の読込みコストなどとあわせた I/O の負荷がどうなるのか私には予想できません。 先の シリル さんの連打の例のように『エラー頻発』なんてこともありそうですよね。
    同感です。そもそもファイルの入出力自体が問題となっていたわけですから、IO.js や WriteSettings などはユーザさんからするとあまり使ってほしくない機能なんでしょうね。

    > …今後を見込むなら、イベントとして「Zen モードに切り替えたとき」を取得できたり、ExecuteCommandByID() などで「Zen モードに切り替え」できるように、という需要はありそうな気もします。
    そこまで詳細なイベントを用意し始めると、この先、ご要望がどんどん増えていきそうなのでご容赦ください。

    一応、Ver 2.6.15 で ExecuteCommandByID の ID は割り当てています。SDK のソースはまだ更新できていませんが、そのうち更新しておきます。

    MEID_VIEW_ZEN_MODE = 2246;
    MEID_VIEW_TYPEWRITER_SCROLL = 2247;

    > 先の「折り返しトグル」マクロの仕組みが上出来だったので調子にのって色々とやってみたくなっています (← Zen モードの影響も大)。
    設定読み書き (ReadSettings, WriteSettings) がマクロからできるようになると、例えば「名前を付けて現在の設定を保存」みたいなマクロで複数の環境を作っておいて、マクロからポップアップメニューで環境を選べるみたいな仕組みも作れそうな気がしますねー。

    > そのさいは、是非 MeryConfig.exe もつけてください。 :)
    MeryConfig.exe ではないですが、オプション画面が拡張される感じの機能制限解除の仕組みを考えています。

    > Write/ReadSettings は "妥協" じゃなくて "BEST” だとおもうのです、本当に。 ← マクロの連打(笑)さえしなければ :D
    うーん、こればっかりは、セキュリティ的な問題が絡むので、反対な人のご意見を尊重して間違いはないと思います。

    > 私としましては凍結するのは WriteSettingStr/Interger メソッドだけとし、 Write/ReadSettings メソッド(あわよくば ReadSettingStr/Int も)についてはベータ版に(仮)導入していただき、テストしてみたいです。
    > 自分の環境でうまくないイベントやマクロはさ駆除すればいいだけじゃん、と言ってみる
    ちょっと、みなさんを説得してきてくださいよー (w

     |  Kuro  |  返信
  40. > ReadSettingString と表記したのは型まで意識した深い意味はなく、設定を読み込める機能という例えでした。
    実はあの「値」を取得する部分の正規表現がうまくなくて行末の改行コードも拾っちゃったりしていて、あまり自身がないのです → replace( /[\r\n]*/g , "" ) でごまかしています。Number 型への変換もあれでいいのかどうか。 :|

    > そもそもファイルの入出力自体が問題となっていたわけですから、IO.js や WriteSettings などはユーザさんからするとあまり使ってほしくない機能なんでしょうね。
    IO.js での JSON ファイル読み書きについては「検索ジャンプ」マクロで味をしめてしまいましたが、同マクロでもあえて「人柱版(非 include 版)」も残してます。
    IO.js の include はマクロでできることの幅がひろがる素晴らしい仕組みだとおもいますので、IO.js を使ったマクロを利用するかどうかはユーザーさんでご判断くださいみたいな。

    > 「名前を付けて現在の設定を保存」みたいなマクロで複数の環境を作っておいて、マクロからポップアップメニューで環境を選べるみたいな仕組みも作れそうな気がしますねー。
    > こればっかりは、セキュリティ的な問題が絡むので、反対な人のご意見を尊重して間違いはないと思います。
    > ちょっと、みなさんを説得してきてくださいよー (w
    ほんと夢ばかりが膨らむ一方ですよねー。 妄想するだけというのも楽しいものですが、アンドゥのトピックみたいにもっとたくさんの方のご意見が集まるといいですね。
    あと、「さ駆除」じゃなくて「削除」でした。 :(

    > ExecuteCommandByID
    すいません、すでに対応済みでしたか。 ID 2243~2245 もちゃんと動きました、はい。 :)

    > オプション画面が拡張される感じの機能制限解除の仕組みを考えています。
    「詳細設定」みたいなボタンで拡張パネルが展開するのかしら? Mery の将来は楽しみがいっぱいですね。 :D

     |  sukemaru  |  返信
  41. 別のトピックでマクロを作成しないユーザーの意見もと言うことなので。

    たぶんご期待の意見にはならないと思いますが、ライトユーザー?カジュアルユーザー?の私としては、オプション項目の設定値の取得はあっても良いかもしれませんが、基本「いらね」ですね。
    ヘビーユーザー?コアユーザー?の方はまた別の意見をお持ちだと思いますが。

    私がマクロで使っているのは、ファイルプロパティの表示を除くと、メニュー項目にあったりショートカットキーとしては設定できるが、ツールバーに直接設定できないというような基本的なものばかりです。
    (選択文字列の前・次を検索、検索文字列の強調を解除、先頭・末尾へ移動、最後に編集した位置へ移動など)

    それで、オプションにない設定で Mery.ini を編集すればできることは、わざわざマクロを使う必要もありませんし、マクロでのオプション項目へのアクセスについて特に用途が思いつきません。
    ただ、オプションにない設定を試したいときなどに、再起動せずにその設定が反映されるとありがたいとは思います。
    > オプション項目によってはリアルタイムで強制的に反映させると不具合が発生するものもあると思います
    とのことですので、難しいとは思いますが。

    編集モードごとや横書き・縦書きで設定を変えたい人にとっては、マクロで設定が変更できれば便利なのかな?
    この機能を実装するにしても、読み書きできる項目については限定されるみたいですので、その範囲にもよりますが。

    この件についてのやりとりは途中で挫折して全てを読んではいませんので、もしかしたらコメントされているかもしれませんが、マクロからオプション項目にアクセスできるようになるとこういうことができますよという使い途を提示していただけると、マクロからのアクセスはあったら便利だなと思うかもしれません。
    このトピックを立てた方の要望は、その1つだと思いますが。

    セキュリティ(?)面については、悪意を持って設定を変えるコードを紛れさせることが可能なら危険かなと思います。

    余談ですが、マクロからのオプション項目へのアクセスと言うことでは、このトピックの主旨から外れてはいないと思いますが、もっと広い用途を持たせた機能と言うことで、別のトピックとしてやりとりしたほうが、もっと他の人の意見も聞けたのでは?と今更ながら思いました。
    私は、このトピックの件名からは特に興味を持たず、コメントが多かったのでちらっと目を通した感じですので。

     |  774  |  返信
  42. いらねに 1 票、ありがとうございます。

    > 別のトピックでマクロを作成しないユーザーの意見もと言うことなので。
    私もマクロはほとんど作りませんし、使いませんので、ご意見、とても参考になります。

    > > オプション項目によってはリアルタイムで強制的に反映させると不具合が発生するものもあると思います
    > とのことですので、難しいとは思いますが。
    アプリケーションの初期化のタイミングでしか動作しない (Windows の仕様上、ウィンドウ生成時にしか動作しないとか、反映させるにはウィンドウを再生成する必要があるものなど) オプション項目もありますから、このあたりの動作保証と整合性をとるのは難しいですね。

    > マクロからオプション項目にアクセスできるようになるとこういうことができますよという使い途を提示していただけると、マクロからのアクセスはあったら便利だなと思うかもしれません。
    > このトピックを立てた方の要望は、その1つだと思いますが。
    はい、このトピックのご要望に対応するための案だったのですが、なかなか壮大な話になってしまいまして… ^^;

    > セキュリティ(?)面については、悪意を持って設定を変えるコードを紛れさせることが可能なら危険かなと思います。
    おっしゃる通り、設定済みのマクロを書き換えられたり、検索履歴などの情報を抜き出されたりなどの危険な使われ方はされたくないですから、そういった点では、そもそもその機能自体がないほうが安全ですね。

    > 余談ですが、マクロからのオプション項目へのアクセスと言うことでは、このトピックの主旨から外れてはいないと思いますが、もっと広い用途を持たせた機能と言うことで、別のトピックとしてやりとりしたほうが、もっと他の人の意見も聞けたのでは?と今更ながら思いました。
    以前に開発者自らご意見伺いのトピックを立ててみたことがありまして、その時は、予想以上に様々なご意見を多数いただき、アンケートの集計や、仕様決め、ご要望に対応できなかったユーザさんへの申し訳ない気持ちなどで非常に心苦しい思いでしたから、私自身がトピックを立てるのはなるべくしないようにしています。

    みなさんのやり取りを陰でみながら、参考にさせていただきつつ、たまに、こんなんどうよ?と横から出てくるスタイルが気楽で良いんですけどね…。

     |  Kuro  |  返信
  43. >> 774 さん
    こちらのトピックにご意見を書いていただき、ありがとうございました。

    > マクロからオプション項目にアクセスできるようになるとこういうことができますよという使い途を提示していただけると、マクロからのアクセスはあったら便利だなと思うかもしれません。
    おもに、状況に応じてエディタの表示状態を細かくカスタマイズできるようになる、ということでした。
    「編集モード」とおなじようなかんじで、ドキュメントの拡張子やファイル名を条件に、エディタの外観を切り替えることができるとか。
    あるいは、縦書きモードのときに背景画像や折り返しの文字数、行間、フォントの種類やサイズなどをいっぺんに切り替えて、原稿用紙モードにできるかも? とか。
    個人的には、うちの Mery は「タブの桁数 = 8」にしてありますが、「タブ4桁で書かれたファイルを開くと読みづらい。マクロでタブ4桁表示に切り替えよう」みたいな使い方をしたかった。 :D

    オプション画面やツールバーの表示メニューのチェック ON/OFF の任意の組み合わせを、ひとつのマクロで切り替えられるというかんじですね。
    現状のマクロの枠組み内(?)でも ExecuteCommandByID() を使って個別に ON/OFF の切り替えだけはできるのですが「ON にする」「OFF にする」という指定はできないので、現在のエディタの状態を Mery.ini から読み込んでから各項目ごとに ExecuteCommandByID() を適用するか否かを条件分けできるようになるかもしれなかった?
    エディタの外観のカスタマイズなどについてのこまかい要望があっても、マクロを作れる人が「このマクロでできるようになるぞ」と横槍を入れてサポートできるようにもなるという…。 :)

    >> Kuro さん
    > このトピックのご要望に対応するための案だったのですが、なかなか壮大な話になってしまいまして… ^^;
    非常におおざっぱで自由度のたかい枠組みなので、おもしろそうだったんですけどね。 :)
    動作保証ができず、危険や不安を感じさせる機能ということでの見送りには納得いたしました。

    ExecuteCommandByID() についてですが、オプション上のチェック ON/OFF にからむ MEID_VIEW_*** のものに第2引数で ON/OFF を直接指定できるようにするというのは、いかがでしょうか? MEID_FILE_*** などで第2引数が不要(無効)なものでは、第2引数は無視するというかんじで。
    非サポート的機能の ExecuteCommandByID() について仕様変更をお願いするというのもアレですが…。

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