文字列挿入後にカーソル位置を戻す方法No.01683
Iranoan さん 09/03/09 03:12
 
 皆さん今日は、Iranoan です。
 マクロのアルゴリズムについて質問です。
 マクロ実行時のカーソル位置を戻すにはどうすれば良いでのしょう。現在の
カーソル位置より後ろに文字を挿入した場合は、
//------------------------------------------------------------
#x = x;
#y = y;
何か処理
moveto #x, #y;
//------------------------------------------------------------
で良いのですが、カーソル位置より前に文字列を挿入した場合、その文字列に
よって行数が変わったり、列数が変わったりしますが、その変化分を考慮して
カーソルを移動するエレガントな方法が解りません。

 秀丸エディタなら、x, y, moveto 文の代わりに、column, lineno,
movetolineno 文を使えばよいのですが、秀丸メールではヘッダ領域では、
lineno, movetolineno 文が使えません。
 ヘッダ部の行数をあらかじめ保持しておいて、...、同一行なら right 文を
繰り返して...、と方法が無いわけではなさそうですが....。

[ ]
RE:01683 文字列挿入後にカーソル位置を戻No.01684
IKKI さん 09/03/09 06:17
 
こんにちは。IKKI です。

>  マクロ実行時のカーソル位置を戻すにはどうすれば良いでのしょう。

1| To: xxx@example.com, xxx@example.com, ┃ccc@
 | example.com
2| CC: ...



1| To: AAAさん <xxx@example.com>, BBBさん
 | <xxx@example.com>, ┃xxx@example.com
2| CC: ...

に変換したい、みたいな話でしょうか? (「┃」はカーソルを表す)

こういう場合に私がよく使うのは次のような方法です。

beginsel;
golinetop2;
$$text = gettext(seltopx, seltopy, selendx, selendy, true);
// 文字列変数上で必要な処理を行う
insert $$text;

編集バッファ上での処理と同じことが文字列変数上でも可能とは限りませんが、
必要に応じて DLL や変換モジュールを使えば大抵のことはできると思います。


(本文中のメールアドレスは伏せ字に変換されました。伏せ字にしたくない場合
はメールアドレスを""で囲んで書き込んでください。)

[ ]
RE:01684 文字列挿入後にカーソル位置を戻No.01685
秀まるお さん 09/03/09 16:26
 
 カーソル移動量の差分を正確に計算させるのは難しいと思います。

 今現在のカーソル位置に何か特別な制御文字を挿入してやって、後でその文字
を検索するって形でカーソル位置を計算させる方が手っ取り早いんじゃないかと
思います。

[ ]
RE:01685 文字列挿入後にカーソル位置を戻No.01689
Iranoan さん 09/03/09 17:54
 
 秀まるおさん、IKKI さん今日は、Iranoan です。
> 編集バッファ上での処理と同じことが文字列変数上でも可能とは限りませんが、
> 必要に応じて DLL や変換モジュールを使えば大抵のことはできると思います。
 これだと、変数の文字数制限が引っかかる可能性が高くなってしまいます。
(挿入文字列が長くなる分)

>  カーソル移動量の差分を正確に計算させるのは難しいと思います。
 やはりそうですか。

>  今現在のカーソル位置に何か特別な制御文字を挿入してやって、後でその文字
> を検索するって形でカーソル位置を計算させる方が手っ取り早いんじゃないかと
> 思います。
 制御文字という手がありましたか。
 今回作ろうとしているマクロに適しているか解りませんが、参考にさせて頂
きます。

 お二方とも有難うございました。

[ ]