複数選択を扱うマクロNo.08275
IKKI さん 14/04/28 12:24
 
秀丸担当さん、こんにちは。IKKI です。

そろそろ複数選択を扱うマクロを作りたくなってきました。
マクロでの複数選択の扱い方について、現時点でどのようにお考えでしょうか。

(1) 手動で複数選択された各範囲をマクロで取得する
(2) マクロで複数範囲を選択する

複数選択がカラーマーカーの特別なレイヤーとして実装されているのなら、findmark
er と同様に (例えば) selmarker キーワードを用意していただければ、上記 (1)(2)
 とも実現できそうです。

または、とりあえず colormarker 文を複数選択に対応させるだけで、上記 (1) は実
現できます。

ご検討のほどよろしくお願いいたします。

[ ]
RE:08275 複数選択を扱うマクロNo.08276
秀丸担当 さん 14/04/28 13:50
 

マクロでの複数選択については、選択を扱う様々なところに影響があるので、互
換性の面から、従来からある文は従来通り動くようにしています。
例えば事前に複数選択された状態からの copy; という一文のマクロでは、複数
ではなく1つの扱いにしています。


>(1) 手動で複数選択された各範囲をマクロで取得する

nextcolormarker ..., findmarker; のように、selmarkerといった書き方も考え
られますが、範囲選択の場合はカーソル位置までを引きずってしまうので、選択
したまま取得する方法は使えなさそうです。

やはりいったんcolormarker文でカラーマーカー化してから、取得することにな
ると思います。
しかし前述のとおりマクロ上は1つの選択扱いになっているので、その制限を解
除する方法が必要だと思います。

>(2) マクロで複数範囲を選択する

こちらの場合は colormarker ...., selmarker; といった方法があったら問題は
無いと思います。
と思ったのですが、selectcolormarker; という文を既に作っていました。
「一時的なカラーマーカーを選択」コマンドに相当します。
この文は互換性を考える必要が無いので、選択することだけはマクロ上で可能で
した。


(1)の制限を解除する方法があればいいということになると思います。
一応setcompatiblemodeで制限を解除する方法も考えているのですが、多くの文
に影響があるので、いまのところしていないです。

colormarker文1つだけの限定で解除できたらやりやすいです。
案として、例えば取得専用の予約レイヤーを作るとかは、どうでしょうか。
1.手動で選択
2.colormarker ...., getmultisel;で専用レイヤー化
4.nextcolormarker ..., getmultisel;で取得

[ ]
RE:08276 複数選択を扱うマクロNo.08277
IKKI さん 14/04/28 18:12
 
>マクロでの複数選択については、選択を扱う様々なところに影響があるので、互
>換性の面から、従来からある文は従来通り動くようにしています。
この制限は……何というか、とても惜しいですね。

いろいろ考えるとこういう制限を設けるしかなかったのはよくわかりますが、「キー
操作の記録」がいつまでも複数選択をサポートしないわけにはいかないでしょうし、
最終的には setcompatiblemode で制限を解除する方向へ行くしかない気がします。
つまり、関係する文ひとつひとつを複数選択に対応させていく作業を、いつかやらな
くてはならないと思います。

一気にすべての文を対応させるのが大変であれば、まずは setcompatiblemode の複
数選択ビットを定義してしまって、その後いくつかのバージョンに分けて必要性の高
い文から順次対応させていき、最終的に v8.4 正式版までにすべての文を対応させる、
という作戦はどうでしょうか。
イメージとしては…

 第1弾 (v8.40β15): colormarker 等
 第2弾 (v8.40β16): backspace 等
 第3弾 (v8.40β17): insert, autocomplete 等
 第4弾 (v8.40β18): inputpos 等

…みたいな。(実はそんなに多くない気がしてきました?)

>colormarker文1つだけの限定で解除できたらやりやすいです。
>案として、例えば取得専用の予約レイヤーを作るとかは、どうでしょうか。
この案は、あまりピンと来ませんでした。レイヤー名を見て colormarker 文の動作
を変えるという意味でしょうか。
取得先レイヤーを1個に限定するというのは、無意味に自由度を下げることになる気
がします。


あと、どのみち multiselecting キーワードが必要になると思います。

ご検討のほどよろしくお願いいたします。

[ ]
RE:08277 複数選択を扱うマクロNo.08278
秀丸担当 さん 14/04/30 11:48
 

ほとんどの文は各種コマンドと対応関係にあるので、現時点で実装する作業はあ
まりすることは無く、コマンドが対応していれば制限を解除するだけでできると
思います。

一度仕様として決まると、そこから互換性の配慮が必要になってくることが心配
です。(これまでに何度か調整があり、前回のβ版でも調整がありました)
でもそろそろ頃合いかと思います。

colormarker文限定で解除するのはしっくりこないということで、やはり
setcompatiblemodeでやる方向で検討してみます。
multiselecting等も必要になってくると思うので、一緒に検討します。

[ ]
RE:08278 複数選択を扱うマクロNo.08280
IKKI さん 14/05/02 14:33
 
秀丸担当さん

早速のご対応ありがとうございました。
下記のロジックで意図したとおりに動いているようです。
(もし何か見落としている点があったらご指摘ください>皆様)

β15でマクロの複数選択対応は完了と考えてよろしいでしょうか。
(以後、マクロで未対応な点を見つけたらバグとして報告させていただいてよろしい
でしょうか?)


// 複数選択範囲をごにょごにょする
$$w1 = currentmacrobasename + "#selection1";
$$w2 = currentmacrobasename + "#selection2";
colormarker 0xFFFFFF, 0xFF6666, 11, 2, 0, $$w1;
##bx = seltopx;
##by = seltopy;
gofiletop;
nextcolormarker 0x09, 0, $$w1;
while (result) {
 beginsel;
 nextcolormarker 0x0A, 0, $$w1;
 endsel;
 colormarker -1, -1, 11, 2, 0, $$w1;
 call do_something;
 colormarker 0xFFFFFF, 0x993333, 11, 2, 0, $$w2;
 nextcolormarker 0x01, 0, $$w1;
}
moveto ##bx, ##by;
selectcolormarker $$w2;
colormarker -1, -1, 11, 2, 0, $$w2;
return;

do_something:
 ##bx = seltopx;
 ##by = seltopy;
 $$text = gettext(seltopx, seltopy, selendx, selendy, true);
 insert "【" + $$text + "】";
 beginsel;
 moveto ##bx, ##by;
 endsel;
 return;

[ ]
RE:08280 複数選択を扱うマクロNo.08281
秀丸担当 さん 14/05/02 15:55
 

ご確認ありがとうございます。
サンプルのマクロをサブルーチンとして呼び出して動いていることが確認できま
した。
未対応な点があるようでしたら、バグとしてご連絡いただけると助かります。

[ ]