|
秀まるおさん、こんにちは。
K'zawaです。
> 矩形範囲選択で複数行を選択してる場合で、CSV/TSV/プロポーショナルフォン
>トの場合だと、各行毎にどこからどこまでが矩形範囲選択されてる文字なのか、
>それは秀丸メール内部では分かりますが、マクロからは分かりません。
>
> それをマクロから分かるようにしたいって話になるでしょうか。
まず、最終目的は、状況を適切に音声化しつつ、秀丸エディタの機能を妨害しな
い秀丸リーダーマクロを作ることです。
秀丸リーダーを使っていると範囲が崩れる、ではしょうがないので。
秀丸リーダーのマクロで、範囲選択を解除して、情報収集した後で復元する
ところがあります。範囲選択を解除せずに情報収集できれば一番よいのですが、
これは一筋縄ではいきません。他の要望をいくつも出さないといけないでしょう。
それで、必要なのは四つの角の位置です。
現状分からないのは、矩形の左下xと右上xです。
この2値がピンポイントで分かればいいです。
> みたいな文章がプロポーショナルフォントで表示されていて、1行目から3行
>目までの、「xxx」部分を矩形範囲選択したとして、2行目の何桁目から何桁目
>が矩形範囲選択されてるのか知りたいとか…。
秀丸リーダーマクロでは、やらないと思います。
仮に他のマクロでやるとしても、クリップボードにコピーして取り出すとかでき
そうです。
> しいて対応するとしたら、seltopx(0)で1行目の選択開始位置、seltopx(1)で
>2行目の選択開始位置が得られるとか…。
この方法は、左下、右上のxも含まれるので、これでも構いませんが…。
これは、あくまでも余計な話ですが、ここまでできるなら、範囲選択に関係なく、
ある行のxに相当する他の行のxを返す関数のほうがいいような気がします。
(他のマクロデ使いたい。)
あくまでも余計な話 終わり。
結論としては、左下と右上のxさえわかればよいということになります。
参考までに、差し替えてもらおうと思って変更中のHmRead1.macを貼り付けてお
きます。原稿のものは、削除される文字を音声化かつ範囲選択中のときの処理が
抜けていて、削除後のカーソル位置を読んでいました。
// 1文字発音 テスト版 2012/07/24
// CSV/TSVモードもプロポーショナルフォントも考慮していない。
// オプション 範囲選択操作時の読み上げ位置
// 0:常にカーソル位置 1:カーソル位置が選択範囲外なら内側にずらす
#shiftposition = 1;
// オプション 終わり
setcompatiblemode 0x0F;
$mark = "!";
#shiftposition = iskeydown( 0x2E ) | ( #shiftposition & ( !
iskeydown( 0x2E ) ) );
if ( selecting && #shiftposition ) {
call Selecting;
#code = ##return;
if ( #code == -2 ) goto Read;
} else {
#code = unicode;
}
if ( #code == eof ) $str = "ファイルのマツビ";
else if ( #code == 0 ) $str = "ブランク";
else if ( #code == 9 ) $str = "タブ";
else if ( #code == 0x0D ) $str = "カイギョウ";
else {
$mark = "#";
$str = unichar( #code );
}
Read:
ddeinitiate "HidemaruReader", "Read";
ddeexecute $mark + $str;
ddeterminate;
endmacro;
// Subroutine
Selecting:
##rect = rectselecting;
##line = lineselecting;
if ( seltopx == selendx && seltopy == selendy ) {
$str = "選択幅 ゼロ";
return -2;
} else if ( ##rect != 0 && seltopx == selendx ) {
$str = "ボックス選択幅 ゼロ";
return -2;
} else if ( ##rect != 0 && x >= linelen ) {
return unicode;
}
if ( x == selendx && y == selendy ) {
##startselx = seltopx; ##startsely = seltopy;
} else if ( x == seltopx ) {
return unicode;
} else {
##startselx = seltopx; ##startsely = selendy;
}
##lastselx = x; ##lastsely = y;
disabledraw;
right;
##endsel = ! selecting;
escape;
moveto ##lastselx, ##lastsely;
left;
##code = unicode;
moveto ##startselx, ##startsely;
if ( ##rect ) beginrect;
else if ( ##line ) beginlinesel;
else beginsel;
moveto ##lastselx, ##lastsely;
if ( ##endsel ) endsel;
enabledraw;
return ##code;
|
|