カーソルがタブ文字を貫通する設定のときNo.36459
K'zawa さん 18/04/15 21:30
 
こんにちは、K'zawaです。

動作環境→高度な編集2→タブ文字の上にカーソル移動した時: 貫通する

に設定したとき、タブ文字の右の文字にカーソルを置き、BSキーをを押してもタブ文
字が消えないのですが。

[ ]
RE:36459 カーソルがタブ文字を貫通する設No.36460
秀丸担当 さん 18/04/16 08:36
 

タブ文字の上にカーソル移動した時が、貫通するの場合は確かにそうなっていて、初
期の頃からこういう仕様になっていました。
他にもDelteキーの削除もタブ文字の上でだけ消えて、タブ文字でない空間では消え
ないようになっています。
改行より後ろのフリーカーソルモードをONにしたときの位置での操作も同様になって
います。
ヘルプにも追記しておこうと思います。

[ ]
RE:36460 カーソルがタブ文字を貫通する設No.36461
K'zawa さん 18/04/16 13:29
 
秀丸担当さん、こんにちは。
K'zawaです。

タブ文字を貫通する場所ではなくて右の文字にカーソルがあるとき、左のタブ文字が
消えないのですが。

[ ]
RE:36461 カーソルがタブ文字を貫通する設No.36462
秀丸担当 さん 18/04/16 14:30
 

例えばタブの幅4で、タブ文字を">"で表して、以下のようになっているとします。

12345678
>  ABCD

タブの右にある文字というのがどこのことかわからないですが、5桁目のAのことだと
したら、カーソルは左に移動するだけで、タブ文字は削除されず、そういう仕様にな
っています。
2桁目の空間のことだとしたら、タブ文字は削除されるはずで、2桁目からの操作で削
除されなとしたらおかしいということになります。

[ ]
RE:36462 カーソルがタブ文字を貫通する設No.36463
K'zawa さん 18/04/16 15:10
 
秀丸担当さん、こんにちは。
K'zawaです。

秀丸リーダーのマクロが動くと消えないということらしいです。

[ ]
RE:36463 カーソルがタブ文字を貫通する設No.36464
秀丸担当 さん 18/04/16 17:17
 

秀丸リーダーに付属のHmReadBack.macを実行して確認してみたところ、確かにおかし
かったです。
以下のようになっているとして、3桁目の位置でBackSpaceを押すと、タブが消えずに
aが消えてしまいました。

12345678
a>  bcde

単純にマクロで、moveto x,y;とした場合、貫通する位置に留まる手段がマクロとし
て存在しないので、できていませんでした。
現状でなんとかするには、マクロではleftした後に元の位置に戻すためにmovetoをし
てしるので、movetoの代わりにrightにするマクロにするしかなさそうです。

例:
    #x1=x;
    #y1=y;
    left;
    #code = unicode;
    right;//元々はmoveto #x1, #y1;
     

---------------------

HmReadBack.macの全マクロは以下のようになります。
範囲選択によって処理が分けられているので、その点も変えています。
秀丸リーダの今後のバージョンで入れ替えるようにします。

    setcompatiblemode 0x0F;
    #sel = selecting;
    if( #sel ) {
        #rect = rectselecting;
        if( seltopx == selendx && ( seltopy == selendy || #rect != 0 ) ) {
            endmacro;
        } else if( #rect != 0 && seltopx >= linelen ) {
            endmacro;
        }
        if( x == selendx && y == selendy ) {
            #x1 = seltopx;
            #y1 = seltopy;
        } else if( x == seltopx && y == seltopy ) {
            #x1 = selendx;
            #y1 = selendy;
        } else if( x == seltopx && y == selendy ) {
            #x1 = selendx;
            #y1 = seltopy;
        } else {
            #x1 = seltopx;
            #y1 = selendy;
        }
        #x2 = x;
        #y2 = y;
        disabledraw;
        right;
        left;
        #beginsel = selecting;
        escape;
        moveto #x2, #y2;

        left;
        #code = unicode;
        moveto #x1, #y1;
    } else {
        #x1 = x;
        #y1 = y;

        left;
        #code = unicode;
        right;//moveto #x1, #y1;
    }

    if( #sel ) {
        if( #rect ) {
            beginrect;
        } else {
            beginsel;
        }
        moveto #x2, #y2;
        if( ! #beginsel ) {
            endsel;
        }
        enabledraw;
    }

    ddeinitiate "HidemaruReader", "Read";
    if( #code == 13 ) {
        ddeexecute "!かいぎょう";
    } else if( #code == 9 ) {
        ddeexecute "!タブ";
    } else if( #code == eof ) {
        ddeexecute "!ファイルのまつび";
    } else if( #code == 0 ) {
        ddeexecute "!ブランク";
    } else {
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;

[ ]
RE:36464 カーソルがタブ文字を貫通する設No.36465
秀まるお2 さん 18/04/16 18:22
 
 秀丸リーダーの方も一応バージョンアップしました。

 HmReadBack.macの修正版に入れ替えたバージョン番号を書き換えただけですけども。

https://hide.maruo.co.jp/software/bin/hmread304_signed.exe

[ ]
RE:36465 カーソルがタブ文字を貫通する設No.36466
K'zawa さん 18/04/16 23:07
 
秀まるおさん、こんにちは。
K'zawaです。

すいません、いったんVer3.04は公開中止してもらいたいんですが。
タブ文字貫通の設定はよくても他がだめになってます。

left;
#r = result;
#code = unicode;
if ( #r ) {
    right;
}

としないと、leftに失敗時、元の位置より右にいってしまいます。(そして違う文字
が消えます)
しかし、タブ文字の中を移動したときはresultが0なんで想定外にうまくいかないです。
なので別の方法で場合分けしないといけないんですが、多分分党と部分編集の先頭行
頭のときを別にすればいいんじゃないかと。で、今からテストしてみます。

それと某所でHmRead1.macのバグについての指摘もありまして。
それも精査中です。

[ ]
RE:36466 カーソルがタブ文字を貫通する設No.36467
秀まるお2 さん 18/04/17 08:51
 
 お手数かけてすみません。とりあえずV3.03に戻します。

 HmRead1.macの不備な点も、ご指摘いただけると助かりますが、何かおかしい現象
の再現方法などを教えていただければ、こちらでも調査できると思います。

[ ]
RE:36467 カーソルがタブ文字を貫通する設No.36468
K'zawa さん 18/04/18 13:46
 
秀まるおさん、こんにちは。
K'zawaです。

この件に関しては、末尾のマクロでどうでしょうか?

> HmRead1.macの不備な点も、ご指摘いただけると助かりますが、何かおかしい現象
>の再現方法などを教えていただければ、こちらでも調査できると思います。

右方向に選択中には左の文字を読むのができなくなっていました。
これには私が関わっているので、大変申し訳ないです。
原因と対策も分かっていまして、直したんですが、その期間の秀丸の新機能にも関連
ができてしまい、それにも対応しないといけないです。そうすると、それにあわせて
HmReadBackも直さなければならなくなり…ということになりますので、後で差し替え
提案として送付したいと思います。


// Backspace発音                        2009/04/07
// 秀丸エディタ Ver6.00以上/秀丸メール Ver4.80以上
// 2018.04.18 バグ修正。hidesoft.2:36459

    setcompatiblemode 0x0F;
    disabledraw;
    if( selecting ) {
        #rect = rectselecting;
        if( seltopx == selendx && ( seltopy == selendy || #rect != 0 ) ) {
            endmacro;
        } else if( #rect != 0 && seltopx >= linelen ) {
            endmacro;
        }
        if( x == selendx && y == selendy ) {
            #x1 = seltopx;
            #y1 = seltopy;
        } else if( x == seltopx && y == seltopy ) {
            #x1 = selendx;
            #y1 = selendy;
        } else if( x == seltopx && y == selendy ) {
            #x1 = selendx;
            #y1 = seltopy;
        } else {
            #x1 = seltopx;
            #y1 = selendy;
        }
        #x2 = x;
        #y2 = y;
        right;
        left;
        #beginsel = selecting;
        escape;
        moveto #x2, #y2;

        left;
        #code = unicode;
        moveto #x1, #y1;

        if( #rect ) {
            beginrect;
        } else {
            beginsel;
        }
        moveto #x2, #y2;
        if( ! #beginsel ) {
            endsel;
        }
    } else if ( x == 0 && ( y == 0 || y == rangeedittop ) ) {
        #code = unicode;
    } else {
        left;
        #code = unicode;
        right;//moveto #x1, #y1;
    }
    enabledraw;

    ddeinitiate "HidemaruReader", "Read";
    if( #code == 13 ) {
        ddeexecute "!かいぎょう";
    } else if( #code == 9 ) {
        ddeexecute "!タブ";
    } else if( #code == eof ) {
        ddeexecute "!ファイルのまつび";
    } else if( #code == 0 ) {
        ddeexecute "!ブランク";
    } else {
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;

[ ]
RE:36468 カーソルがタブ文字を貫通する設No.36469
K'zawa さん 18/04/18 14:49
 
K'zawaです。

秀丸メールのヘッダーで、まだ元の位置に戻れないケースがありました。
その対策もいれてみました。


// Backspace発音                        2009/04/07
// 秀丸エディタ Ver6.00以上/秀丸メール Ver4.80以上
// 2018.04.18(2) バグ修正。hidesoft.2:36459

    setcompatiblemode 0x0F;
    disabledraw;
    if( selecting ) {
        #rect = rectselecting;
        if( seltopx == selendx && ( seltopy == selendy || #rect != 0 ) )
{
            endmacro;
        } else if( #rect != 0 && seltopx >= linelen ) {
            endmacro;
        }
        if( x == selendx && y == selendy ) {
            #x1 = seltopx;
            #y1 = seltopy;
        } else if( x == seltopx && y == seltopy ) {
            #x1 = selendx;
            #y1 = selendy;
        } else if( x == seltopx && y == selendy ) {
            #x1 = selendx;
            #y1 = seltopy;
        } else {
            #x1 = seltopx;
            #y1 = selendy;
        }
        #x2 = x;
        #y2 = y;
        right;
        left;
        #beginsel = selecting;
        escape;
        moveto #x2, #y2;

        left;
        #code = unicode;
        moveto #x1, #y1;

        if( #rect ) {
            beginrect;
        } else {
            beginsel;
        }
        moveto #x2, #y2;
        if( ! #beginsel ) {
            endsel;
        }
    } else if ( x == 0 && ( y == 0 || y == rangeedittop ) ) {
        #code = unicode;
    } else {
        #x1 = x;
        #y1 = y;
        left;
        #code = unicode;
        right;
        if ( x == #x1 && y == #y1 ) moveto #x1, #y1;
    }
    enabledraw;

    ddeinitiate "HidemaruReader", "Read";
    if( #code == 13 ) {
        ddeexecute "!かいぎょう";
    } else if( #code == 9 ) {
        ddeexecute "!タブ";
    } else if( #code == eof ) {
        ddeexecute "!ファイルのまつび";
    } else if( #code == 0 ) {
        ddeexecute "!ブランク";
    } else {
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;

[ ]
RE:36469 カーソルがタブ文字を貫通する設No.36470
秀まるお2 さん 18/04/18 15:44
 
 マクロどうもです。

 秀丸エディタの担当の方でも直してるようで、それもふまえていろいろテストして
みます。

[ ]
RE:36470 カーソルがタブ文字を貫通する設No.36471
秀まるお2 さん 18/04/18 18:06
 
 テストしてみたんですが、そのマクロだと、肝心のタブ文字の貫通した所の上で
カーソルの動き方が仕様と違ってしまいますけど、それでいいのやら?

例えば、

12345678
>   ABCD

 のような感じ(">"は実際にはタブ文字)の、'A'よりも1つ前のタブ文字の貫通部
分にカーソルがある状態でHmReadBack.macを手作業で実行すると、カーソルがタブ文
字の所に移動してしまいます。あえてそういう仕様にしているのだとしても、秀丸
リーダーのBackspace/Deleteキーの音声化の設定が「削除される文字を音声化する」
だと、Backspaceキーでタブ文字の前の文字が削除されてしまうような気がします。
(そこまでテストしてませんが)

 一応、こちらでそこと、あとdisabledrawの所を手直しして、こんな風にしてみま
した。left命令が失敗してるかどうかを見るようにしてみました。

 left命令が失敗する例としては、タブ文字貫通の中のケースの他に、例えば秀丸
メールのヘッダの1行目の左端(ヘッダ名の先頭)にカーソルが位置する例とかがあ
りえます。他にも何らかの理由でleftが失敗する可能性があるかもしれないと思いま
した。



// Backspace発音                        2009/04/07
// 秀丸エディタ Ver6.00以上/秀丸メール Ver4.80以上
// 2018.04.18(2) バグ修正。hidesoft.2:36459

    setcompatiblemode 0x0F;
    if( selecting ) {
        #rect = rectselecting;
        if( seltopx == selendx && ( seltopy == selendy || #rect != 0 ) ) {
            endmacro;
        } else if( #rect != 0 && seltopx >= linelen ) {
            endmacro;
        }
        if( x == selendx && y == selendy ) {
            #x1 = seltopx;
            #y1 = seltopy;
        } else if( x == seltopx && y == seltopy ) {
            #x1 = selendx;
            #y1 = selendy;
        } else if( x == seltopx && y == selendy ) {
            #x1 = selendx;
            #y1 = seltopy;
        } else {
            #x1 = seltopx;
            #y1 = selendy;
        }
        #x2 = x;
        #y2 = y;
        disabledraw;
        right;
        left;
        #beginsel = selecting;
        escape;
        moveto #x2, #y2;

        left;
        #code = unicode;
        moveto #x1, #y1;

        if( #rect ) {
            beginrect;
        } else {
            beginsel;
        }
        moveto #x2, #y2;
        if( ! #beginsel ) {
            endsel;
        }
        enabledraw;
    } else if ( x == 0 && ( y == 0 || y == rangeedittop ) ) {
        #code = unicode;
    } else {
        left;
        #leftsuccess = result;
        #code = unicode;
        if( #leftsuccess == yes || #code == 9 ) {       //タブ文字の貫通上だ
とleftのresultが正しくない。
            right;
        }
    }

    ddeinitiate "HidemaruReader", "Read";
    if( #code == 13 ) {
        ddeexecute "!かいぎょう";
    } else if( #code == 9 ) {
        ddeexecute "!タブ";
    } else if( #code == eof ) {
        ddeexecute "!ファイルのまつび";
    } else if( #code == 0 ) {
        ddeexecute "!ブランク";
    } else {
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;

[ ]
RE:36471 カーソルがタブ文字を貫通する設No.36472
K'zawa さん 18/04/18 23:34
 
秀まるおさん、こんにちは。
K'zawaです。

>でHmReadBack.macを手作業で実行すると、カーソルがタブ文字の所に移動してしま
>います。あえてそういう仕様にしているのだとしても、秀丸リーダーのBackspace/D
>eleteキーの音声化の設定が「削除される文字を音声化する」だと、Backspaceキー
>でタブ文字の前の文字が削除されてしまうような気がします。(そこまでテストし
>てませんが)

確かにその通りでした。なにか間違えたようです。

> 一応、こちらでそこと、あとdisabledrawの所を手直しして、こんな風にしてみま
>した。left命令が失敗してるかどうかを見るようにしてみました。

選択してないときのカーソルが動くのも見えないようにしたほうがいいのかなと思っ
て外側でdisabledrawにしてみたんですけど、気にならない程度なんですかね?(私
は見えないのでどっちでもいいんですが)

> left命令が失敗する例としては、タブ文字貫通の中のケースの他に、例えば秀丸
>メールのヘッダの1行目の左端(ヘッダ名の先頭)にカーソルが位置する例とかが
>ありえます。他にも何らかの理由でleftが失敗する可能性があるかもしれないと思
>いました。

>    } else if ( x == 0 && ( y == 0 || y == rangeedittop ) ) {

ここなんですが、

    } else if ( x == 0 && ( y == 0 || y == rangeedittop || lineno == 0 ) ) {

としたほうが統一できてよいみたいです。

[ ]
RE:36472 カーソルがタブ文字を貫通する設No.36473
K'zawa さん 18/04/19 13:35
 
K'zawaです。

>確かにその通りでした。なにか間違えたようです。

一応間違ったところを書いておくと、

誤  if ( x == #x1 && y == #y1 ) moveto #x1, #y1;
正  if ( x != #x1 || y != #y1 ) moveto #x1, #y1;

条件がまったく逆でした。

>> left命令が失敗する例としては、タブ文字貫通の中のケースの他に、例えば秀丸
>メールのヘッダの1行目の左端(ヘッダ名の先頭)にカーソルが位置する例とかが
>ありえます。他にも何らかの理由でleftが失敗する可能性があるかもしれないと思
>いました。
>
>>    } else if ( x == 0 && ( y == 0 || y == rangeedittop ) ) {
>
>ここなんですが、
>
>    } else if ( x == 0 && ( y == 0 || y == rangeedittop || lineno == 0 ) ) {
>
>としたほうが統一できてよいみたいです。

タブ貫通のところとなんらかの原因でleftに失敗する以外は、上の else ifブロック
に振り分けられるので、elseブロックではほぼタブ貫通の心配だけすればよいと思い
ます。
なのでresultをチェックする方法でも、元のx,y位置に戻ってなかったらmovetoする
でも同じ結果になると思います。(なんらかの原因でずれるさえ出てこなければです
が)


ところで、HmReadBackに限った話ではなくマクロ全般のこととして、タブ貫通でタブ
文字が行頭にある時、「xが0だからカーソルは行頭にいる」が成立しなくなるので
ちょっと困ってしまいます。

[ ]
RE:36473 カーソルがタブ文字を貫通する設No.36474
秀まるお2 さん 18/04/19 15:48
 
 念のためその判定も入れるようにしてみます。

    } else {
        #x1 = x;
        #y1 = y;
        left;
        #leftsuccess = result;
        #code = unicode;
        if( #leftsuccess == yes || #code == 9 ) {       //タブ文字の貫通上だ
とleftのresultが正しくない。
            right;
        }
        if( x != #x1 || y != #y1 ) moveto #x1, #y1;     //念のため
    }

> ところで、HmReadBackに限った話ではなくマクロ全般のこととして、タブ貫通でタ
>ブ文字が行頭にある時、「xが0だからカーソルは行頭にいる」が成立しなくなるの
>でちょっと困ってしまいます。

 タブ貫通のケースはマクロのxやyのキーワードでは想定してなかったようでして、
もしちゃんと対応するとしたら、何らかの別のキーワードが必要かもしれません。

[ ]
RE:36474 カーソルがタブ文字を貫通する設No.36481
秀丸担当 さん 18/04/20 09:20
 

V8.81β6で貫通したときでも位置がわかるxviewキーワードを追加してみました。
対応する位置はmovetoviewで移動できます。え

[ ]
RE:36481 カーソルがタブ文字を貫通する設No.36485
K'zawa さん 18/04/20 16:46
 
秀丸担当さん、こんにちは。
K'zawaです。

h2:36481| RE 36474 カーソルがタブ文字を貫通する設定のときのBS
>V8.81β6で貫通したときでも位置がわかるxviewキーワードを追加してみました。
>対応する位置はmovetoviewで移動できます。

ありがとうございます。

[ ]
RE:36485 カーソルがタブ文字を貫通する設No.36490
秀まるお2 さん 18/04/25 13:12
 
 秀丸リーダーのVersion 3.04ですが、HmReadBack.macだけ差し替えてまたアップ
ロードしました。

 バージョン番号はそのままですけども。

[ ]
RE:36490 カーソルがタブ文字を貫通する設No.36491
K'zawa さん 18/04/25 13:48
 
秀まるおさん、こんにちは。
K'zawaです。

> 秀丸リーダーのVersion 3.04ですが、HmReadBack.macだけ差し替えてまたアップ
>ロードしました。
>
> バージョン番号はそのままですけども。

連絡が遅れて申し訳ありません。HmRead1のほうは一筋縄ではいきませんでした。
後で別スレッドで説明したいと思います。

[ ]