マクロでのUndo回避

  1. 某エディタの更新が止まり、マクロ機能も弱いため、
    最近Meryを使用し始めました。マクロも便利で愛用しております。

    ところで、マクロをつかってデータ加工を行っていますが、
    処理途中で固まってしまいます。

    データ件数を少なくしたり、
    処理ステップを減らすと完走するので、
    おそらくUndoの記録が限界を超えてしまっているのだと推測しています。

    Undoを記録せずマクロを実行する、あるいは記録をクリアするなど、
    問題を回避する方法がありましたら、ご教示いただけますと幸いです。

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

     |  bx  |  返信
  2. > Undoを記録せずマクロを実行する、あるいは記録をクリアするなど、
    > 問題を回避する方法がありましたら、ご教示いただけますと幸いです。

    途中経過を Document.Text に書き込まず、全てマクロ内で処理して最終結果だけを書き込むのが、Undo バッファも積まない一番の手ですね。
    あるいは、Editor.NewFile() で作業用の Document を作成し、それを Close() すればその Document 内の Undo バッファはクリアされます。
    ただ、前者の方が高速だし良いことずくめかと思います。

     |  ks  |  返信
  3. 早速のご返送ありがとうございます。

    > 途中経過を Document.Text に書き込まず、全てマクロ内で処理して
    > 最終結果だけを書き込むのが、Undo バッファも積まない一番の手ですね。

    こちらで対応したいのですが、
    マクロ内で処理するには具体的にどうしたら良いでしょうか。
    初歩的な質問で申し訳ないです。
    知識不足でマクロに落とすことができませんでした。

    例えば、下記のような処理を行っています。
    aaa|11111
    aaa|アア
    bbb|22222
    bbb|イイイイ
    ccc|33333
    ccc|ウウウウウウ

    aaa|11111|アア
    bbb|22222|イイイイ
    ccc|33333|ウウウウウウ

     |  bx  |  返信
  4. 例に挙げられた条件だけであれば、マクロを使わずとも以下の正規表現置換で実現できます。

    検索文字列:
    ([^\|]+)\|([^\n]+)\n\1\|([^\n]+)\n
    置換文字列
    \1\t\2\t\3\n

    マクロで処理するとしたら、こんな感じ

    arrLines=document.text.split("\n"); //こんな感じで、各行を配列に取り込んで
    pre="";
    for(i=0;i<arrLines.length;i++){  //1行ずつ順番に処理
      eachLine=arrLines[i];
      arrWords=eachLine.split("|");  //処理する行も区切り文字で配列に
      if(arrWords[0]==pre && arrWords.length>0){
        arrLines[i-1] += ("|"+arrWords[1]); //連結する処理
        arrLines[i]="" ;  //削除する行はとりあえず空白に
      }else{
        pre=arrWords[0];
      }
    }
    document.text=arrLines.join("\n").replace(/\n\n/g,"\n");//空白行を削除してまとめて書き戻し
    
     |  通りすがり  |  返信
  5. > 置換文字列
    > \1\t\2\t\3\n

    まちがえた
    \1|\2|3\n
    ですね。
    あとマクロは、インデントを脳内補完してください。

     |  通りすがり  |  返信
  6. 通りすがりさんのコードで、例示されたデータは上手くいきますね。
    ちょっと自分でもいじってみました。
    違い:
    ・キー部分が連続していなくてもいい
    ・3列目以降も足す

    var result = {};                                  // 結果格納先準備
    var lines = document.text.split("\n");            // こんな感じで、各行を配列に取り込んで
    for (var i = 0; i < lines.length; i++) {          // 1 行ずつ順番に処理
      var cols = lines[i].split("|");                 // 処理する行も区切り文字で配列に
      var key = cols[0];                              // まとめるためのキーを取り出す
      if (result[key] != null) {                      // すでに同じキーが出現しているなら
        result[key] += lines[i].substring(key.length);// キー以外の2列目以降を追加
      } else {                                        // まだキーがないなら
        result[key] = lines[i];                       // 新しいキーの追加
      }
    }
    var array = [];                                   // キーに紐付いてしまっているので行に直す
    for (var key in result) {
      array.push(result[key]);
    }
    document.text = array.join("\n");                 // 結果を Mery に戻す
    
     |  ks  |  返信
  7. >> bx さん
    Mery をお試しくださりありがとうございます。Mery を開発している者です。
    ちょっと風邪で寝込んでいまして返信が遅くなってしまい申し訳ございません。

    >> ks さん
    ks さん、本当にお久しぶりです。ご無事で、本当に良かったです。マクロ実験室のほうも更新が途絶えていたので、体調崩されたりしてないか心配していました。

    確かこのスレッドで…
    https://www.haijin-boys.com/discussions/2818

    そしてサポートのご協力ありがとうございます!

    >> 通りすがり さん
    サポートのご協力ありがとうございます。
    私はマクロを書くのは得意ではないので助かりました。

    あと、一応、Mery の仕様では Undo の記録は無制限でメモリがいっぱいになっても HDD にスワップするだけなので、処理速度は重くなりますが編集は続行できるような仕組みになっています。でも、データ量によっては非常に遅くなってフリーズしたように見えるのかもしれませんね。

    Undo を記録せずマクロを実行する機能につきましては、今のところ搭載していませんが、すでに仕組みは開発済みで用意できています。

    具体的には、Redraw プロパティを利用して、Redraw 開始から Redraw 終了までは 1 Undo、みたいな仕組みを考えていますが、このような仕様はいかがなものか、マクロに詳しいみなさんのご意見が頂けると参考にさせていただきたいと思いますので、よろしくお願いいたします。

     |  Kuro  |  返信
  8. >> kuroさん
    > Undo を記録せずマクロを実行する機能につきましては、今のところ搭載していませんが、すでに仕組みは開発済みで用意できています。
    >
    > 具体的には、Redraw プロパティを利用して、Redraw 開始から Redraw 終了までは 1 Undo、みたいな仕組みを考えていますが、このような仕様はいかがなものか、

    横から失礼…。マクロに詳しくない私としましては大賛成です。1マクロ=1undo が簡単に実現できるのはとても素敵。
    ちょっと複雑な操作を「マクロの記録」して試しに「実行」してみたら、「元に戻すのにいったい何回Ctrl+Z押さないとイカンのじゃい?」なんていうジレンマが解消されますね。楽しみです。

     |  sukemaru  |  返信
  9. >>ksさん
    >>通りすがりさん
    対応方法をご丁寧に教えてくださりありがとうございます。

    キーマクロで対応することで頭が固まっていたため、
    テキスト処理で対応する発想が抜けていました。

    おかげさまで解決できそうです。
    頭が硬いのは私の悪い癖です…。

    >>kuroさん
    マクロ作成に時間をあまりかけられないときは、
    キーマクロでの対応は簡単でスピーディーなので、
    Undo を記録せずマクロを実行する機能実装楽しみにしております。

     |  bx  |  返信
  10. bx さん

    はじめまして、失礼します。おこがましいとは思うのですが…

    お話の流れの中で、お使いのデータの例をご紹介くださった
    ことで投稿が活発になりました。マクロもまた一部を紹介して
    下さると、状況の再現ができ、何にお困りなのか「具体的に」
    ほかの人が理解するのに、きっと役に立つと思います。

    Mery エディタの使い方は、とてもいろいろです。
    自分の目の前にある風景が、相手に伝わるように、思い込みに
    気をつけて、うまく工夫をしていきたいと、自分では心がけて
    いるのですが、いつまでたってもうまくできません。

    マクロにもさまざまな方法があるので、皆さんのコードに加え、
    さらにご参考までに、マクロで JavaScript 正規表現の置換を
    使った例を作りました。データはいい加減な推測です。

    データを範囲選択して使います。

    ・完了("Done")をステータスバーに表示
    ・選択範囲が論理行単位の選択でなければ行選択に拡張
    ・キー前後の空白文字を除去
    ・キー途中の空白を許容
    ・同一キーは3件まで順に結合

    {
      var s = document.selection;
      var tx = s.GetTopPointX(mePosLogical);
      var ty = s.GetTopPointY(mePosLogical);
      var bx = s.GetBottomPointX(mePosLogical);
      var by = s.GetBottomPointY(mePosLogical);
      var aStr;
    
      Status = "";
      if (!s.IsEmpty) {
        s.SetAnchorPoint(mePosLogical, 1, ty);
        s.SetActivePoint(mePosLogical, 1, (bx > 1 ? by + 1 : by), true);
        aStr = s.Text;
        s.Text = aStr.replace(/^\s*([^|]*?)\s*(\|[^|]*?)(?:(?:\n\s*\1\s*(\|[^|]*?))(?:\n\s*\1\s*(\|[^|]*?))?)?$/gm, "$1$2$3$4");"Done";
      }
    }
    

    ※不規則なデータを含めてテスト※
    ---------------------------------------
    aaa |11111
    aaa |アア
    bbb|22222
    bbb |イイイイ
     ccc |33333
    ccc  |ウウウウウウ
    dd d |11111
    dd d |アア
    eee|22222
    eee|イイイイ
    fff|33333
    fff|ウウウウウウ

    ggg|11111

    ggg|アア
    hhh|22222
    hhh|イイイイ
    iii|33333

    iii|ウウウウウウ

    jjj|11111
    jjj|
    kkk|
    kkk|イイイイ
    lll|
    lll|

    mmm|11111
    nnn|22222
    ooo|33333

    ppp|11111
    ppp|アア
    ppp|AA
    qqq|22222
    qqq|イイイイ
    qqq|BBBB
    rrr|33333
    rrr|ウウウウウウ
    rrr|CCCCCC

    ---------------------------------------

    ※結果※
    ---------------------------------------
    aaa|11111|アア
    bbb|22222|イイイイ
    ccc|33333|ウウウウウウ
    dd d|11111|アア
    eee|22222|イイイイ
    fff|33333|ウウウウウウ
    ggg|11111|アア
    hhh|22222|イイイイ
    iii|33333|ウウウウウウ
    jjj|11111|
    kkk||イイイイ
    lll||
    mmm|11111
    nnn|22222
    ooo|33333
    ppp|11111|アア|AA
    qqq|22222|イイイイ|BBBB
    rrr|33333|ウウウウウウ|CCCCCC

    ---------------------------------------

     |  inuuik  |  返信
  11. 表題の、「マクロでのUndo回避」についてですが、先日回答しました内容に一部説明不足がございましたので補足させてください。

    > 具体的には、Redraw プロパティを利用して、Redraw 開始から Redraw 終了までは 1 Undo、みたいな仕組みを考えています

    ↑ これですが、確かに文字通りの仕様を実装する予定ではあるのですが、これは Undo の記録自体を抑制するわけではなく、1 度の Undo をグループ化することで Undo ポイントを設定できる仕組みなので、Undo の記録自体は行われますから、Undo バッファが増えるという状況の改善にはなりませんでした。

    sukemaru さんの「元に戻すのにいったい何回Ctrl+Z押さないとイカンのじゃい?」の改善にはなると思います。

    window.Redraw = false; // Undo ポイント開始
    document.selection.Text = "a";
    document.selection.Text = "b";
    document.selection.Text = "c";
    window.Redraw = true; // Undo ポイント終了
    
    window.Redraw = false; // Undo ポイント開始
    document.selection.Text = "d";
    document.selection.Text = "e";
    document.selection.Text = "f";
    window.Redraw = true; // Undo ポイント終了
    

    ↑こんな感じでグループ化しておくと、1 度めの Undo で def が削除され、2 度めの Undo で abc が削除されるようになるっていう仕様を予定しています。

     |  Kuro  |  返信
  12. Redraw プロパティによる Undo グループ化

    これ、いろいろ使えそうです。Undo の programming ができるようになりますね。

    Undo バッファの消費削減はないとしても、このグループ化で、画面操作と Undo を
    同じタイミングで積極的に操作できる。

    作成中は Redraw = false のままにしておいて動作確認、でき上がったら true に
    すればいいので使い勝手もよさそう。

    グループにまとめたい単位 = 表示更新をしたいタイミング = Undo で戻りたい区切り、
    これらを意識して遷移を考える…、面白い新機能ですね、楽しい。

     |  inuuik  |  返信
  13. > 作成中は Redraw = false のままにしておいて動作確認、でき上がったら true に
    > すればいいので使い勝手もよさそう。

    逆でした…、ごめんなさい _o_

    作成中は Redraw = true のままにしておいて動作確認、でき上がったら false に
    すればいいので使い勝手もよさそう。

     |  inuuik  |  返信
  14. > 逆でした…、ごめんなさい _o_
    Undo のグループ化のために Redraw プロパティっていう画面の描画を抑制するための仕組みを流用、という点がちょっと分かりづらいかもしれませんね。

    例えば Delphi 独特の書き方ですが、BeginUpdate ~ EndUpdate みたいな専用のメソッドを用意するっていうのも考えたのです。

    でも、投稿されているマクロを見てみると結構 Redraw プロパティって使われているみたいだったので、Redraw プロパティを流用すれば、画面の描画を抑制できるうえに Undo のグループ化もできて、既存のマクロに手を加えることなく 1 発で Undo ができるようになって一石三鳥かな?と思って、こんな仕様を考えてしまいました。

    > 作成中は Redraw = true のままにしておいて動作確認、でき上がったら false に
    > すればいいので使い勝手もよさそう。

    そうなんですよね、この仕様、利便性は良さそうですが、実は、こまめに Undo ポイントを作りたいようなシーンが出てくると、Redraw = true を使用することで再描画が 1 発、発動しちゃいますから、マクロの実行速度に若干影響があるという点が気がかりではあります。

    個別にメソッドを用意したほうがいいよ!っていうご意見もあれば聞いてみたいです。

    ---- ここから脱線します ----
    あと、スレッドの本題から脱線してしまいますが、フォーラムに貼り付けたソースコードが見やすくなるように pre タグを使用できるようにしてみました。

    HTML の記述方法と同じで、半角で <pre> (←これは全角で書いてますが半角でね) で囲んでやると、インデントが反映されてソースコードの言語を自動判別して色分けして投稿できるようになっています。

    <pre> や <PRE> のように大文字・小文字どちらでも大丈夫ですが、<pre style="height: 480px;"> みたいな属性は使えません。単純に <pre> ~ </pre> のみ認識されますのでご注意ください。あと、高さは 640px を超えると縦スクロールバーになります。

    ↓テストですが、pre タグを使うとこんな感じで貼りつきます。

    if (document.selection.Text == "")
    	document.selection.SelectAll();
    var s1 = document.selection.Text.split("\n");
    var s2	= new Array();
    for (var i = 0; i < s1.length; i++) {
    	if (i == 0 || s1[i-1] != s1[i])
    		s2.push(s1[i]);
    }
    document.selection.Text = s2.join("\n");
    

    また、投稿内容の記入欄で [TAB] キーも効くようにしてみましたので、ソースコードを貼り付けるときにお役立てくださいませ。

    とりあえず、このスレッドは実験ということで、勝手ながらみなさんの貼ってくれたソースの前後に pre タグを仕込んでみましたが、「やめて!」っていうかたがいらっしゃいましたらご一報ください…。

     |  Kuro  |  返信
  15. >> Kuro さん
    > 個別にメソッドを用意したほうがいいよ!っていうご意見もあれば聞いてみたいです。

    現状の仕様って明示的に Redraw=true を指定してないと false なんですよね?
    undo ポイントを挟みこんだばあいには、マクロ実行中に画面がちらついたりすることになっちゃうよというのは… 美しくないかも :(

    Redraw とは別のメソッド?/プロパティ?がよろしいかとおもいますが、
    ここはあえて Kuro さんの美学的ご判断におまかせします、と言うべきところかしら? :D

     |  sukemaru  |  返信
  16. ご意見ありがとうございます。

    > 現状の仕様って明示的に Redraw=true を指定してないと false なんですよね?

    いいえ、何も指定しない場合は Redraw = true です。つまりデフォルトの状態では、マクロ実行中でも呼び出すメソッドによっては再描画が発生します。

    明示的に再描画を抑制するための仕組みが Redraw = false (再描画を無効) です。

    > undo ポイントを挟みこんだばあいには、マクロ実行中に画面がちらついたりすることになっちゃうよというのは… 美しくないかも :(

    そうなんですよね。Redraw = true を実行すれば、そこで再描画が行われますので、ネガティブに考えちゃうと画面のチラツキというふうにとらえられますね ^^;

    ポジティブに考えると、Undo ポイントなので、その時点を画面に反映させてます。っていうとらえ方もできるかなーとも思います。

    使われ方として 1 マクロで 1 Undo にしたいという需要が多いのではないかと予想しているのと、過去のマクロも Redraw を使ってくれているものは自動的に 1 Undo にできちゃうところでメリットを感じています。

    ただ、私はあまりマクロを書いたことがないので、マクロを駆使される方ですと、Undo ポイントを刻むようなマクロを考えたりするのでしょうか。

    > Redraw とは別のメソッド?/プロパティ?がよろしいかとおもいますが、
    > ここはあえて Kuro さんの美学的ご判断におまかせします、と言うべきところかしら? :D

    あはは…。
    私はマクロを全然使わないので、実装が楽なほうに流れちゃいますねー。新しくメソッドを作るのは面倒くさいのと、マクロリファレンス書かないといけないのを考えるだけでゾッとします (w

     |  Kuro  |  返信
  17. > Undo のグループ化のために Redraw プロパティっていう画面の描画を抑制するための仕組みを流用、という点がちょっと分かりづらいかもしれませんね。

    重ね重ね申し訳ないです。この仕組みは分かりづらくありません。
    間違えたのは、私がそそっかしくて、見直しもサボったから…だけです。_o_

    > でも、投稿されているマクロを見てみると結構 Redraw プロパティって使われているみたいだったので、Redraw プロパティを流用すれば、画面の描画を抑制できるうえに Undo のグループ化もできて、既存のマクロに手を加えることなく 1 発で Undo ができるようになって一石三鳥かな?と思って、こんな仕様を考えてしまいました。

    大賛成です!

    まず共用で実装して、実際の使用感を確かめ、
    どうしても不都合が解消できなければ、別の仕組みを追加する。
    …でお願いします。

    逆の流れでは、これができませんので。

     |  inuuik  |  返信
  18. > 何も指定しない場合は Redraw = true です。つまりデフォルトの状態では、マクロ実行中でも呼び出すメソッドによっては再描画が発生します。
    > 明示的に再描画を抑制するための仕組みが Redraw = false (再描画を無効) です。
    (拙作のマクロですら)ふだん使っていて画面のちらつきを感じることがなかったから、暗黙的に Redraw = false になっているんだとおもってました。 :)

    > 使われ方として 1 マクロで 1 Undo にしたいという需要が多いのではないかと予想しているのと、過去のマクロも Redraw を使ってくれているものは自動的に 1 Undo にできちゃうところでメリットを感じています。
    いずれのかたちにせよ新仕様が楽しみです。(むしろ、明示的に Redraw を書いていないものは「暗黙的に 1-undo」とかでもよいのでは?) XD

     |  sukemaru  |  返信
  19. > (拙作のマクロですら)ふだん使っていて画面のちらつきを感じることがなかったから

    そうですね、通常、すべてのコマンドで再描画が必ず発生するわけではなく、例えば SetActivePos メソッドなど、エディタエンジンの仕様上、画面の移動がともないどうしても再描画が発生してしまうシーンがあり、それを無理やり抑制するのが Redraw = false ですから、普段のマクロではそれほど意識する必要はないかと思います。

    > 明示的に Redraw を書いていないものは「暗黙的に 1-undo」とかでもよいのでは?

    おっしゃる通り、マクロを書く側からするとその仕様は合理的だと思います。

    ただ、マクロ機能の位置づけとして、操作を記録して再実行するための機能、という大前提があるので、通常の操作と仕様が変わってしまうのは問題がありそうですね ^^;

     |  Kuro  |  返信
  20. Kuro さん、開発お疲れ様です。
    風邪から復帰されたようで何よりです。

    Undo のタイミングを決める方法ないだろうか…と思っていたところで丁度議論されていたので、意見を一票投じさせてください😃

    Redraw と連動させるか、別のメソッドを用意するか、とのことですが、別のメソッド追加に一票です。

    理由は、

    1. 命名: Undo OFF の機能とRedraw という名前が紐付かない
    2. 柔軟性: デバッグ時や動作仕様上、描画はさせたいけど Undo 記録はしたくない (もしくはその逆) という場面があっても対応できる
    3. 安全性: 新規追加であれば、現存のマクロに影響を及ぼさない

    という点からです。 (Redraw とはセットで使う場面が多そうですが…😅)

     |  yuko  |  返信
  21. ご心配いただきありがとうございます。

    今年の風邪は鼻から来ました。おかげさまでなんとか Mery の記事を書き上げ、本日公開しようとしていたところでした。最近、気温の変化が激しいので yuko さんもお気をつけください。

    > 別のメソッド追加に一票です。

    えー。もう Redraw プロパティに実装しちゃいましたし、使い方の記事も書いちゃったよー!

    > 1. 命名: Undo OFF の機能とRedraw という名前が紐付かない

    そもそも Undo OFF 機能なんてない!と思えば、Redraw でできるっていう抜け道が用意されていた、みたいな考え方はダメですか?(w

    > 2. 柔軟性: デバッグ時や動作仕様上、描画はさせたいけど Undo 記録はしたくない (もしくはその逆) という場面があっても対応できる

    そこまで細かく Undo ポイントを考慮してマクロを書きたい場合、この Redraw 流用案はダメですね。

    > 3. 安全性: 新規追加であれば、現存のマクロに影響を及ぼさない

    既存のマクロも自動的に 1 発 Undo になるから便利!だと思っていたのですが、逆にそうされたくないケースもあるかもしれませんね。

    記事公開前で良かったです。とりあえず、Undo ポイントを Redraw で行う仕様は見送りとさせていただきますね。MeryWiki の開発室のほうに将来的な課題としてメモっておきます。

     |  Kuro  |  返信
  22. Redraw=true は Redraw=false を受けて記述されるものと考えると、あえて Undo ポイントを置くために Redraw=true; Redraw=false; を記述しないといけないのは冗長な気がします。
    オブジェクト省略可で UndoEnable() みたいに簡潔にはさみこめるほうがよいかと。
    (既存のマクロも含めて)デフォルトで「暗黙的に 1-マクロ = 1-Undo」への仕様変更するなら引数なしのほうが分かりやすそうですが、そうでない場合にもコードの先頭に UndoEnble( false ); を追加するだけで済みます。
    あるいは、UndoEnable(true) 以下の行で継続的に true にしたい場合がありえるとするなら、Undo( [enble option] , [multiple option] ) のようなかたちで引数を2つとるように… とか。

    「マクロの記録でコード化した場合 Undo ポイントの多いマクロができあがって使いづらい」という私のような初心者のために、

    UndoEnable( false );		// このマクロを「元に戻す」1回の操作で Undo 可能にする(不要ならコメントアウト)
    

    みたいな行が自動的に1行目に追加されるとハッピーになれそうです。 XD

     |  sukemaru  |  返信
  23. > えー。もう Redraw プロパティに実装しちゃいましたし、使い方の記事も書いちゃったよー!

    おお……やぶへびなことを言ってしまいましたね(汗)

    Kuro さんも考えていることと思いますが、やはり「Undo は都度記録したい」という意見の方が遥かに少数派な気がしますので、Redraw プロパティとしても抵抗が無い範囲の仕様変更だと感じます。

    それとすみません。以下のコメントを読み飛ばしていました。

    > ポジティブに考えると、Undo ポイントなので、その時点を画面に反映させてます。っていうとらえ方もできるかなーとも思います。
    >
    > 使われ方として 1 マクロで 1 Undo にしたいという需要が多いのではないかと予想しているのと、過去のマクロも Redraw を使ってくれているものは自動的に 1 Undo にできちゃうところでメリットを感じています。

    なるほどと思いました。私の出した意見より、受けるメリットの方が大きい気がします。(やっぱり Redraw 統合でいいんじゃないかなーという思えてきました…😓)

    また sukemaru さんの、

    > 「マクロの記録でコード化した場合 Undo ポイントの多いマクロができあがって使いづらい」という私のような初心者のために、

    の意見も、マクロ記録から利用する際の利便性がグッと上がりそうですね!「Undo ポイントを都度設定したい」という方が上級者的な思考だと感じるので、この仕様としても良さげな気がします。

     |  yuko  |  返信
  24. >> sukemaru さん
    なるほど、難しい…。
    ちょっとすでに用意している仕組みでは対応できないような気がして来ました ^^;

    やはりマクロを活用されている方は複雑な使い方を想定されているのですね、新バージョンリリース前にご意見を頂けて良かったです。

    次のバージョンでは実装を見送りましたので、将来的な課題として検討事項にさせてくださいませ。

    >> yuko さん
    > おお……やぶへびなことを言ってしまいましたね(汗)
    いいえー、意見を募集したのは私ですから (w
    (ちょっと実装の解除に時間がかかってしまい新バージョンリリースがまだできていませんが、近日中には公開できる予定です。ちなみに、次のバージョンはめっちゃ地味です)

    > 「Undo ポイントを都度設定したい」という方が上級者的な思考
    そうなんですよね。もともとは、Undo ポイントを減らしたいというご要望だったので、それだったらすぐに実装できる仕組みを用意しているので!っていうノリで盛り上がった話題なのですが、気が付けば逆に Undo ポイントを刻みたい方向へ… ^^;

    反対派多数ということで、本件はボツとさせていただきます。(MeryWiki の開発室の ToDo リスト行き)

     |  Kuro  |  返信
  25. 「もったいないお化けが来るよっ」

    アイデアを得て形にして下さった Kuro さんのご好意と「技」がもったいない…。

    Redraw プロパティで Undo グループ化を兼用、なのは便利で美しい、という考え
    なのだけれど…

    > ご意見・ご要望
    >
    > 内容 状態 備考
    >
    > マクロで Undo ポイントの設定 検討 Redraw プロパティ流用派 VS 新メソッド用意派 (メソッドにするかプロパティにするか?メソッド名、プロパティ名の案が欲しい)

    ということで…、
    今、要望させていただきます。

    ・RedrawUndo プロパティの追加

    既存の Redraw プロパティはそのままに、新しい RedrawUndo プロパティが欲しいです。
    見送りとされた Undo グループ化兼用 Redraw の機能に相当、継承するものです。

    自分には Undo を小刻みにしたい高度なテクニックや、同時だと危険な操作、などのマクロは
    ないです。
    なので、すべてに設定したいのですが、これまで作ったマクロのすべてに、2行の追加を
    するのは気が進まなく、せめて扱いやすい名前で全置換にしたい、という動機です。

    むずかしい制御をしたい方にも気に入っていただけるとありがたいです。

    【マクロリファレンス】
    --------------------------------------------------------------------------------
    Redraw プロパティ

    ウィンドウの再描画の有効・無効を設定または取得します。

    構文
    function get Redraw() : boolean
    function set Redraw(value : boolean)

    プロパティ値
    * 再描画を行う場合は true を示し、それ以外の場合は false を示すブール値。
    --------------------------------------------------------------------------------
    ※追加案※
    --------------------------------------------------------------------------------
    RedrawUndo プロパティ

    ウィンドウの再描画の有効・無効と Undo ポイントのグループ開始・終了を同時に設定または取得します。

    もし RedrawUndo プロパティを true に設定したときに Redraw プロパティが false ならば、ウィンドウの再描画を行わず Undo ポイントの設定だけを行います。

    構文
    function get RedrawUndo() : boolean
    function set RedrawUndo(value : boolean)

    プロパティ値
    * 再描画と Undo (Undo ポイント・グループ終了)を行う場合は true を示し、描画と Undo の抑止(Undo ポイント・グループ開始)を同時をする場合は false を示すブール値。
    --------------------------------------------------------------------------------

    【参照先】
    https://www.haijin-boys.com/wiki/マクロリファレンス:Window_インターフェイス#Redraw_.E3.83.97.E3.83.AD.E3.83.91.E3.83.86.E3.82.A3

    【使い方】

    使い方-1: [従来通り] 描画の無効 → 再描画。

    Redraw = false;   // 描画抑止
    ...
    Redraw = true;    // 再描画
    

    使い方-2: [新] 描画の無効と Undo 抑止(グループ開始)→ 再描画と Undo 再開(グループ終了)

    RedrawUndo = false;   // 描画と Undo 抑止(Undo グループ開始)
    ...
    RedrawUndo = true;    // 再描画と Undo 再開(Undo グループ終了)
    

    使い方-3: [新] 描画はずっと有効、Undo 抑止(グループ開始)→ Undo 再開(グループ終了)

    RedrawUndo = false;   // 描画と Undo 抑止(Undo グループ開始)
    Redraw = true;        // 再描画、ここからずっと描画
    ...
    RedrawUndo = true;    // Undo 再開(Undo グループ終了)
    

    使い方-4: [新] 描画はずっと無効、Undo 抑止(グループ開始)→ Undo 再開 … 抑止 を複数回 → 再描画と Undo 再開(グループ終了)

    RedrawUndo = false;   // 描画と Undo 抑止(Undo グループ開始)
    Redraw = false;       // 描画抑止(すでに抑止されてるけど…)
    ...
    RedrawUndo = true;    // 描画抑止のまま Undo 再開(Undo グループ終了)
    ...                   // この間は Undo 有効
    RedrawUndo = false;   // 描画抑止のまま Undo 抑止(Undo グループ開始)
    ...
    RedrawUndo = true;    // 描画抑止のまま Undo 再開(Undo グループ終了)
    Redraw = true;        // 再描画
    

    【ご注意】
    Redraw プロパティを false に設定したとき、JavaScript エラーなど何かのはずみで true に設定されずマクロが終了した場合、画面の再描画が行われないままになってしまうことがあります。
    RedrawUndo プロパティでも同じことが発生するでしょう。

    このようなときにパニックにならないように…、

    RedrawUndo = true;
    Redraw = true;
    

    というだけの簡単なマクロを用意して、ショーカットキーに割り当てておくといいです。
    --------------------------------------------------------------------------------

    ここから下には不適切な内容が含まれます。善良なユーザの皆さんはご覧にならないことを
    お勧めいたします。_o_

    --------------------------------------------------------------------------------
    んで…、最後にこっそりと魔改造もお願いしたいのですが、内緒ですよ。

    Mery.ini
    に次の制御を追加してほしいです。

    [General]
    Redraw=Redraw

    としてこれがデフォルト。これを

    Redraw=RedrawUndo

    とすると、全部の Redraw を RedrawUndo 扱いにして… (ry

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