leftと選択範囲の開始位置についてNo.09530
styth さん 21/09/04 16:05
 
#seltopx = seltopx;
#seltopy = seltopy;
#selendx = selendx;
#selendy = selendy;

moveto #seltopx, #seltopy;
message str(#seltopx);
message str(x);
//if ( x >= 1 ) left;
left;
message str(x);

 適当なファイルで、選択範囲を作っておいて、上記マクロを実行します。
 messageで表示される数字が同じになります。
 leftで、選択範囲の開始位置の左に行きたいのですが、使い方が違っています
でしょうか?

[ ]
RE:09530 leftと選択範囲の開始位置についNo.09531
styth さん 21/09/04 16:22
 
 自分で読んでみて、誤解があると恐縮ですので、言い方を変えます。

 leftで、選択範囲の開始位置の左にカーソルを持って行きたいのですが、使い
方が違っていますでしょうか?
 選択範囲は崩れても構いません。

[ ]
RE:09531 leftと選択範囲の開始位置についNo.09532
h-tom さん 21/09/04 17:08
 
h-tom です。

> leftで、選択範囲の開始位置の左にカーソルを持って行きたいのですが、使い
>方が違っていますでしょうか?
> 選択範囲は崩れても構いません。
範囲選択を解除してから、開始位置に移動して「left」すればいいのでは?

[ ]
RE:09532 leftと選択範囲の開始位置についNo.09533
styth さん 21/09/04 18:01
 
>範囲選択を解除してから、開始位置に移動して「left」すればいいのでは?
 できました。

 こういう使い方が、仕様なんでしょうか?
 範囲選択を解除(escape)しなくても、移動できるようにして頂けないでしょ
うか? >秀丸担当者様

[ ]
RE:09533 leftと選択範囲の開始位置についNo.09534
h-tom さん 21/09/04 18:22
 
h-tom です。

> こういう使い方が、仕様なんでしょうか?
マクロを使わないで範囲選択を行い、矢印キーでカーソルを右か左へ一回移動させて、
どうなるか観察してみましょう。

[ ]
RE:09534 leftと選択範囲の開始位置についNo.09535
styth さん 21/09/04 19:05
 
>マクロを使わないで範囲選択を行い、矢印キーでカーソルを右か左へ一回移動させ
>て、どうなるか観察してみましょう。
 選択範囲は自動的に解除され、カーソルは選択範囲の最後から1左にずれました。
 自分が最初に提示したマクロは、手動でやれば、選択範囲の開始位置にカーソ
ルを移動してから、leftということなんですが、何か間違っているんでしょう
か?

[ ]
RE:09535 leftと選択範囲の開始位置についNo.09536
h-tom さん 21/09/04 21:48
 
h-tom です。

>>マクロを使わないで範囲選択を行い、矢印キーでカーソルを右か左へ一回移動させ
>て、どうなるか観察してみましょう。
> 選択範囲は自動的に解除され、カーソルは選択範囲の最後から1左にずれました。
こちらと状況が違いますね。

11111abcdef22222

上記内容で、「abcdef」を選択し、矢印キーで左にカーソル移動させると、
範囲選択が解除され、範囲選択の先頭("11111"と"abcdef"の間)にカーソルが移動し
ます。
(右の場合は、範囲選択の最後("abcdef"と"22222"の間)に移動)

つまり範囲選択状態から右か左にカーソルを移動させると、範囲選択が解除され、範
囲選択の先頭か末尾にカーソル移動します。
だから「範囲選択を解除してから移動」ということです。

[ ]
RE:09536 leftと選択範囲の開始位置についNo.09537
styth さん 21/09/05 04:28
 
11111abcdef22222
33333abcdef44444

 最初に例を挙げれば、良かったのかもしれません。
 自分の場合は、選択範囲は2行で、22222〜33333、です。

[ ]
RE:09537 leftと選択範囲の開始位置についNo.09538
秀まるお2 さん 21/09/05 08:36
 
 範囲選択を動かしたい場合は、beginselとendselを使えばいいはずです。マクロと
してはこんな風でいいんじゃないかと思います。

#seltopx = seltopx;
#seltopy = seltopy;
#selendx = selendx;
#selendy = selendy;

moveto #selendx, #selendy;      //選択終了位置にカーソル移動。
                                //(この時点では範囲選択がいったん解除される)
beginsel;                       //範囲選択開始
moveto #seltopx, #seltopy;      //反戦宅開始位置にカーソル移動。選択したまま。
left;                           //左に1文字分移動(範囲選択したまま)
endsel;                         //範囲選択のロックを解除。
                                 //(Shift+カーソル移動したのと同じ状態にする)

[ ]
RE:09538 leftと選択範囲の開始位置についNo.09539
秀まるお2 さん 21/09/05 08:40
 
 誤字がありました。失礼しました。

   反戦宅開始位置  --> 範囲選択開始位置

 です。

[ ]
RE:09538 leftと選択範囲の開始位置についNo.09540
styth さん 21/09/05 08:53
 
> 範囲選択を動かしたい場合は、beginselとendselを使えばいいはずです。マクロ
>としてはこんな風でいいんじゃないかと思います。


 やりたいことは、冒頭で申し上げましたが、
> leftで、選択範囲の開始位置の左にカーソルを持って行きたいのですが、使い
>方が違っていますでしょうか?
> 選択範囲は崩れても構いません。

 要望(お願い)としては、
> 範囲選択を解除(escape)しなくても、移動できるようにして頂けないでしょ
>うか?
 です。
 よろしくお願いいたします。

[ ]
RE:09537 leftと選択範囲の開始位置についNo.09541
h-tom さん 21/09/05 09:25
 
h-tom です。
>11111abcdef22222
>33333abcdef44444
>
> 最初に例を挙げれば、良かったのかもしれません。
> 自分の場合は、選択範囲は2行で、22222〜33333、です。
改行をまたいでいると動作が変わるパターンでしたか。

マクロの場合は、以下の行で範囲選択開始位置により動作が変わる事になるので、範
囲選択を解除した方が無難ですよ。
> moveto #seltopx, #seltopy;
・"22222"側から選択した場合は、同一行にある幅ゼロの範囲選択。
・"33333"側から選択した場合は、変化無し。

> left;
・"22222"側から選択した場合は、範囲選択が解除されるだけ。
・"33333"側から選択した場合は、範囲選択が解除して移動。

[ ]
RE:09540 leftと選択範囲の開始位置についNo.09544
Iranoan さん 21/09/05 16:53
 
styth さんこんにちは Iranoan です
>  要望(お願い)としては、
> > 範囲選択を解除(escape)しなくても、移動できるようにして頂けないでしょ
> >うか?
>  です。
については、秀丸おさんのサンプルマクロのあるとおり、
> beginsel;                       //範囲選択開始
<snip>
> endsel;                         //範囲選択のロックを解除。
なので、beginsel をした後で endsel, escape をしないでカーソル移動すれば、範
囲選択は解除されません

このあたりの動作は、[Shift] を押しながらのカーソル移動に当たる方法がないこと
を除けば、マクロの通常の操作は基本同じです
> 適当なファイルで、選択範囲を作っておいて、上記マクロを実行します。
の範囲選択を styth さんが
・どんな手順で行ったことを前提とするのか?
・本来に何をしたい (何のためにxの値を知りたい) のか?
によって方法が変わってくると思います

[ ]
RE:09544 leftと選択範囲の開始位置についNo.09545
styth さん 21/09/05 19:09
 
\t\taaa
\t\tbbb
(\tはタブ)

 上記2行全体を選択している時は、行頭に//を入れたい。
 \tとaaaの間が開始位置で、終わりの位置が2行目のどこかににかかる時は、
\t\tの後に//を入れたい(2行とも)、というマクロを作っています。
 なので、

moveto #seltopx, #seltopy;
if ( x >= 1 ) left;
if (( code == 0x09 ) && ( gettext(#seltopx,#seltopy,#seltopx+1,#seltopy, 1)
 != "\t" )) {

 としたのですが、leftが効かないので、leftの前後でmessageを入れて、カーソル
が動いているか確認しました。
 動いていないことが分かったので、質問しました。

 moveto #seltopx, #seltopy;の前では、マクロでは、beginselは、していません。
 マクロ実行前に、手動で範囲選択しておいて、マクロを動かしています。

 moveto #seltopx, #seltopy; で、選択範囲は、自動的に解除されないのでしょう
か?
 個人的には、moveto で、自動的に範囲解除でも問題ないと思います。
 movetoは、マウスでカーソルを動かす様な感じがあるので、
、No.09533 で、

>>範囲選択を解除してから、開始位置に移動して「left」すればいいのでは?
> できました。
> こういう使い方が、仕様なんでしょうか?
> 範囲選択を解除(escape)しなくても、移動できるようにして頂けないでしょ
>うか? >秀丸担当者様

 と、投稿しました。
(こんなにスレッドが長くなるとは、思いませんでした。すみません。)

[ ]
RE:09545 leftと選択範囲の開始位置についNo.09549
Iranoan さん 21/09/05 21:53
 
styth さんこんにちは Iranoan です
> \t\taaa
> \t\tbbb
> (\tはタブ)
>
>  上記2行全体を選択している時は、行頭に//を入れたい。
>  \tとaaaの間が開始位置で、終わりの位置が2行目のどこかににかかる時は、
> \t\tの後に//を入れたい(2行とも)、というマクロを作っています。
これはコメント・アウトしたいんですよね
それなら、ググると幾つか見つかるので気に入ったものを使うという手も有るかと思
います
また矩形選択を使って入力したほうが手っ取り早いかもしれません

>  上記2行全体を選択している時は、行頭に//を入れたい。
>  \tとaaaの間が開始位置で、終わりの位置が2行目のどこかににかかる時は、
をしたい場合も、left は設定によっては行をまたがるので、moveto, moveto2, move
tolineno の何れかで指定したほうが良いと思います

またカーソル移動せずに、
・行全体なら、seltopcolumn, selendcolumn の値で判定
・そうでないときは、更に gettext(), gettext2() と ascii() で文字コード
で調べれば良いと思います

具体例は
>  \tとaaaの間が開始位置
以外のときはどうするのか?
> \t\tの後に//を入れたい(2行とも)、というマクロを作っています。
については、2行目の行頭がタブ文字でないときはどうするのか?
が解らないので書けません

[ ]
RE:09549 leftと選択範囲の開始位置についNo.09553
styth さん 21/09/06 17:35
 
>具体例は
>>  \tとaaaの間が開始位置
>以外のときはどうするのか?
>> \t\tの後に//を入れたい(2行とも)、というマクロを作っています。
>については、2行目の行頭がタブ文字でないときはどうするのか?
>が解らないので書けません
 何とか自力で書けました。お気遣いありがとうございます。

[ ]
RE:09533 秀丸担当者様のご見解をお聞かせNo.09554
styth さん 21/09/06 17:50
 
>>範囲選択を解除してから、開始位置に移動して「left」すればいいのでは?
> できました。

> こういう使い方が、仕様なんでしょうか?
> 範囲選択を解除(escape)しなくても、移動できるようにして頂けないでしょ
>うか? >秀丸担当者様

 普通にmovetoを使っていると、escapeしなくて、選択範囲は解除されてしまう
ような気がします。
 なので、マクロの先頭に、

#x = x;
#y = y;
#seltopx = seltopx;
#seltopy = seltopy;
#selendx = selendx;
#selendy = selendy;
#selecting = selecting;

 として、解除されるたびに、
 beginsel〜endselを実施しているんですが、escapeしない限り選択範囲は解除
されないということでも、ないと思います。

 ご見解をお聞かせ下さい。よろしくお願いいたします。

[ ]
RE:09554 秀丸担当者様のご見解をお聞かせNo.09555
h-tom さん 21/09/06 20:11
 
h-tom です。

> 普通にmovetoを使っていると、escapeしなくて、選択範囲は解除されてしまう
>ような気がします。
気のせいでしょう。
movetoで選択範囲が解除されるなら、以下のマクロで範囲選択が広がらないって事で
すよ。

beginsel;
moveto x+10,y;
endmacro;

[ ]
RE:09538 leftと選択範囲の開始位置についNo.09556
ラフ さん 21/09/06 22:44
 
どれにレスしようか迷ったけど

> 範囲選択を動かしたい場合は、beginselとendselを使えばいいはずです。マクロ
>としてはこんな風でいいんじゃないかと思います。
範囲選択を動かしたいわけではないと思います。

stythさんの最初の投稿で言いたいことは、選択範囲の先頭にmovetoした後のleftが
範囲解除のみでカーソル移動しないのは仕様なのか?バグなのか?
ってことだと思います。
範囲選択の最後にmovetoしてrightした場合は、範囲解除したうえで右に移動します。
つまりこの二つの事象の整合性が取れていないのでどちらかがバグかな。
整合性の取れない仕様が悪いとも言えないけど。

[ ]
RE:09530 leftと選択範囲の開始位置についNo.09557
ラフ さん 21/09/06 22:49
 
> messageで表示される数字が同じになります。
> leftで、選択範囲の開始位置の左に行きたいのですが、使い方が違っています
>でしょうか?
バグなら直してくれるでしょう。
仕様なら、もう一つleftすればOKです。

[ ]
RE:09555 秀丸担当者様のご見解をお聞かせNo.09558
styth さん 21/09/06 23:02
 
>> 普通にmovetoを使っていると、escapeしなくて、選択範囲は解除されてしまう
>>ような気がします。
>気のせいでしょう。
 補足します。
 前提として、手動で範囲選択しておいて、からマクロを実行して、その中で
「普通にmovetoを使っていると、escapeしなくて、選択範囲は解除されてしまう
ような気がします。」

>movetoで選択範囲が解除されるなら、以下のマクロで範囲選択が広がらないって事
>ですよ。
>beginsel;
>moveto x+10,y;
>endmacro;
 確かにそうですが、これは、上記の条件には、当たりません。

 スレッドの最上部で、申し上げた通り、
>適当なファイルで、選択範囲を作っておいて、上記マクロを実行します。
 です。私が言っている「選択範囲」はあくまで、マクロを実行する前の、手動
で作った(選択した)範囲です。

[ ]
RE:09556 leftと選択範囲の開始位置についNo.09559
styth さん 21/09/06 23:35
 
ラフさん、コメント、ありがとうございます。

>> 範囲選択を動かしたい場合は、beginselとendselを使えばいいはずです。マクロ
>としてはこんな風でいいんじゃないかと思います。
>範囲選択を動かしたいわけではないと思います。
 その通りです。

>stythさんの最初の投稿で言いたいことは、選択範囲の先頭にmovetoした後のleftが
>範囲解除のみでカーソル移動しないのは仕様なのか?バグなのか?
>ってことだと思います。
 その通りです。

[ ]
RE:09558 秀丸担当者様のご見解をお聞かせNo.09560
h-tom さん 21/09/07 06:39
 
h-tom です。

> です。私が言っている「選択範囲」はあくまで、マクロを実行する前の、手動
>で作った(選択した)範囲です。
手動で選択したという事は、マクロ実行時は「範囲選択中」ですよね?
明示的に「範囲選択を終了」していない状態でmoveto使ってカーソル動かして、
「範囲選択」が勝手に解除されるなら、バグでしょう。

# まぁ、endsel しても、movetoでカーソル動かすと選択範囲は動いてしまうけどね。

[ ]
RE:09560 秀丸担当者様のご見解をお聞かせNo.09561
秀丸担当 さん 21/09/07 08:36
 

回答が遅れて申し訳ありません。

範囲選択時の左右キーあるいはleft;やright;は、昔からずっとある仕様としては、
範囲選択が複数行かどうかによって違っていました。
一行内の選択の場合、範囲選択の先頭または末尾にカーソル移動して、範囲選択を解
除します。
複数行の選択の場合、カーソル位置はそのままに範囲選択を解除して、カーソル左右
移動します。
V8.13(V8.20β6相当)のときに仕様変更があって、折り返しをまたいだ単語を選択し
ているような場合は同一行とみなすような、ちょっとややこしい判定になっています。
V8.13より前は、改行を含まなくても、折り返しをまたいだ選択の場合は複数行とみ
なしていました。
一貫性が無くて良くないと思いますが、従来からある操作などの配慮などから、変更
が難しい状態になってしまっています。

範囲選択された状態でのleftで常に左移動とするのは、変更すると良くないと思うの
で、escapeするようにしてほしいです。

movetoで範囲選択が解除されるかどうかについては、解除されないはずだと思います。
もし解除されることがあるとしたらバグかもしれませんが、再現できなくてわからな
いです。
再現できるマクロがあると助かります。

[ ]
RE:09561 秀丸担当者様のご見解をお聞かせNo.09562
styth さん 21/09/07 09:31
 
>範囲選択された状態でのleftで常に左移動とするのは、変更すると良くないと思う
>ので、escapeするようにしてほしいです。
 承知しました。

>movetoで範囲選択が解除されるかどうかについては、解除されないはずだと思います。
 こちらについても、承知しました。

[ ]
RE:09562 秀丸担当者様のご見解をお聞かせNo.09563
秀丸担当 さん 21/09/08 09:12
 

行内かどうか等による動作の違いは、動作環境にオプションを追加しようと思います。
必ず移動したいという動作とは逆になってしまいますが、多くのアプリでは選択の先
頭/末尾に移動するのが一般的なので、必ず選択の先頭/末尾に移動するオプションに
しようかと思います。
オプションを変更しなければ従来通りで、マクロも従来通りで、マクロはsetcompati
blemodeで動作を指定できるようにします。

[ ]