|
(turukame.3:08833 から引っ越しました)
> V8.56β15でsetcompatiblemodeでカラーマーカーをやり直しできるかどうかを追
加しました。
少し試してみました。ビット22を立てると v8.56β1 相当の動作になる、と理解しま
した。
もともとの要望は、2つの要件
(1) カラーマーカーが存在していた時点までアンドゥしたらカラーマーカーが復活
してほしい
(2) カラーマーカーが存在していなかった時点までアンドゥしたら、そのカラー
マーカーは消えてほしい
を同時に満たしたいということでした。
今回追加された setcompatiblemode のビット22は (1) を満たしますが (2) を満た
さないので、これを使っても「マクロの内部処理用に塗ったカラーマーカーがアンド
ゥしたらユーザーに見えてしまう」という不都合が残ることになり、使いどころがあ
りません。
私としては setcompatiblemode のビット22を使うことはありませんので、もし私だ
けの要望のために追加されたのでしたら、他の人が使い始めないうちに撤去していた
だいた方がいいかもしれません。
お手数をおかけして申し訳ありません。
上記2つの要件を満たす方法としては、これは私案ですが、
(A) カラーマーカーのスナップショットを撮る文を追加
(B) スナップショットされたカラーマーカーを復帰する文を追加
(C) アンドゥバッファを遡ってスナップショット地点を通過したらカラーマーカー
を復帰する
のうち「(A)と(B)」もしくは「(A)と(C)」を実装するのが良いと思っていました。
この考えに至った背景は後述します。
手戻りになってしまい恐縮ですが、あらためてご検討いただければ幸いです。
------ 以下は turukame.3:08736 へのレスとして書きかけて投稿しなかった文章で
す ------
カラーマーカーが復活すると便利だと言った背景には
「ある時点の複数選択の状態を記憶しておき、復元できるようにしたい」
という要求があります。
複数選択はカラーマーカーに変換可能なので、この要求は
「ある時点のカラーマーカーの状態を記憶しておき、復元できるようにしたい」
と言い換えることができます。
秀丸 v8.40 を境に、選択範囲に対して何か処理するマクロを書くときの考え方が
「座標を変数に入れて保持」から「範囲をカラーマーカー化して保持」へガラッと変
わりました。
それに伴い、カラーマーカーを容易に記憶/復元したい場面が増えています。
この話は要するに、turukame.3:07727 あたりで話していた「選択範囲の扱いを抽象
化したい」という話につながるのですが、あのときの話では
「位置情報を抽象化して保持しても、テキストを編集したらずれて無意味になる」
という問題があり、この問題を回避できる妙案として
「編集しても自動的に追従するカラーマーカーとして範囲を保持する」
というアイディアを得たのでした。
カラーマーカーの記憶/復元を実現するアプローチとしては
(a) テキストとカラーマーカーの整合性が自動的に保たれる仕組み
(b) テキストとカラーマーカーの整合性をマクロ側で担保する仕組み
の2通りが考えられます。
(b) は現状でも実現可能ですが、上述の議論を踏まえると (a) が理想的です。
ところで、秀丸エディタの編集機能は現に (a) の要件を満たしていますよね。
そして、テキストの状態を記憶/復元する仕組みとしてアンドゥバッファがあります
ね。
同様に、カーラーマーカーの状態を記憶/復元する仕組みとしてもアンドゥバッファ
を使えばいいのでは?
つまり、アンドゥバッファを拡張して、テキストとカラーマーカーを含めた「編集画
面のスナップショット」を記憶/復元する仕組みとして再構築すれば、万事丸く収ま
るのではないか?
…というのが、turukamee.3:08735 のネタを出した時点で考えていたことです。
とはいえ、アンドゥバッファ周りをいじるのはそう簡単なことでもないと思います。
そこで、当座の利便のために、位置情報のみを保持する (b) のアプローチをもっと
簡単・高速・確実にできないだろうか?ということも考えています。
現時点では、h_tom さん作「カラーマーカーデータ保存・復元マクロ」のような方法
でファイルに保存するか、もしくは、末尾に書いたようなサブルーチンを使って静的
変数に保存することになります。
いずれも簡単とは言えないし、それなりに時間がかかるし、静的変数を使う場合は容
量の問題もあります。
というわけで、カラーマーカーのスナップショットをメモリ上に記憶/復元 (and/or
ディスクに保存/読み込み) する仕組みを本体に搭載できませんでしょうか?
…というネタも出してみます。
ご検討いただければ幸いです。
---------------------------------------------------------------------
以下は複数選択範囲を静的変数に記憶/復元するサブルーチンです。
わりと速度に留意して書いたつもり。もったいないので貼っておきます。。。
SaveRegion: // 選択範囲を記憶
$$y = currentmacrobasename + "#selection";
if (multiselecting || rectselecting) {
colormarker 0xFFFFFF, 0xCC6666, 11, 2, 0, $$y;
gofiletop;
nextcolormarker 0x09, 0, $$y;
while (result) {
##bc = column; ##bl = lineno;
nextcolormarker 0x0A, 0, $$y;
$$e = $$e + sprintf("%i,%i\t%i,%i\n", ##bl, ##bc, lineno - ##bl, column -
##bc);
nextcolormarker 0x01, 0, $$y;
}
selectcolormarker $$y;
deletecolormarker $$y;
} else if (selecting) {
$$e = sprintf("%i,%i\t%i,%i", seltoplineno, seltopcolumn, selendlineno - s
eltoplineno, selendcolumn - seltopcolumn);
} else {
$$e = sprintf("%i,%i\t%i,%i", lineno, column, 0, 0);
}
setstaticvariable currentmacrobasename + "#region", $$e, 0;
return;
LoadRegion: // 選択範囲を復元
$$e = getstaticvariable(currentmacrobasename + "#region", 0);
if ($$e == "") {
return;
}
$$y = currentmacrobasename + "#selection";
while (##i < strlen($$e)) {
##bl = val(midstr($$e, ##i));
##i = strstr($$e, ",", ##i) + 1;
##bc = val(midstr($$e, ##i));
##i = strstr($$e, "\t", ##i) + 1;
##wl = val(midstr($$e, ##i));
##i = strstr($$e, ",", ##i) + 1;
##wc = val(midstr($$e, ##i));
##i = strstr($$e, "\n", ##i) + 1;
if (##i == 0) break;
colormarker 0xFFFFFF, 0x663333, 11, 2, 0, $$y, ##bl, ##bc, ##bl + ##wl, ##
bc + ##wc;
}
if (##i > 0) {
selectcolormarker $$y;
deletecolormarker $$y;
} else {
moveto2 ##bc, ##bl;
beginsel;
moveto2 ##bc + ##wc, ##bl + ##wl;
endsel;
}
return;
|
|