|
こんにちは。IKKI です。
begingroupundo した点を越えて undo すると、以降の undo が暴走するようです。
●テストマクロ
--------
newfile;
insert "ア"; // level1
insert "イ"; // level1
begingroupundo;
undo; // level2
insert "カ"; // level2
endgroupundo;
undo; // level1
--------
●実際の結果
「やり直し中にやり直しバッファが無くなりました」のエラーが出る
●期待する結果
2つの考え方がありそうです。
A. アンドゥバッファは単一の線形リストで、begingroupundo はリスト上にマーカー
を置くものと考える。
この場合、期待する結果は「ア」です。
B. アンドゥバッファは複数の線形リストが入れ子になったもので、begingroupundo
〜 endgroupundo は一段深いレベルに新たなリストを作るものと考える。
この場合、期待する結果は「アイ」です。
level1 で行った「undo;」は、level2 で行った「undo; insert "カ";」という操作
自体をアンドゥして、その操作が行われる前の状態に戻すと考えられるからです。
●意見
現在の実装はおそらく A. に近いものと思いますが、もし B. の考え方がサポートさ
れていれば、複数のマクロを協調動作させるときに各マクロの独立性を高めることが
できそうです。
例えば、内部で激しく undo するような既存のマクロがあって、それを別のマクロか
ら呼び出す場合、単純に
--------
begingroupundo;
execmacro "既存のマクロ";
endgroupundo;
--------
のようにすればアンドゥ 1 回で実行前の状態に戻ることが保証されてほしいです。
これができれば、既存のマクロの内部構造を知らなくても容易に再利用できて良いと
思います。
以上、ご検討のほどよろしくお願いいたします。
秀丸エディタ v8.00β26
|
|