マクロで範囲選択を維持してカーソル移動No.07389
K'zawa さん 12/08/08 14:42
 
こんにちは、K'zawaです。

マクロでは、カーソルをその場所にもっていかないと得られない情報が多々
ありますが、範囲選択の状態は維持したいというときに、何かよい方法はないで
しょうか?
selectionlock == 1 のときはよいのですが、そうでないとき、No.7344のスレッ
ドで、CSV/TSVモード等でBOX範囲選択している場合、マクロ内で選択解除、のち
に復元するのは無理ということになりましたので。
今回は、範囲選択の種類とか方向とか細かいことはどうでもよく、マクロ実行前
後で状態が変化せず、マクロ内でちょっとカーソルを動かしたいということです。

endselの逆コマンドがあればよいような気がしますが、どうでしょうか?

[ ]
RE:07389 マクロで範囲選択を維持してカーNo.07390
秀まるお さん 12/08/08 15:41
 
 カーソル位置を動かさずにカーソル位置外の文字列に関する情報を取得するに
は、gettextで文字列データを変数に入れて、その変数の中を調べる作戦しか無
いと思います。

 内部的な仕組みとしては、範囲選択の開始/終了位置とカーソル位置とは別に
持ってる形にはなってますが、範囲選択をキープしたままカーソル位置だけ動か
すような仕組みは無いので、そういう仕組みを新たに作るってのは現実的では無
いと思います。

[ ]
RE:07390 マクロで範囲選択を維持してカーNo.07391
K'zawa さん 12/08/08 16:21
 
秀まるおさん、こんにちは。
K'zawaです。

> カーソル位置を動かさずにカーソル位置外の文字列に関する情報を取得するに
>は、gettextで文字列データを変数に入れて、その変数の中を調べる作戦しか無
>いと思います。

現在のカーソル行と目的の行は必ずしも一致してませんし、
タブストップの位置とか個々のタブ文字の幅とか、求めるのはちょっとマクロで
は無理があるように思います。

> 内部的な仕組みとしては、範囲選択の開始/終了位置とカーソル位置とは別に
>持ってる形にはなってますが、範囲選択をキープしたままカーソル位置だけ動か
>すような仕組みは無いので、そういう仕組みを新たに作るってのは現実的では無
>いと思います。

そうなんですか。シフト押しながら範囲選択している状態は、マクロから見ると
endselした状態と同じなので、シフトキーの代わり、つまりselectionlock状態
にすればよいだけかと思った次第です。

[ ]
RE:07391 マクロで範囲選択を維持してカーNo.07392
秀まるお さん 12/08/08 16:47
 
 endselの反対ということならば、つまり、カーソル移動しても範囲選択を解除
しない、beginselした状態にするような命令があればいいって話ですかね。

 それなら出来そうな気はしますけども、別にそういう命令が無くても、一回範
囲選択を解除してから自由にカーソル移動して、また元の範囲選択状態に戻せば
いいってことのような気がします。

    #x = x; #y = y;
    #selecting = selecting;
    #rectselecting = rectselecting;
    #seltopx = seltopx;
    #seltopy = seltopy;
    #selendx = selendx;
    #selendy = selendy;
    #selectionlock = selectionlock;
    $direction = "";
    if( x == seltopx && y == seltopy ) {
        $direction = "topleft";
    } else if( x == selendx && y == selendy ) {
        $direction = "bottomright";
    } else if( x == seltopx && y == selendy ) {
        $direction = "bottomleft";
    } else {
        $direction = "topright";
    }

    if( selecting ) {
        escape;
    }
    ... カーソルを好きなように移動...

    if( #selecting ) {
        if( $direction == "topleft" ) {
            moveto #selendx, #selendy;
        } else if( $direction == "bottomright" ) {
            moveto #seltopx, #seltopy;
        } else if( $direction == "bottomleft" ) {
            moveto #selendx, #seltopy;
        } else {
            moveto #seltopx, #selendy;
        }
        if( #rectselecting ) {
            beginrect;
        } else {
            beginsel;
        }
        moveto #x, #y;
        if( #selectionlock == 0 ) {
            endsel;
        }
    } else {
        moveto #x, #y;
    }

 ってマクロを作ってテストしてみたら、矩形範囲選択で右上から開始して左下
方向に選択してる場合はマクロが期待通り動いてくれないようでした。こんな作
戦でどうでしょうか。
   

[ ]
RE:07392 マクロで範囲選択を維持してカーNo.07393
秀まるお さん 12/08/08 17:01
 
 ちなみにこのマクロは、矩形範囲選択してるケースで「右上から左下、または
左下から右上」に選択してる場合で、さらにプロポーショナルフォントの場合だ
とうまく動作しないようです。

 昔あった話は、つまり、この動作(範囲選択の状態を保存してまた復元する)
をプロポーショナルフォント+矩形範囲選択の場合でもちゃんと動くようにすれ
ばそれでOKって話だったりするのでしょうか。

 現状でそういうケースをエラー扱いにするとしたら、

    if( x == seltopx && y == seltopy ) {
        $direction = "topleft";
    } else if( x == selendx && y == selendy ) {
        $direction = "bottomright";
    } else if( x == seltopx && y == selendy ) {
        $direction = "bottomleft";
    } else if( x == selendx && y == seltopy ) {
        $direction = "topright";
    } else {
        message "矩形範囲選択の選択範囲が復元出来ません。";
        endmacro;
    }

 にするとかになりそうな気はします。

 キーワードを追加するとしたら、

   seltoprightx
   selbottomleftx

 のキーワードを追加したら、それで万事解決なのかなぁという気がしました。

[ ]
RE:07392 マクロで範囲選択を維持してカーNo.07394
秀まるお さん 12/08/08 17:06
 
>  ってマクロを作ってテストしてみたら、矩形範囲選択で右上から開始して左下
> 方向に選択してる場合はマクロが期待通り動いてくれないようでした。

 プロポーショナルフォントでなければ一応うまく動くようでした。

 プロポーショナルフォントとかCSV/TSVモードだとダメっぽいです。

[ ]
RE:07392 マクロで範囲選択を維持してカーNo.07395
K'zawa さん 12/08/08 17:12
 
秀まるおさん、こんにちは。
K'zawaです。

t3:07392| RE 07391 マクロで範囲選択を維持してカーソル移動
> endselの反対ということならば、つまり、カーソル移動しても範囲選択を解除
>しない、beginselした状態にするような命令があればいいって話ですかね。

その通りです。

> それなら出来そうな気はしますけども、別にそういう命令が無くても、一回範
>囲選択を解除してから自由にカーソル移動して、また元の範囲選択状態に戻せば
>いいってことのような気がします。

それが、CSV/TSVモード、プロポーショナルフオントでは無理という話では
なかったかと。

[ ]
RE:07393 マクロで範囲選択を維持してカーNo.07396
K'zawa さん 12/08/08 20:05
 
秀まるおさん、こんにちは。
K'zawaです。

行き違いになってしまいました。

> 昔あった話は、つまり、この動作(範囲選択の状態を保存してまた復元する)
>をプロポーショナルフォント+矩形範囲選択の場合でもちゃんと動くようにすれ
>ばそれでOKって話だったりするのでしょうか。

昔あった話=秀丸リーダーの読み上げマクロの話ですね。
それならその通りです。
そのときに、解除・復元手法が確立していれば、汎用的に使えるので、今回の話
はなかったです。

> 現状でそういうケースをエラー扱いにするとしたら、

秀丸リーダー用としては現状、

・CSV/TSV、プロポー所ナルのBOX選択解除できない
→例外扱いとする
→中途半端なのでBOX選択自体を例外とする

ということにしようとしていましたが、行範囲選択開始コマンドのときの復元で、
例のバグにあたって小休止中。

> キーワードを追加するとしたら、
>
>   seltoprightx
>   selbottomleftx
>
> のキーワードを追加したら、それで万事解決なのかなぁという気がしました。

そうなります。

[ ]
RE:07396 マクロで範囲選択を維持してカーNo.07397
秀まるお さん 12/08/08 23:06
 
 当時の話の時は、BOX範囲選択してる文字列についての汎用的な処理が必要な
のかなぁと思ったのですけども、要するには、範囲選択の状態を復元出来ればい
いということで…。よく理解してなくてすみません。

 さらにちょっと考えたんですが、追加するとしたら、

   selstartx, selstarty

 を追加したらいいのかなぁと思いました。つまり、範囲選択を開始した位置の
x,y座標が分かればいいかなぁと。

 とにかくちゃんとマクロで範囲選択状態の保存/復元が出来るような、何らか
のキーワード追加ってこと考えてみます。

[ ]
RE:07397 マクロで範囲選択を維持してカーNo.07398
Iranoan さん 12/08/09 00:56
 
 秀まるおさん今日は、Iranoan です。
 横から失礼します。
> 範囲選択の状態を復元出来ればい
> いということで…。よく理解してなくてすみません。
<snip>
>  を追加したらいいのかなぁと思いました。つまり、範囲選択を開始した位置の
> x,y座標が分かればいいかなぁと。
 これを正確にやるとすると、あと検索にヒットして範囲選択したのか? も必
要な気がします。
 既にこれを含めて復元する方法があれば無視して下さい。

[ ]
RE:07397 マクロで範囲選択を維持してカーNo.07399
K'zawa さん 12/08/09 08:54
 
秀まるおさん、こんにちは。
K'zawaです。

> 当時の話の時は、BOX範囲選択してる文字列についての汎用的な処理が必要な
>のかなぁと思ったのですけども、要するには、範囲選択の状態を復元出来ればい
>いということで…。よく理解してなくてすみません。

いえいえ、こちらももう済んだ話として、忘れてることもありまして、
前の話ではそもそも、カーソル位置は範囲の内側か外側か、それとも幅がゼロか
というのがありまして、それが、特にCSV/TSVモードではわかりづらかったとい
うのがあります(それはもういいのですが)。
つまり、前の話は、範囲の復元以外にも、そのマクロ固有の問題等を含めて、
box選択は例外とするのが妥当な判断だったと思っています。

> さらにちょっと考えたんですが、追加するとしたら、
>
>   selstartx, selstarty
>
> を追加したらいいのかなぁと思いました。つまり、範囲選択を開始した位置の
>x,y座標が分かればいいかなぁと。

範囲選択状態の保存/復元のためには、これで十分だと思います。

> とにかくちゃんとマクロで範囲選択状態の保存/復元が出来る
ような、何らか
>のキーワード追加ってこと考えてみます。

よろしくお願いします。

[ ]
RE:07398 マクロで範囲選択を維持してカーNo.07400
K'zawa さん 12/08/09 10:39
 
Iranoanさん、こんにちは。
K'zawaです。

> これを正確にやるとすると、あと検索にヒットして範囲選択したのか? も必
>要な気がします。
> 既にこれを含めて復元する方法があれば無視して下さい。

これが何を意味しているのかは、ちょっと分からないのですが、
「選択した範囲内のみ」で検索しているときの、検索範囲は解除されてしまいま
すね。これはしかたないかな。

[ ]
RE:07400 マクロで範囲選択を維持してカーNo.07401
秀まるお さん 12/08/09 14:01
 
 selstartx, selstartyだと、selendx, selendyの反対の意味ととらえられてし
まう可能性があるので、名前を

 selopenx
 selopeny

 にします。範囲選択開始位置(カーソル位置の反対側)を返すって仕様になり
ます。

 サンプルマクロ:

    #x = x; #y = y;
    #selecting = selecting;
    #rectselecting = rectselecting;
    #selopenx = selopenx;
    #selopeny = selopeny;
    #selectionlock = selectionlock;

    if( selecting ) {
        escape;
    }
    //... カーソルを好きなように移動...

    if( #selecting ) {
  moveto #selopenx, #selopeny;
        if( #rectselecting ) {
            beginrect;
        } else {
            beginsel;
        }
        moveto #x, #y;
        if( #selectionlock == 0 ) {
            endsel;
        }
    } else {
        moveto #x, #y;
    }

[ ]
RE:07400 マクロで範囲選択を維持してカーNo.07402
秀まるお さん 12/08/09 14:03
 
 検索でヒットした文字列を範囲選択してる場合に、それを再現するって件、お
よび「選択した範囲内のみ」の復元の件は、とりあえず要望として現状必要性が
ある訳でも無いと思うので、今のところはやめとこうかと思います。

[ ]
RE:07402 マクロで範囲選択を維持してカーNo.07403
Iranoan さん 12/08/09 14:19
 
 秀まるおさん今日は、Iranoan です。
>  検索でヒットした文字列を範囲選択してる場合に、それを再現するって件、お
> よび「選択した範囲内のみ」の復元の件は、とりあえず要望として現状必要性が
> ある訳でも無いと思うので、今のところはやめとこうかと思います。
 了解です。

[ ]
RE:07401 マクロで範囲選択を維持してカーNo.07424
K'zawa さん 12/08/19 19:47
 
秀まるおさん、こんにちは。
K'zawaです。

行選択開始コマンドからの選択も考慮するとこんな感じでしょうかね。
(と、いちおう記録に残しておく)

// とにかく範囲選択を解除して、あとで元に戻すサンプル
    setcompatiblemode 0x0F;

    #x = x; #y = y;
    #selecting = selecting;
    if( #selecting ) {
        // 選択範囲の記録
        #rectselecting = rectselecting;
        #lineselecting = lineselecting;
        #selopenx = selopenx; #selopeny = selopeny;
        #selectionlock = selectionlock;

    // 行範囲選択開始行とselopenyの差
        if ( #lineselecting && #y < #selopeny && #selopenx == 0 ) {
            moveto #selopenx, #selopeny;
            if ( seltopy != selendy ) {
                #dy = -1;
            }
        }

        escape;
    }

    //... カーソルを好きなように移動...


    // 範囲選択を復元
    if( #selecting ) {
        moveto #selopenx, #selopeny + #dy;
        if( #rectselecting ) {
            beginrect;
        } else if( #lineselecting ) {
            beginlinesel;
        } else {
            beginsel;
        }
        moveto #x, #y;
        if( #selectionlock == 0 ) {
            endsel;
        }
    } else {
        moveto #x, #y;
    }

[ ]
RE:07424 マクロで範囲選択を維持してカーNo.07426
秀まるお さん 12/08/21 11:49
 
 すみません。そのマクロをこちらで動かしたら内部エラーが出てしまいました。
調べてみたら、バグってました。

 selopenxをif() { ... } の中で使うとダメでした。

 また修正させていただきます。

[ ]