CSVモード等での異なる行のx値No.07344
K'zawa さん 12/07/21 11:27
 
こんにちは、K'zawaです。

マクロで、範囲選択の状態を記憶しておいて解除、何か処理してから復元すると
します。ところが、CSV/TSV/タブ自由配置でのBOX選択では復元できません。と
いうのは、選択開始点のx値がわからないのです。
BOX選択では、選択開始点は、「seltopx, selendy」、「selendx, seltopy」と
いう組み合わせも(通常の表示モードでは)ありえますが、CSVモード等では、異
なる行のx値はそのままでは使えません。
一方、終了点は現在のカーソル位置そのものです。
なので、選択開始点x,yを表すキーワードか、X変換関数が必要です。前者だとし
ても関数は何かと必要だと思いますが…。
あるいは何か他の方法があるでしょうか?

[ ]
RE:07344 CSVモード等での異なる行のx値No.07350
秀まるお さん 12/07/23 18:02
 
 矩形範囲選択で複数行を選択してる場合で、CSV/TSV/プロポーショナルフォン
トの場合だと、各行毎にどこからどこまでが矩形範囲選択されてる文字なのか、
それは秀丸メール内部では分かりますが、マクロからは分かりません。

 それをマクロから分かるようにしたいって話になるでしょうか。

 例えば、

WWWxxxWWW
iiiiiiiiiiiiiiiiii
WWWxxxWWW

 みたいな文章がプロポーショナルフォントで表示されていて、1行目から3行
目までの、「xxx」部分を矩形範囲選択したとして、2行目の何桁目から何桁目
が矩形範囲選択されてるのか知りたいとか…。

 しいて対応するとしたら、seltopx(0)で1行目の選択開始位置、seltopx(1)で
2行目の選択開始位置が得られるとか…。


 果たしてそこまでマクロでコントロールする必要があるのかって疑問はありま
すけども、とりあえず知りたい情報が何か分からないと始まらないので、それだ
け教えて欲しいです。

[ ]
RE:07350 CSVモード等での異なる行のx値No.07353
K'zawa さん 12/07/24 11:05
 
秀まるおさん、こんにちは。
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;

[ ]
RE:07353 CSVモード等での異なる行のx値No.07357
K'zawa さん 12/07/24 14:50
 
秀まるおさん、こんにちは。
K'zawaです。

>結論としては、左下と右上のxさえわかればよいということになります。

と書きましたが、下記マクロを実行したときの選択状態では、
左下と右下のxは同じなので、左上、右上どちらが選択開始点か分からないです。
やはり、選択開始点そのもののx,yが必要なようです。
それと、カーソルと同じ行の、カーソルと反対側のxが知りたいです。
カーソル位置が選択範囲内か、カーソルの左までか、それとも幅が0か知りたい
ので。

insert "ABC,D\nY,Z\n";
config "xTabMode:0x0101";
moveto 3, 0;
beginrect;
down;

[ ]
RE:07357 CSVモード等での異なる行のx値No.07358
秀まるお さん 12/07/24 17:21
 
 とりあえず、目的のことが何かを理解するには、書いていただいたマクロを読
んで理解する必要があると思うんですが、なんでか分かりませんが急に秀丸
エディタや秀丸メールのバグ報告&要望がいきなり殺到してきて余裕が無くなっ
てしまいました。

 ということで少々お待ちください。

 そもそも、プロポーショナルフォントで矩形範囲選択すること自体に無理があ
るのですけども。

[ ]
RE:07358 CSVモード等での異なる行のx値No.07359
秀まるお さん 12/07/25 09:56
 
 実はまだよく分かってませんが、1つ言えることは、こうやって要望がある度
に秀丸マクロに命令をどんどん追加していくのは非常に大変だということがあり
ます。

 なので、しいてやるとしたら、

   specialvar("...")

 みたいな感じで内部データにアクセス出来るようにしたらいいかなぁと思いま
した。

 例えば、矩形範囲選択の時は、実は範囲選択の座標はピクセル単位で持ってま
して、

  specialvar("xdotSelTop");
  specialvar("xdotSelBottom");

 とか追加して参照可能にしたらいいかなぁと思いました。そして、

  specialconv("XdotToXpos", seltopy, specialvar("xdotSelTop"))

 みたいな感じて秀丸内部にある変換関数もそのままアクセス出来るようにした
らいいかなぁという気もします。

 ですが、こうやって内部関数を公開しても、それでじゃぁマクロが作られるか
というと大変な労力が必要な気がします。結局マクロがうまく動かないと、これ
らの変数や変換関数の中身が分からないとどうしようもないけども、じゃぁソー
スコード見せますから自分で調べてくださいという訳にもいかないだろうし、将
来これら関数の仕様変更があったらってことも考えると、やっぱり無理かありま
す。

 ということで、やはり現実的には、ここまでマニアックな情報までマクロから
アクセスさせるのは無理じゃないかと思います。

 プロポーショナルフォントでの矩形範囲選択やCSV/TSVモードの処理は、V8.20
βでもいろいろご指摘いただいてバグ修正などしてますが、内部で非常に複雑な
処理をしています。

 ってことで、やはりCSV/TSV/プロポーショナルで、しかも矩形範囲選択してる
最中の音声化までは対応不可ってことでお願いできませんでしょうか。

[ ]
RE:07359 CSVモード等での異なる行のx値No.07360
K'zawa さん 12/07/25 11:20
 
秀まるおさん、こんにちは。
K'zawaです。

> ってことで、やはりCSV/TSV/プロポーショナルで、しかも矩形範囲選択してる
>最中の音声化までは対応不可ってことでお願いできませんでしょうか。

そうですか、では、そういうときは、カーソル位置の文字を読んでお茶を濁すこ
とにします。
ですが、プロポーショナルフォントか等幅かを知る方法はあったでしょうか?

[ ]
RE:07360 CSVモード等での異なる行のx値No.07361
秀まるお さん 12/07/25 12:01
 
> ですが、プロポーショナルフォントか等幅かを知る方法はあったでしょうか?

 マクロヘルプを検索したらありました。

 fontmodeってキーワードで分かるようです。

    if( (fontmode & 1) != 0 ) {
        message "プロポーショナルフォントです。";
    }

[ ]
RE:07361 CSVモード等での異なる行のx値No.07362
K'zawa さん 12/07/25 15:38
 
秀まるおさん、こんにちは。
K'zawaです。

> マクロヘルプを検索したらありました。
>
> fontmodeってキーワードで分かるようです。

ありました。ファイルタイプ別ならgetconfigかと思って、config "x..."の方を
探していました。ありがとうございます。

[ ]