秀丸リーダーの読み上げマクロについてNo.36493
K'zawa さん 18/04/25 23:35
 
こんにちは、K'zawaです。

秀丸リーダーの読み上げマクロのHmRead1.macは、現在、選択中のカーソルは選択範
囲に含まれず、左の文字がふくまれている状態でもカーソル位置の文字を読み上げま
す。
スクリーンリーダーはこのようなとき、左の文字を読み上げるのが普通です。
ずっと前のマクロはできていました。
それを復活させると、HmReadBack.macと同様、選択中にはいったん解除しなければな
らない場面があります。
しかし、以前とは違って行選択や複数選択などが新たに加わっています。
複数選択はいったん解除してしまうと、マクロ実行直前の状態に戻すのは困難です。
なので複数選択時には左の文字を読み上げるべきときでも無視してカーソル位置を読
み上げるようにしてみました。
ところが実際に使ってみると、そういう場面に出くわすと、どこまで選択しているの
かわからなくなって混乱してしまいました。

読み上げマクロの中で、選択を解除して復元するというやり方は、もうむりがあるの
ではないでしょうか?
複雑になりすぎて、読み上げマクロ本来の目的から外れたところで肥大化してしまい
ます。
また、新しい選択コマンドができると、それをマクロに組み込まないとその機能を使
えない、マクロが邪魔をして別の選択に変えてしまうことになります。

問題なのは、up,down,left,right文で選択が解除されてしまう場合がある点です。
秀丸エディタ本体の動きとして、Shift+矢印キーでカーソル移動しても選択が解除さ
れてしまうことはないように思います。
それがマクロでもできれば、ずいぶん楽になります。
選択中だからこそカーソルがいられる場所や、選択中には行けない場所もあるので。

いかがでしょうか?


以下は現状でできることをやったマクロです。

V3.04との違い

HmRead1/HmRead2/HmreadBack
カスタマイズ用のヒントが何もないので、とりあえずコメントを入れてみた。

HmRead1/HmReadBack
文字コード取得部分をサブルーチン化した。
複数選択が解除されないようにした。
行選択開始コマンドによる選択に対応した。
通常の選択と行選択のときの削除/BSではseltopx,seltopy位置の文字を読み上げる
ようにした。

HmRead1
カーソル位置の文字は選択されていなくて左の文字は選択されている状態のとき、左
の文字を読み上げるようにした。(複数選択は除く)(BOX選択開始(複数選択化)コ
マンドで選択ロック状態の場合はできるようになった)


hMRead1

// 1文字発音                           2009/04/07
// 秀丸エディタ Ver8.71以上/秀丸メール Ver6.72以上(複数選択系のバグ修正が
なされた)
// 2018.4.25 範囲選択時、カーソル位置の左まで選択されるときは左の文字を読む
のがだめになっていたのを復活。複数選択対応など

    setcompatiblemode 0x0F; // マクロの互換性の指示
    #del = iskeydown( 0x2E );   // Deleteキーがおされているかどうかの値
    if ( rectselecting ) {  // BOX選択のとき
        call GetCharCode_Rect;  // BOX選択専用の文字コード取得サブルーチンへ
    } else {
        call GetCharCode;   // 文字コード取得サブルーチンへ
    }
    #code = ##return;   // サブルーチンからの戻り値(文字コード)

    // 発音処理
    ddeinitiate "HidemaruReader", "Read";   // 秀丸リーダーと通信開始
    if ( #del && multiselecting ) { // 複数選択で削除のとき
        ddeexecute "-!複数範囲削除";
    } else if ( #del && rectselecting ) {   // 複数選択で削除のとき
        ddeexecute "-!ボックス削除";
    } else if( #code == 13 ) {  // 改行文字のとき
        ddeexecute "!かいぎょう";
    } else if( #code == 9 ) {   // タブ文字のとき
        ddeexecute "!タブ";
    } else if( #code == eof ) { // ファイル末尾のとき
        ddeexecute "!ファイルのまつび";
    } else if( #code == 0 ) {   // 開業や[EOF]より右にカーソルがあるとき
        ddeexecute "!ブランク";
    } else {    // それ以外の普通の文字のとき
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;   // 秀丸リーダーとの通信終了
    endmacro;   // マクロ終わり

GetCharCode:    // 文字コード取得サブルーチン
    if (
    ( ! selecting ) // 範囲選択 してないとき
    || ( multiselecting )   // 複数選択のとき(範囲選択解除してしまうと元通り
にできないのでカーソルイチとする)
    || ( seltopx == selendx && seltopy == selendy ) // 幅0の選択範囲
        || ( seltoplineno > 0 && seltopcolumn == selendcolumn && seltoplinen
o == selendlineno ) // 折り返し位置で幅0(golineend3からShift+右矢印した状態
含む)
    || ( x == seltopx && y == seltopy ) // カーソル位置がseltop*側のとき、
カーソル移動の必要なし
    ) {
        return unicode; // カーソル位置の文字コードを返して戻る
    }

    // カーソル位置が選択範囲外で、左が範囲内の一文字以上選択している通常選
択または行選択のとき
    disabledraw;    //描画禁止
    ##selectionlock = selectionlock;    // 選択ロック状態かどうか
    ##x = x; ##y = y;   // 現在のカーソル位置
    if ( ! ##selectionlock ) {  // 選択ロック状態ではないとき
        ##selopenx = selopenx; ##selopeny = selopeny;   // 選択開始位置
        ##lineselecting = lineselecting;    // 行選択開始コマンドでの選択か
どうか
        escape; // 選択解除
        // 選択ロック状態で復元
        moveto ##selopenx, ##selopeny;  // 選択開始位置へ移動
        if ( ##lineselecting ) beginlinesel;    // 行選択開始
        else beginsel;  // 通常の選択開始
    }

    if ( ! #del ) { // 削除ではないとき
        moveto ##x, ##y;    // 元のカーソル位置に移動
        left;   // 左へ移動
    }
    ##code = unicode;   // カーソル位置の文字コードを取得
    moveto ##x, ##y;    // 元のカーソル位置に移動
    if ( ! ##selectionlock ) endsel;    // 元々選択ロック状態ではなかったと
きendselする
    enabledraw; // 描画再開
    return ##code;  // 取得した文字コードを返して戻る

GetCharCode_Rect:   // BOX選択専用の文字コード取得サブルーチン
    if ( #del ) {   // (BOX)削除のとき
        return unicode; // (使わないけど)カーソル位置の文字コードを返して戻る
    }

    if ( multiselecting && selectionlock == 0 ) {   // 複数選択で選択ロック
ではないとき
        return unicode; // カーソル位置の文字コードを返して戻る
    }

    // 必要な情報を記憶
    ##selopenx = selopenx; ##selopeny = selopeny;   // 選択開始位置
    ##x = x; ##y = y;   // 現在のカーソル位置
    ##selectionlock = selectionlock;    // 選択ロック状態かどうか
    ##multiselecting = multiselecting;  // 複数選択かどうか

    // カーソル行の中に限った範囲選択の左側のx値を得る
    disabledraw;    //描画禁止
    tomultiselect;  // 複数選択化(カーソルによるせんたくはカーソル行だけに
なる)
    ##leftx = seltopx;  // 選択の左側x値

    // BOX選択の復元
    escape; // 選択解除
    moveto ##selopenx, ##selopeny;  // 選択開始位置へ移動
    if ( ##multiselecting ) beginrectmulti; // BOX選択開始(複数選択化)
    else beginrect; // BOX選択開始
    moveto ##x, ##y;    // 元のカーソル位置に移動

    if ( ##x > ##leftx ) {  // ##xが大きいとき(カーソル位置は選択範囲にふく
まれない)
        left;   // 左へ移動
    }
    ##code = unicode;   // カーソル位置の文字コードを取得
    moveto ##x, ##y;    // 元のカーソル位置に移動
    if ( ! ##selectionlock ) endsel;    // 元々選択ロック状態ではなかったと
きendselする
    enabledraw; // 描画再開
    return ##code;  // 取得した文字コードを返して戻る


HmRead2

// 1行発音                             2009/04/07
// 秀丸エディタ Ver8.71以上/秀丸メール Ver6.72以上
// 2018.4.25 コメントを入れた

    setcompatiblemode 0x0F; // マクロの互換性の指示
    ddeinitiate "HidemaruReader", "Read";   // 秀丸リーダーと通信開始
    if( linelen == 0 ) {    // 行の長さが0のとき
        $str = "くうぎょう";
    } else {
        $str = gettext( 0, y, linelen, y, 1 );  // 1行の文字列を取得
    }
    ddeexecute "!" + $str;  // 取得した文字列を読み上げる
    ddeterminate;   // 秀丸リーダーとの通信終了


HmReadBack

// Backspace発音                        2009/04/07
// 秀丸エディタ Ver8.71以上/秀丸メール Ver6.72以上
// 2018.4.25 複数選択対応など

    setcompatiblemode 0x0F; // マクロの互換性の指示
    call GetCharCode;   // 文字コード取得サブルーチンへ
    #code = ##return;   // 戻り値を保存

    // 発音処理
    ddeinitiate "HidemaruReader", "Read";   // 秀丸リーダーと通信開始
    if ( multiselecting ) { // 複数選択のとき
        ddeexecute "-!複数範囲削除";
    } else if ( rectselecting ) {   // BOX選択のとき
        ddeexecute "-!ボックス削除";
    } else if ( #code == 13 ) { // 改行文字のとき
        ddeexecute "!かいぎょう";
    } else if ( #code == 9 ) {  // タブ文字のとき
        ddeexecute "!タブ";
    } else if ( #code == eof ) {    // ファイル末尾のとき
        ddeexecute "!ファイルのまつび";
    } else if ( #code == 0 ) {  // 開業や[EOF]より右にカーソルがあるとき
        ddeexecute "!ブランク";
    } else {    // それ以外の普通の文字のとき
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;   // 秀丸リーダーとの通信終了
    endmacro;   // マクロ終わり

GetCharCode:    // 文字コード取得サブルーチン
    if ( selecting ) {  // 範囲選択のとき
        if ( multiselecting || rectselecting ) {    // 複数選択またはBOX選択
のとき
            return unicode; // (使わないけど)カーソル位置の文字コードを返
して戻る
        }

        if ( seltopx == selendx && seltopy == selendy ) {   // 範囲が0幅のとき
            endmacro;   // マクロ終了
        }

        if ( x == seltopx && y == seltopy ) {   // カーソル位置がseltop*側の
とき、カーソル移動の必要なし
            return unicode; // カーソル位置の文字コードを返して戻る
        }

    // 必要な情報を記憶
        ##x1 = selopenx; ##y1 = selopeny;   // 選択開始位置
        ##x2 = x; ##y2 = y; // 現在のカーソル位置(選択終了位置)
        ##selectionlock = selectionlock;    // 選択ロック状態かどうか
        ##lineselecting = lineselecting;    // 行選択開始コマンドでの選択か
どうか

        disabledraw;    // 描画禁止
        escape; // 選択解除
        moveto seltopx, seltopy;    // 選択されている最初の文字位置へ移動
        ##code = unicode;   // カーソル位置の文字コードを取得
        moveto ##x1, ##y1;  // 選択開始位置に移動

        if ( ##lineselecting ) beginrect;   // 行選択開始
        else beginsel;  // 通常の選択開始
        moveto ##x2, ##y2;  // 選択終了位置=元のカーソル位置に移動
        if ( ! ##selectionlock ) endsel;    // 元々選択ロック状態ではなかっ
たときendselする
        enabledraw; // 描画再開
    } else if ( x == 0 && ( y == 0 || y == rangeedittop || lineno == 0 ) )
{    // (範囲選択でなく、かつ)leftできないかBSに失敗する場所
        ##code = unicode;   // カーソル位置の文字コードを取得
    } else {    // 選択されてないとき
        /* // ここからVer8.81以降でないと動かない処理
##x1 = xview;
        ##y1 = y;
        left;   // 一文字分左移動
        ##code = unicode;   // カーソル位置の文字コードを取得
        movetoview ##x1, ##y1;  //念のため
        */ // ここまでVer8.81以降。ここからはもっと古くても動く処理
        ##x1 = x;
        ##y1 = y;
        left;   // 一文字分左移動
        ##leftsuccess = result; // leftが成功したかどうかの値
        ##code = unicode;   // カーソル位置の文字コードを取得
        if ( ##leftsuccess == yes || ##code == 9 ) {    //タブ文字の貫通上だ
とleftのresultが正しくない。
            right;
        }
        if( x != ##x1 || y != ##y1 ) moveto ##x1, ##y1;     //念のため
        // もっと古いバージョンでも動く処理ここまで

    }
    return ##code;  // 取得した文字コードを返して戻る

[ ]
RE:36493 秀丸リーダーの読み上げマクロにNo.36494
秀まるお2 さん 18/04/26 09:52
 
 たしかにこのやり方(範囲選択を解除して復元する)では無理があるということ
で・・・

 今ちょっと考えたのは、gettextまたはgettext2を使ってカーソル位置の1つ前の
文字コードが取得できそうな気がします。サンプルマクロ作ってみました。

    if( column == 0 ) {
        message "行頭";
        endmacro;
    }
    if( lineno == 0 ) {
        //秀丸メールのヘッダの中
        if( column == x ) {
            //折り返してる2行目以降じゃなければx,yで取得可能。
            $text = gettext( x - 1, y, x, y, 1);
        } else {
            if( selecting ) {
                //無理
            } else {
                left;
                $text = gettext( x, y, x + 1, y, 1);
                right;
            }
        }
    } else {
        $text = gettext2( column - 1, lineno, column, lineno, 1);
    }
    message $text + "  " + str( ascii( $text, 1 ) );

 こんなやり方でどうでしょうか。

 秀丸メールのヘッダの中の、折り返ししてる2行目以降の場合はダメですけども。
それ以外はOKそうな気がします。

[ ]
RE:36494 秀丸リーダーの読み上げマクロにNo.36496
K'zawa さん 18/04/26 17:31
 
秀まるおさん、こんにちは。
K'zawaです。
    // カーソル位置が選択範囲外で、左が範囲内の一文字以上選択している通常選
択または行選択のとき
から
    return ##code;  // 取得した文字コードを返して戻る
の間の処理ですよね?
実はそういう感じのバージョンも手元にありまして、確かにほぼうまくいくんですが、
ヘッダー名のすぐ右、内容の一文字目にカーソルがあるとき、スペースが取得される
のが、読み上げ的には何だか意味不明で、それに対処しようとするとさらにいろいろ
しなければならないので、その辺りまでしか作りこんでいませんでした。
ヘッダーの折り返しまでは気が付いてなかったですけど。
こっちも作りこんでみます。
h2:36494| RE 36493 秀丸リーダーの読み上げマクロについて
> たしかにこのやり方(範囲選択を解除して復元する)では無理があるということ
>で・・・
>
> 今ちょっと考えたのは、gettextまたはgettext2を使ってカーソル位置の1つ前の
>文字コードが取得できそうな気がします。サンプルマクロ作ってみました。
>
>    if( column == 0 ) {
>        message "行頭";
>        endmacro;
>    }
>    if( lineno == 0 ) {
>        //秀丸メールのヘッダの中
>        if( column == x ) {
>            //折り返してる2行目以降じゃなければx,yで取得可能。
>            $text = gettext( x - 1, y, x, y, 1);
>        } else {
>            if( selecting ) {
>                //無理
>            } else {
>                left;
>                $text = gettext( x, y, x + 1, y, 1);
>                right;
>            }
>        }
>    } else {
>        $text = gettext2( column - 1, lineno, column, lineno, 1);
>    }
>    message $text + "  " + str( ascii( $text, 1 ) );
>
> こんなやり方でどうでしょうか。
>
> 秀丸メールのヘッダの中の、折り返ししてる2行目以降の場合はダメですけども。
>それ以外はOKそうな気がします。

[ ]
RE:36496 秀丸リーダーの読み上げマクロにNo.36500
秀まるお2 さん 18/04/27 15:39
 
 秀丸メールのヘッダの中での音声化については、秀丸メールがかなりイレギュラー
なカーソルの動かし方をさせてる関係があって、対応が困難です。

 何か別の案(tkinfo.dllに関数を追加するとか)で考えてみます。

[ ]
RE:36500 秀丸リーダーの読み上げマクロにNo.36501
K'zawa さん 18/04/27 15:54
 
秀まるおさん、こんにちは。
K'zawaです。

> 秀丸メールのヘッダの中での音声化については、秀丸メールがかなりイレギュ
>ラーなカーソルの動かし方をさせてる関係があって、対応が困難です。
>
> 何か別の案(tkinfo.dllに関数を追加するとか)で考えてみます。

一応できましたよ。スペースだったときにヘッダー名の可能性を考慮すれば。
でも内部関数だけでやるとややこしいので、だったらhmjre.dll使ってしまおうかと
思ってやっているところです。

[ ]
RE:36500 秀丸リーダーの読み上げマクロにNo.36504
K'zawa さん 18/04/27 23:37
 
秀まるおさん、こんにちは。
K'zawaです。

下記マクロのようにしてみました。ヘッダー周りの処理をする過程でヘッダー名がわ
かったので、それを読むようにもしてみました。

と、秀まるおさんの言葉に思わず乗ってしまいましたが、忘れてました。
この方法(カーソルを動かさずに文字を取得する)をなぜ放棄していたかというと、
カーソルがその文字に置かれてないので、文字以外の情報が得られないからなのです。
色とか協調とか、実際のX, yとか、移動させようとしたが失敗したこととか。これら
はカスタマイズするときに必要になってくることがあります。
今回のマクロで成立しても、その先がいまいちなのです。
なので、選択を解除して復元するのは無理があると言っても、カーソルの移動は必要
になってくると思います。
Shift+矢印キーに相当することがマクロでできたほうがいいと書いたのは、そういっ
た背景があります。都度、離れたところにある文字の属性を取れるようにして欲しい
と要望するよりも無難な気がしたものですから。
無理なら無理ということで構いませんので、ご検討いただけると幸いです。


// 1文字発音                           2009/04/07
// 秀丸エディタ Ver8.71以上/秀丸メール Ver6.72以上(複数選択系のバグ修正が
なされた)
// 2018.4.27 範囲選択時、カーソル位置の左まで選択されるときは左の文字を読む
のがだめになっていたのを復活。複数選択対応など

    setcompatiblemode 0x0F; // マクロの互換性の指示
    #del = iskeydown( 0x2E );   // Deleteキーがおされているかどうかの値
    if ( rectselecting ) {  // BOX選択のとき
        call GetCharCode_Rect;  // BOX選択専用の文字コード取得サブルーチンへ
    } else {    // BOX選択以外のとき
        call GetCharCode;   // 文字コード取得サブルーチンへ
    }
    #code = ##return;   // サブルーチンからの戻り値(文字コード)

    // 発音処理
    ddeinitiate "HidemaruReader", "Read";   // 秀丸リーダーと通信開始
    if ( #del && multiselecting ) { // 複数選択で削除のとき
        ddeexecute "-!複数範囲削除";
    } else if ( #del && rectselecting ) {   // 複数選択で削除のとき
        ddeexecute "-!ボックス削除";
    } else if ( $headername != "" ) {   // 変数にヘッダー名が入っているとき
        ddeexecute "!" + $headername;
    } else if( #code == 13 ) {  // 改行文字のとき
        ddeexecute "!かいぎょう";
    } else if( #code == 9 ) {   // タブ文字のとき
        ddeexecute "!タブ";
    } else if( #code == eof ) { // ファイル末尾のとき
        ddeexecute "!ファイルのまつび";
    } else if( #code == 0 ) {   // 開業や[EOF]より右にカーソルがあるとき
        ddeexecute "!ブランク";
    } else {    // それ以外の普通の文字のとき
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;   // 秀丸リーダーとの通信終了
    endmacro;   // マクロ終わり

GetCharCode:    // 文字コード取得サブルーチン
    if ( selecting == 0 && y < -1 && x == 0 ) { // 非選択で秀丸メールのヘッ
ダー名の先頭にカーソルがあるとき
        call GetHeaderName gettext( 0, y, linelen, y, 1 ), "^(\\c[\\c\\-]*:).
+";    // カーソル行の文字列と検索文字列を渡してサブルーチンを呼び出す
        return unicode; // 一応カーソル位置の文字コードも返して戻る
    }

    if (
    ( ! selecting ) // 範囲選択 してないとき
    || ( seltopx == selendx && seltopy == selendy ) // 幅0の選択範囲
        || ( seltoplineno > 0 && seltopcolumn == selendcolumn && seltoplinen
o == selendlineno ) // 折り返し位置で幅0(golineend3からShift+右矢印した状態
含む)
    || ( x == seltopx && y == seltopy ) // カーソル位置がseltop*側のとき、
カーソル移動の必要なし
    ) {
        return unicode; // カーソル位置の文字コードを返して戻る
    }

    // カーソル位置が選択範囲外で、左が範囲内の一文字以上選択している通常選
択または行選択のとき
    if ( #del ) {   // 削除のとき
        $$s = gettext( seltopx, seltopy, 1, seltopy + 1, 1 );   // 選択範囲
の最初の文字
    } else if ( column == 0 ) { // 論理行頭のとき
        $$s = "\n"; // 一文字以上選択し、カーソルはselend側なので改行に決ま
っている
    } else if ( y < -1 ) {  // 秀丸メールのヘッダー(空行よりも上)のとき
        $$s = gettext( x - 1, y, x, y, 1 ); // カーソル左の文字
        if ( $$s == "" ) {  // あるはずなのにない→ヘッダーの折り返しのとき
            $$s = wcsrightstr( gettext( 0, y - 1, x, y, 1 ), 1 );   // 前の
行の最後の文字
        }
        if ( $$s == "\x20" ) {  // 半角スペースだったとき(もしかしてヘッ
ダー名?)
            call GetHeaderName gettext( 0, y, x, y, 1 ), "^(\\c[\\c\\-]*:) +
$"; // 行頭からカーソル位置までの文字列と検索文字列を渡してサブルーチンを呼
び出す
            if ( $$return != "" ) $$s = $$return;   // 戻り値が空でなければ$
$sに入れる
        }
    } else {    // それ以外のとき
        $$s = gettext2( column - 1, lineno, column, lineno, 1 );    // カー
ソル左の文字
    }
    ##code = unicode( $$s );    // 文字コードに変換
    return unicode( $$s );  // 取得した文字コードを返して戻る

GetCharCode_Rect:   // BOX選択専用の文字コード取得サブルーチン
    if ( #del ) {   // (BOX)削除のとき
        return unicode; // (使わないけど)カーソル位置の文字コードを返して戻る
    }

    if ( multiselecting && selectionlock == 0 ) {   // 複数選択で選択ロック
ではないとき
        return unicode; // カーソル位置の文字コードを返して戻る
    }

    // 必要な情報を記憶
    ##selopenx = selopenx; ##selopeny = selopeny;   // 選択開始位置
    ##x = x; ##y = y;   // 現在のカーソル位置
    ##selectionlock = selectionlock;    // 選択ロック状態かどうか
    ##multiselecting = multiselecting;  // 複数選択かどうか

    // カーソル行の中に限った範囲選択の左側のx値を得る
    disabledraw;    //描画禁止
    tomultiselect;  // 複数選択化(カーソルによるせんたくはカーソル行だけに
なる)
    ##leftx = seltopx;  // 選択の左側x値

    // BOX選択の復元
    escape; // 選択解除
    moveto ##selopenx, ##selopeny;  // 選択開始位置へ移動
    if ( ##multiselecting ) beginrectmulti; // BOX選択開始(複数選択化)
    else beginrect; // BOX選択開始
    moveto ##x, ##y;    // 元のカーソル位置に移動

    if ( ##x > ##leftx ) {  // ##xが大きいとき(カーソル位置は選択範囲にふく
まれない)
        left;   // 左へ移動
    }
    ##code = unicode;   // カーソル位置の文字コードを取得
    moveto ##x, ##y;    // 元のカーソル位置に移動
    if ( ! ##selectionlock ) endsel;    // 元々選択ロック状態ではなかったと
きendselする
    enabledraw; // 描画再開
    return ##code;  // 取得した文字コードを返して戻る

GetHeaderName:  // ヘッダー名を取り出すサブルーチン
    loaddll "HmJre.dll";    // 正規表現DLLをロードする
    $headername = dllfuncstr( "ReplaceRegular", $$2, $$1, 0, "\\1", 0 );    
// 余分な文字を削除(失敗時は空文字列)
    freedll;    // 正規表現DLLを開放する
    return wcsleftstr( $headername, 1 );    //置換した文字列の1文字目を返す

[ ]
RE:36504 秀丸リーダーの読み上げマクロにNo.36507
K'zawa さん 18/05/01 17:22
 
こんにちは。
K'zawaです。

すみません、HmReadBack.macに誤りがありました。
beginlineselとするところがbeginrectになっていました。
訂正します。


// Backspace発音                        2009/04/07
// 秀丸エディタ Ver8.71以上/秀丸メール Ver6.72以上
// 2018.4.30 複数選択対応など

    setcompatiblemode 0x0F; // マクロの互換性の指示
    call GetCharCode;   // 文字コード取得サブルーチンへ
    #code = ##return;   // 戻り値を保存

    // 発音処理
    ddeinitiate "HidemaruReader", "Read";   // 秀丸リーダーと通信開始
    if ( multiselecting ) { // 複数選択のとき
        ddeexecute "-!複数範囲削除";
    } else if ( rectselecting ) {   // BOX選択のとき
        ddeexecute "-!ボックス削除";
    } else if ( #code == 13 ) { // 改行文字のとき
        ddeexecute "!かいぎょう";
    } else if ( #code == 9 ) {  // タブ文字のとき
        ddeexecute "!タブ";
    } else if ( #code == eof ) {    // ファイル末尾のとき
        ddeexecute "!ファイルのまつび";
    } else if ( #code == 0 ) {  // 開業や[EOF]より右にカーソルがあるとき
        ddeexecute "!ブランク";
    } else {    // それ以外の普通の文字のとき
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;   // 秀丸リーダーとの通信終了
    endmacro;   // マクロ終わり

GetCharCode:    // 文字コード取得サブルーチン
    if ( selecting ) {  // 範囲選択のとき
        if ( multiselecting || rectselecting ) {    // 複数選択またはBOX
選択のとき
            return unicode; // (使わないけど)カーソル位置の文字コード
を返して戻る
        }

        if ( seltopx == selendx && seltopy == selendy ) {   // 範囲が0幅
のとき
            endmacro;   // マクロ終了
        }

        if ( x == seltopx && y == seltopy ) {   // カーソル位置がseltop*
側のとき、カーソル移動の必要なし
            return unicode; // カーソル位置の文字コードを返して戻る
        }

    // 必要な情報を記憶
        ##x1 = selopenx; ##y1 = selopeny;   // 選択開始位置
        ##x2 = x; ##y2 = y; // 現在のカーソル位置(選択終了位置)
        ##selectionlock = selectionlock;    // 選択ロック状態かどうか
        ##lineselecting = lineselecting;    // 行選択開始コマンドでの選
択かどうか

        disabledraw;    // 描画禁止
        escape; // 選択解除
        moveto seltopx, seltopy;    // 選択されている最初の文字位置へ移

        ##code = unicode;   // カーソル位置の文字コードを取得
        moveto ##x1, ##y1;  // 選択開始位置に移動

        if ( ##lineselecting ) beginlinesel;    // 行選択開始
        else beginsel;  // 通常の選択開始
        moveto ##x2, ##y2;  // 選択終了位置=元のカーソル位置に移動
        if ( ! ##selectionlock ) endsel;    // 元々選択ロック状態ではな
かったときendselする
        enabledraw; // 描画再開
    } else if ( x == 0 && ( y == 0 || y == rangeedittop || lineno == 0 )
 ) {    // (範囲選択でなく、かつ)leftできないかBSに失敗する場所
        ##code = unicode;   // カーソル位置の文字コードを取得
    } else {    // 選択されてないとき
        /* // ここからVer8.81以降でないと動かない処理
##x1 = xview;
        ##y1 = y;
        left;   // 一文字分左移動
        ##code = unicode;   // カーソル位置の文字コードを取得
        movetoview ##x1, ##y1;  // 元のカーソル位置に戻す(タブ貫通含
む)
        */ // ここまでVer8.81以降。ここからはもっと古くても動く処理
        ##x1 = x;
        ##y1 = y;
        left;   // 一文字分左移動
        ##leftsuccess = result; // leftが成功したかどうかの値
        ##code = unicode;   // カーソル位置の文字コードを取得
        if ( ##leftsuccess == yes || ##code == 9 ) {    //タブ文字の貫通
上だとleftのresultが正しくない。
            right;
        }
        if( x != ##x1 || y != ##y1 ) moveto ##x1, ##y1;     //念のため
        // もっと古いバージョンでも動く処理ここまで

    }
    return ##code;  // 取得した文字コードを返して戻る

[ ]
RE:36504 秀丸リーダーの読み上げマクロにNo.36508
秀丸担当 さん 18/05/01 17:28
 

Shiftを押しながら上下左右移動することに相当する方法があったらいいということ
で、今後のバージョンで、shiftright等の文を追加しようと思います。

[ ]
RE:36507 秀丸リーダーの読み上げマクロにNo.36509
秀まるお2 さん 18/05/01 19:09
 
 とりあえず、秀丸エディタの方でShift+カーソル移動ってのをサポートするという
ことなので、今後の方針としては、

 − 秀丸エディタの新しいバージョンの場合はShift+カーソル移動で正しく動作。
 − 秀丸エディタが古い場合は範囲選択時の動作はいまいち不正確でも仕方が無い。

 という風にさせていただきつつ、マクロも、K'zawaさん作のをもっとシンプルにし
たのを添付しようかなぁと思います。

 K'zawaさんの方でマクロをいろいろ手直しされた場合は、それはそれで、将来的に
ライブラリの方にアップロードしていただく作戦がいいかなぁと思います。
 (秀丸リーダーをその度にバージョンアップするのは大変なので)

 そういう方向でよろしくお願いします。

[ ]
RE:36509 秀丸リーダーの読み上げマクロにNo.36510
K'zawa さん 18/05/01 22:39
 
秀まるおさん、こんにちは。
K'zawaです。

> − 秀丸エディタの新しいバージョンの場合はShift+カーソル移動で正しく動作。
> − 秀丸エディタが古い場合は範囲選択時の動作はいまいち不正確でも仕方が無い。
>
> という風にさせていただきつつ、マクロも、K'zawaさん作のをもっとシンプルに
>したのを添付しようかなぁと思います。
>
> K'zawaさんの方でマクロをいろいろ手直しされた場合は、それはそれで、将来的
>にライブラリの方にアップロードしていただく作戦がいいかなぁと思います。
> (秀丸リーダーをその度にバージョンアップするのは大変なので)
>
> そういう方向でよろしくお願いします。

了解しました。
少なくとも「選択し直し」しなければ、本来削除されるべき文字が消えないとかいう
ようなことがなくなってよいと思います。

[ ]
RE:36508 秀丸リーダーの読み上げマクロにNo.36511
K'zawa さん 18/05/01 22:39
 
秀丸担当さん、こんにちは。
K'zawaです。

>Shiftを押しながら上下左右移動することに相当する方法があったらいいということ
>で、今後のバージョンで、shiftright等の文を追加しようと思います。

よろしくお願いします。
読み上げマクロ的には既存のright当に2番目のパラメータというのがありがたいん
ですが、その辺はお任せします。

[ ]
RE:36511 秀丸リーダーの読み上げマクロにNo.36512
秀丸担当 さん 18/05/02 09:36
 

V8.81β8でshiftright等のカーソル移動の文を追加してみています。
パラメータの指定もright等と同じで、shiftright;またはshiftright 10;といった感
じに移動量の指定もできるようにしてみています。

[ ]
RE:36512 秀丸リーダーの読み上げマクロにNo.36515
K'zawa さん 18/05/03 14:15
 
秀丸担当さん、こんにちは。
K'zawaです。

>V8.81β8でshiftright等のカーソル移動の文を追加してみています。

ありがとうございます。
試しに簡単なマクロを作って使ってみようとしたのですが、「他の秀丸エディタがマ
クロ実行中です。」のエラーメッセージが出てしまいました。(shift付の文の数だけ)
もしかして矢印キーにマクロを割り当てていると、それを実行しようとするのでしょ
うか?

[ ]
RE:36515 秀丸リーダーの読み上げマクロにNo.36519
秀丸担当 さん 18/05/07 08:49
 

Shift+Rightのキーに割り当てたマクロでshiftright;を行った場合に確かに問題でし
た。
すみません。
次のβ版でまた修正させていただきます。

[ ]
RE:36519 秀丸リーダーの読み上げマクロにNo.36522
K'zawa さん 18/05/07 12:01
 
秀丸担当さん、こんにちは。
K'zawaです。

>Shift+Rightのキーに割り当てたマクロでshiftright;を行った場合に確かに問題で
>した。
>すみません。
>次のβ版でまた修正させていただきます。

よろしくお願いします。

[ ]
RE:36522 秀丸リーダーの読み上げマクロにNo.36543
秀丸担当 さん 18/05/09 11:26
 

V8.81β9でshiftrightをShift+Rightに割り当てたときの問題を修正しています。
何度もすみません。

[ ]
RE:36543 秀丸リーダーの読み上げマクロにNo.36545
K'zawa さん 18/05/09 11:58
 
秀丸担当さん、こんにちは。
K'zawaです。


キーにマクロは割り当てているんですが、まだその中で使う段階までには至っていな
くて、「shiftdown;」一行マクロを動かしただけだったので、そのテストしかしてい
ませんが、ちゃんと動作するようになりました。
いずれは割り当てマクロでも使うことになると思いますので、直ってよかったです。
ありがとうございました。

[ ]
RE:36509 秀丸リーダーの読み上げマクロにNo.37074
K'zawa さん 19/01/31 11:50
 
秀まるおさん、こんにちは。
K'zawaです。

> とりあえず、秀丸エディタの方でShift+カーソル移動ってのをサポートするとい
>うことなので、今後の方針としては、
>
> − 秀丸エディタの新しいバージョンの場合はShift+カーソル移動で正しく動作。
> − 秀丸エディタが古い場合は範囲選択時の動作はいまいち不正確でも仕方が無い。
>
> という風にさせていただきつつ、マクロも、K'zawaさん作のをもっとシンプルに
>したのを添付しようかなぁと思います。

この件は、こちらでShift+カーソル移動方式に変更したマクロを提示する必要があっ
たんでしょうか?
(最初にNO.36509を読んだときに不要と思ったのですが…)

> K'zawaさんの方でマクロをいろいろ手直しされた場合は、それはそれで、将来的
>にライブラリの方にアップロードしていただく作戦がいいかなぁと思います。
> (秀丸リーダーをその度にバージョンアップするのは大変なので)

「マクロをいろいろ手直し」とは、どういうレベルの話でしょうか?
NO.36504 で言っている「カスタマイズ」のことでしょうか?であれば、非公式な
ユーザーカスタマイズのことなので、そもそも秀丸リーダーのバージョンアップとは
関係ないのですが。
それ以外の意味でしたらお教えください。

追伸
Shift+カーソル移動を使わないgettext方式は細部まで詰めていくとやはりだめでした。
(BOX選択の情報がたりない)

[ ]
RE:37074 秀丸リーダーの読み上げマクロにNo.37075
秀まるお2 さん 19/01/31 13:27
 
 秀丸リーダーの付属マクロですが、すみませんがまだ何も手を付けてませんでした。

 いろいろ並行して仕事してるうちに忘れてしまってまして・・・。というか、とり
あえず現状添付してるマクロでもダメなことも無いだろうからということで、優先度
が下の方になってました。

 いろいろ余計な仕事を中途半端にやって逆にバグを出してしまうケースが多々ある
ので、時間を見て慎重に対応したいと思います。

[ ]
RE:37075 秀丸リーダーの読み上げマクロにNo.37078
秀まるお2 さん 19/02/01 18:08
 
 とりあえず、ここの会議室に書き込んでいただいたK'zawaさんのマクロそのままに
して、それでテストして問題がなければそのままで一回バージョンアップしようと思
います。

 その前に、会議室の過去の書き込み内容を忘れてしまってるので、その辺の読み直
しからやり直します。

[ ]
RE:37078 秀丸リーダーの読み上げマクロにNo.37079
K'zawa さん 19/02/02 00:02
 
秀まるおさん、こんにちは。
K'zawaです。

> とりあえず、ここの会議室に書き込んでいただいたK'zawaさんのマクロそのまま
>にして、それでテストして問題がなければそのままで一回バージョンアップしよう
>と思います。
>
> その前に、会議室の過去の書き込み内容を忘れてしまってるので、その辺の読み
>直しからやり直します。

私も忘れてますが…。
Shift+カーソル移動のマクロは、No.36509を見て、やめてしまったのでまだ張ったこ
とないはずですが。

最初に張ったマクロは、Shift+カーソル移動がない時点で、「ここまでやったけど、
もう無理」ってものだと思うので、参考にならなそうです。
gettext方式の話になっているあたりは、まるまる忘れてもらいたいです(笑)。

というわけで、やめていたマクロを完成させてみます。
少し時間がかかるかもしれません。

[ ]
RE:37079 秀丸リーダーの読み上げマクロにNo.37082
秀まるお2 さん 19/02/04 11:40
 
 話をまとめさせていただくと、

 − Shift+左矢印キーで範囲選択した時に、範囲選択してるカーソルの左側の文字を
   音声化させたい。
 − いろいろトライしたけどうまくいかず。特に、カーソル左側の文字の文字コード
   を取得するのに範囲選択を解除すると、元の状態に戻せなくなるのでダメ。
 − 秀丸エディタのマクロ命令にshiftleftとかを追加して、その命令を使ってもらう
   ことで解決できるはず。

 ということで、そのshiftleftとかを使ったマクロを作ってみようと思います。

[ ]
RE:37082 秀丸リーダーの読み上げマクロにNo.37084
秀まるお2 さん 19/02/04 18:37
 
>  − Shift+左矢印キーで範囲選択した時に、範囲選択してるカーソルの左側の文
>字を
>    音声化させたい。

 なんか逆のような気がしてきました。

 NVDAのインストールしたパソコン上で、メモ帳でテストしたら、例えば

   abcdefg

 とある文字列の"a"から右方向に範囲選択していくと、

 Shift+→キーを押して"a"を選択した状態:   aせんたく
 Shift+→キーを押して"ab"を選択した状態:   bせんたく
 Shift+→キーを押して"abc"を選択した状態:   cせんたく

 と音声化します。つまり、Shift+右矢印キーで範囲選択する時に、カーソル左側の
文字を音声化させたいという話だったのやら?

 今マクロを作ってテストしてて気づいたことですが。

 音声化ソフトによってこの辺の音声化にもいろいろ種類があるとなると、これまた
いろんな音声化の種類を用意しないといけなくなったりするかもしれません。(従来
通りでないと困るという方もおられるかもしれないし)

[ ]
RE:37084 秀丸リーダーの読み上げマクロにNo.37086
K'zawa さん 19/02/05 14:44
 
秀まるおさん、こんにちは。
K'zawaです。

>>  − Shift+左矢印キーで範囲選択した時に、範囲選択してるカーソルの左側の
>文字を
>>    音声化させたい。
>
> なんか逆のような気がしてきました。
<略>
> Shift+→キーを押して"a"を選択した状態:   aせんたく
> Shift+→キーを押して"ab"を選択した状態:   bせんたく
> Shift+→キーを押して"abc"を選択した状態:   cせんたく
>
> と音声化します。つまり、Shift+右矢印キーで範囲選択する時に、カーソル左側
>の文字を音声化させたいという話だったのやら?

スレッドの一番最初の冒頭にはそういう意味のことが書いてありますが、どこかで書
き間違えてたらすいません。
昔はそうなっていたんですが、そのころはBOX選択に対応していなかったり、対応し
たあとはバグってたりしていたような気がします。

> 今マクロを作ってテストしてて気づいたことですが。
>
> 音声化ソフトによってこの辺の音声化にもいろいろ種類があるとなると、これま
>たいろんな音声化の種類を用意しないといけなくなったりするかもしれません。
>(従来通りでないと困るという方もおられるかもしれないし)

そういうのはすべてHmRead.txtに書かれてある、カスタマイズの範疇だと思っていま
したが。

[ ]
RE:37086 秀丸リーダーの読み上げマクロにNo.37087
秀まるお2 さん 19/02/05 15:12
 
 では、NVDA + メモ帳での音声化のような感じのマクロにしてみます。

[ ]
RE:37087 秀丸リーダーの読み上げマクロにNo.37088
秀まるお2 さん 19/02/05 16:26
 
 nvda + メモ帳のようにしようかと思ったんですが、いくつか無理がありました。

 まず、nvdaの場合だと、例えば

   ABCDEFG

 の"A"から順番に左から右に範囲選択していった時に、

    Aせんたく
    Bせんたく
    Cせんたく

 のように、選択した文字にプラスして「せんたく」と発音するんですが、現状秀丸
リーダーではこれが実現できないです。

    ddeexecute "#a";
    ddeexecute "$せんたく";

 とすると、少なくともnvdaの場合には"A"の音声化の後にしばらく間が空いてから
「せんたく」と発音して、全然おかしいです。

 単純に

    A
    B
    C

 のように音声化したらいいかと思ったんですが、左から右に選択した後にShift+左
矢印キーで戻した時に、また別の音声化をするようでした。例えば"ABC"を選択した
状態でShift+左矢印キーを押していくと、

    Cせんたくなし
    Bせんたくなし
    Aせんたくなし

 のように、選択を外した文字、つまり、カーソル右側の文字を音声化します。

 HmRead1.macでも無理すればこれは実現できますが、「せんたく」か「せんたくな
し」かの音声化無しで単にA、B、Cと音声化したのでは、いったどっちの文字を音声
化してるのか分からないんじゃないかと思います。

 やはりシンプルに右側の文字だけ音声化した方がいいような気がしてきました。

[ ]
RE:37087 秀丸リーダーの読み上げマクロにNo.37089
K'zawa さん 19/02/05 16:26
 
秀まるおさん、こんにちは。
K'zawaです。

> では、NVDA + メモ帳での音声化のような感じのマクロにしてみます。

NVDAはShift+右で選択するときと、その選択をShift+左で戻るときでも違いがありま
すね。
行読みもカーソルから右を読むのが普通なのかもしれません。
選択中の行読みもNVDAとPC Talkerでは違います。

情報
タブ貫通は、CSVモードの区切り記号の空間も貫通します。

[ ]
RE:37089 秀丸リーダーの読み上げマクロにNo.37090
秀まるお2 さん 19/02/05 17:42
 
 とりあえず、PC-Talker風の音声化はできると思うので、それ用のマクロを作って
みようと思います。

 現状のHmRead1.macはそのままで、別途、HmRead1_PCTalker.macを用意して、イン
ストール時に、どっちを登録するのか選択できるようにしようかなぁと思います。

[ ]
RE:37090 秀丸リーダーの読み上げマクロにNo.37091
K'zawa さん 19/02/05 21:37
 
秀まるおさん、こんにちは。
K'zawaです。

> とりあえず、PC-Talker風の音声化はできると思うので、それ用のマクロを作って
>みようと思います。
>
> 現状のHmRead1.macはそのままで、別途、HmRead1_PCTalker.macを用意して、イン
>ストール時に、どっちを登録するのか選択できるようにしようかなぁと思います。

それもいいんですけども、その前に、

> 話をまとめさせていただくと、

のときに見落としてましたけども、複数選択への対応もあります。

[ ]
RE:37091 秀丸リーダーの読み上げマクロにNo.37094
秀まるお2 さん 19/02/06 10:22
 
 PC-Talker + メモ帳と同じ動作にしたバージョンが一応できたので、これで大丈夫
か確認お願いできますでしょうか。

> のときに見落としてましたけども、複数選択への対応もあります。

 複数選択/BOX範囲選択のDeleteの処理は、最初のK'zawaさんのマクロと同じになっ
てると思います。


HmRead1_PCTalker.mac
----------------------------------------------------------------------------
------------------------------
// 1文字発音 PC-Talker互換バージョン  2019.02.05
//
// 秀丸エディタ Ver8.87以上/秀丸メール Ver6.89以上
//
// 範囲選択しながらの音声かを、PC-Talker + メモ帳 と同じにしたバージョン。
// Shift+左矢印キーで範囲選択してる時は左側の文字を音声化するようにした。
// shiftleftなどを使うようにしたので、秀丸エディタや秀丸メールの古いバージョ
ンでは使えません。
// K'zawaさんのマクロを元に作成しなおしました。
//

    setcompatiblemode 0x0F;
    ddeinitiate "HidemaruReader", "Read";
    #del = iskeydown( 0x2E );   // Deleteキーがおされているかどうかの値
    #xPrev = xview;             //新しいxviewを使う。タブ文字貫通用。
    #yPrev = y;
    #headertop = 0;             //ヘッダ中身の先頭かどうか。leftの時に分かる。
    #mailtop = 0;               //メールの先頭。leftが失敗した場合。

    $speech = "";               //音声化文字列

    if( #del && selecting ) {
        if( multiselecting ) { // 複数選択で削除のとき
            $speech = "!ふくすうせんたくさくじょ";
        } else if( rectselecting ) {   // 複数選択で削除のとき
            $speech = "!ボックスせんたくさくじょ";
        } else {
            $speech = "!はんいせんたくさくじょ";
        }
    } else if( selecting && seltopx == selendx && seltopy == selendy ) {
        $speech = "!はんいせんたくがカラ";
    } else {
        if( (!selecting)                        //範囲選択してない場合は従来
通りの処理。
         || (x == seltopx && y == seltopy)      //後方から前方に向けて選択し
てる場合も従来通り
         ) {
            #code = unicode;
            if ( y == linecount - 1 && x > linelen ) {
                #code = 0;
            }
        } else {
            //前方から後方に範囲選択してる場合は左側の文字を音声化する。
            if( column == 0 ) {
                //改行文字を選択してるはず。
                #code =13;
            } else if( lineno <= 0 ) {
                //秀丸メールのヘッダの中の場合。面倒そうな場合はshiftleftを
使う。
                if( x == column && x > 10 ) {       //折り返してない場合で、
行頭じゃない場合。(ヘッダ名の幅は最低10桁扱い)
                    //ヘッダ中身の途中で、折り返してない場合のはず。カーソル
移動せずに文字コード取得する。
                    #code = unicode( gettext( x - 1, y, x, y, 1 ) );
                    //全角文字かどうか調べる。
                    if( #code == ' ' || #code == ':' ) {
                        //ヘッダの先頭かもしれないので、普通の処理に移動。例
:"Organization:"みたいに10桁オーバーのヘッダ名の場合。
                        goto Label_CursorLeftRight;
                    }
                    #code2 = unicode( gettext( x - 2, y, x, y, 1 ) );
                    #code2_partial = unicode( gettext( x - 2, y, x - 1, y, 1
 ) );
                    if( #code2 != #code2_partial ) {
                        #code = #code2;     //全角文字のはず。
                    }
                } else {
Label_CursorLeftRight:
                    if( selectionlock ) {
                        left;
                        if( column == 0 ) {
                            #headertop = 1;
                        }
                        #code = unicode;
                        right;
                    } else {
                        shiftleft;
                        if( column == 0 ) {
                            #headertop = 1;
                        }
                        #code = unicode;
                        shiftright;
                    }
                }
            } else {
                //カーソル移動せずに文字コードを取得する。
                #code = unicode( gettext2( column - 1, lineno, column, linen
o, 1 ) );
                if( column >= 2 ) {
                    //全角文字かどうか調べる。
                    #code2 = unicode( gettext2( column - 2, lineno, column,
lineno, 1 ) );
                    #code2_partial = unicode( gettext2( column - 2, lineno,
column - 1, lineno, 1 ) );
                    if( #code2 != #code2_partial ) {
                        #code = #code2;     //全角文字のはず。
                    }
                }
            }
            if( #headertop ) {
                $speech = "!ヘッダないようのせんとう";
            }
        }
        if( $speech == "" ) {
            if( #code == 13 ) {
                $speech = "!かいぎょう";
            } else if( #code == 9 ) {
                $speech = "!タブ";
            } else if( #code == eof ) {
                $speech = "!ファイルのまつび";
            } else if( #code == 0 ) {
                $speech = "!ブランク";
            } else {
                $speech = "#" + unichar( #code );
            }
        }
    }
    if( $speech != "" ) {
        //デバッグ用。 message $speech;
        ddeexecute $speech;
    }
    ddeterminate;
----------------------------------------------------------------------------
------------------------------

[ ]
RE:37094 秀丸リーダーの読み上げマクロにNo.37095
K'zawa さん 19/02/07 14:56
 

秀まるおさん、こんにちは。
K'zawaです。

> PC-Talker + メモ帳と同じ動作にしたバージョンが一応できたので、これで大丈
>夫か確認お願いできますでしょうか。

BOX選択中の左右移動でずれる場合があります。
BOX選択開始、右、下、左、左、左…とやるとすぐ分かります。ずっと左の文字を読
んでいます。
普通の選択扱いされているような…。
同じくBOX選択中で、改行文字があるはずのところがブランクになっています。

秀まるおさんのマクロとは別に、こちらで作っていたマクロもいちおうできたので、
参考までに張っておきます。
私の張った、だめだったマクロじゃなくて、付属マクロのほうを直しました。


// 1文字発音                           2019/02/04
// 秀丸エディタ Ver8.81以上/秀丸メール Ver6.84以上

    setcompatiblemode 0xF0000F;

    // 削除かどうか
    #del = iskeydown( 0x2E );

    // 元のカーソル位置を記憶
    #cursorX = x;
    #cursorY = y;
    #cursorXView = xview;

    disabledraw;
    if ( selecting ) {
        if ( #del && multiselecting && x == selopenx && y == selopeny ) {  
// 複数選択削除でカーソル位置で選択開始点と終点が同じとき
            call MultiSelect;
        } else if ( y == selopeny ) {   // 1行内選択
            if ( x > selopenx ) {   // 右向き選択
                shiftleft;
            }
        } else if ( rectselecting ) {   // BOX選択(ただし2行以上)のとき
            call RectSelect;
            if ( ##return < 0 ) {   // カーソル左の文字まで選択のとき
                shiftleft;
            } else if ( ##return == 0 && #del && multiselecting ) { // カー
ソル行は選択幅ゼロで複数選択削除のとき
                call MultiSelect;
            }
        } else if ( x == selendx && y == selendy ) {    // カーソル左の文字
まで選択のとき
            shiftleft;
        }
    }

    // 文字コード取得
    #code = unicode;

// カーソルを元の位置に戻す
    movetoview #cursorXView, #cursorY;
    enabledraw;

    // 読み上げ
    ddeinitiate "HidemaruReader", "Read";
    if ( #code == eof ) {
        ddeexecute "!ファイルのまつび";
    } else if ( #code == 0x00 ) {
        ddeexecute "!ブランク";
    } else if ( #code == 0x09 ) {
        if ( selecting == 0 ) call Tab;
        ddeexecute $tone + "!タブ";
    } else if ( #code == 0x0D ) {
        ddeexecute "!かいギョー";
    } else if ( #code == 0x2C && selecting == 0 && getconfig( "TabMode" ) &
0x0F0F == 0x0101 ) {
        call Tab;
        ddeexecute $tone + "!コンマ";
    } else {
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;
    endmacro;

// Subroutine
MultiSelect:
    // 空文字列じゃない選択を見つける(カーソル部でゼロ幅選択は除外済み)
    while ( ##i < multiselectcount ) {
        if ( seltopx[##i] != selendx[##i] || seltopy[##i] != selendy[##i] )
break;
        ##i = ##i + 1;
    }

    if ( ##i < multiselectcount ) { // 選択文字列があったとき
        moveto seltopx[##i], seltopy[##i];
    }
    return;

RectSelect:
    // カーソル位置に対してどちら側が選択されているか調べる(プロポーショナ
ルフォント、CSV/TSVモード対応)−
    moveto selopenx, selopeny;
    if ( #cursorY < selopeny ) {
        shiftup selopeny - #cursorY;
    } else {
        shiftdown #cursorY - selopeny;
    }
    ##dx = x - #cursorX;
    moveto #cursorX, #cursorY;
    return ##dx;

Tab:    // タブ貫通対応(CSVモードのカンマも)disabledraw中はなぜかうまくい
かない
    if ( selecting == 0 && carettabmode == 3 ) {
        moveto #cursorX, #cursorY;
        if ( xview != #cursorXView ) {
            if ( #del ) beep;
            $tone = "-";
        }
        movetoview #cursorXView, #cursorY;
    }
    return;


----------


// Backspace発音                        2019/02/04
// 秀丸エディタ Ver8.81以上/秀丸メール Ver6.84以上

    setcompatiblemode 0xF0000F;

    // 元のカーソル位置を記憶
    #cursorX = x;
    #cursorY = y;
    #cursorXView = xview;

    disabledraw;
    if ( selecting ) {
        if ( multiselecting && x == selopenx && y == selopeny ) {   // 複数
選択でカーソル位置で選択開始点と終点が同じとき
            call MultiSelect;
        } else if ( y == selopeny ) {   // 1行内選択
            if ( x > selopenx ) {   // 右向き選択
                shiftleft;
            }
        } else if ( rectselecting ) {   // BOX選択(ただし2行以上)のとき
            call RectSelect;
            if ( ##return < 0 ) {   // カーソル左の文字まで選択のとき
                shiftleft;
            } else if ( ##return == 0 && multiselecting ) { // カーソル行は
選択幅ゼロで複数選択のとき
                call MultiSelect;
            }
        } else if ( x == selendx && y == selendy ) {    // カーソル左の文字
まで選択のとき
            shiftleft;
        }
    } else {    // 非選択のとき
        left;
    }

    // 文字コード取得
    #code = unicode;

// カーソルを元の位置に戻す
    movetoview #cursorXView, #cursorY;
    enabledraw;

    // 読み上げ
    ddeinitiate "HidemaruReader", "Read";
    if ( #code == eof ) {
        ddeexecute "!ファイルのまつび";
    } else if ( #code == 0x00 ) {
        ddeexecute "!ブランク";
    } else if ( #code == 0x09 ) {
        if ( selecting == 0 ) call Tab;
        ddeexecute $tone + "!タブ";
    } else if ( #code == 0x0D ) {
        ddeexecute "!かいギョー";
    } else if ( #code == 0x2C && selecting == 0 && getconfig( "TabMode" ) &
0x0F0F == 0x0101 ) {
        call Tab;
        ddeexecute $tone + "!コンマ";
    } else {
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;
    endmacro;

// Subroutine
MultiSelect:
    // 空文字列じゃない選択を見つける(カーソル部でゼロ幅選択は除外済み)
    while ( ##i < multiselectcount ) {
        if ( seltopx[##i] != selendx[##i] || seltopy[##i] != selendy[##i] )
break;
        ##i = ##i + 1;
    }

    if ( ##i < multiselectcount ) { // 選択文字列があったとき
        moveto seltopx[##i], seltopy[##i];
    } else {    // 全部選択幅ゼロのとき
        shiftleft;
    }
    return;

RectSelect:
    // カーソル位置に対してどちら側が選択されているか調べる(プロポーショナ
ルフォント、CSV/TSVモード対応)−
    moveto selopenx, selopeny;
    if ( #cursorY < selopeny ) {
        shiftup selopeny - #cursorY;
    } else {
        shiftdown #cursorY - selopeny;
    }
    ##dx = x - #cursorX;
    moveto #cursorX, #cursorY;
    return ##dx;

Tab:    // タブ貫通対応(CSVモードのカンマも)disabledraw中はなぜかうまくい
かない
    if ( selecting == 0 && carettabmode == 3 ) {
        moveto #cursorX, #cursorY;
        if ( xview != #cursorXView - 1 ) {
            beep;
            $tone = "-";
        }
        movetoview #cursorXView, #cursorY;
    }
    return;

[ ]
RE:37095 秀丸リーダーの読み上げマクロにNo.37099
秀まるお2 さん 19/02/08 10:26
 
 テストありがとうございます。

 BOX範囲選択でうまくいかないのは確認できました。一応直せると思います。

 CSVモードはまったく考えてませんでした。その辺もテストして出来る範囲で対応
しようと思います。

[ ]
RE:37099 秀丸リーダーの読み上げマクロにNo.37101
K'zawa さん 19/02/09 16:43
 
秀まるおさん、こんにちは。
K'zawaです。

タブ文字が入った行で右向き選択すると、日本語が「ブランク」になるなど、なにか
おかしいです。

[ ]
RE:37101 秀丸リーダーの読み上げマクロにNo.37109
秀まるお2 さん 19/02/13 14:05
 
 とりあえず、

 − BOX範囲選択で音声化する文字がずれることがあるバグ修正。
 − BOX範囲選択で改行がブランクと音声化されることがあるバグ修正。
 − カーソルより前にタブ文字がある場合に、左から右への範囲選択中の
   音声化で、カーソル左側に全角文字がある場合におかしいバグ修正。
 − カーソルがタブ文字を貫通する設定で、タブ文字の貫通位置、またはCSVモード
   での貫通位置にある時に、トーンを下げて音声化するようにした。

 辺りの修正だけしてみます。

 K'zawaさんのマクロは複数選択またはBOX範囲選択のDelete時に何か別のこともや
ってるような気がするのですが、意味がよく分からずで、それは対応してないです。

 とりあえずこんなのでダメでしょうか。

----------------------------------------------------------------
// 1文字発音 PC-Talker互換バージョン  2019.02.05
//
// 秀丸エディタ Ver8.87以上/秀丸メール Ver6.89以上
//
// 範囲選択しながらの音声かを、PC-Talker + メモ帳 と同じにしたバージョン。
// Shift+左矢印キーで範囲選択してる時は左側の文字を音声化するようにした。
// shiftleftなどを使うようにしたので、秀丸エディタや秀丸メールの古いバージョ
ンでは使えません。
// K'zawaさんのマクロを元に作成しなおしました。
//

    setcompatiblemode 0x0F;
    ddeinitiate "HidemaruReader", "Read";
    #del = iskeydown( 0x2E );   // Deleteキーがおされているかどうかの値
    #headertop = 0;             //ヘッダ中身の先頭かどうか。leftの時に分かる。
    #mailtop = 0;               //メールの先頭。leftが失敗した場合。

    $speech = "";               //音声化文字列

    if( #del && selecting ) {
        if( multiselecting ) { // 複数選択で削除のとき
            $speech = "!ふくすうせんたくさくじょ";
        } else if( rectselecting ) {   // 複数選択で削除のとき
            $speech = "!ボックスせんたくさくじょ";
        } else {
            $speech = "!はんいせんたくさくじょ";
        }
    } else if( selecting && seltopx == selendx && seltopy == selendy ) {
        $speech = "!はんいせんたくがカラ";
    } else {
        if( !selecting ) {                      //範囲選択してない場合は従来
通りの処理。
Label_Normal: ;
            #code = unicode;
            if ( y == linecount - 1 && x > linelen ) {
                #code = 0;
            }
        } else {
            if( rectselecting ) {
                if( x == seltopx ) {
                    goto Label_Normal;
                }
                //カーソルが改行文字の右側にある場合はカーソルを左に移動して
やらないとブランクか改行か分からない。
                if( xview > linelen ) {
                    goto Label_CursorLeftRight;
                }
            } else if( x == seltopx && y == seltopy ) {
                goto Label_Normal;
            }
            //前方から後方に範囲選択してる場合は左側の文字を音声化する。
            if( column == 0 ) {
                //改行文字を選択してるはず。
                #code = 13;
            } else if( lineno <= 0 ) {
                //秀丸メールのヘッダの中の場合。面倒そうな場合はshiftleftを
使う。
                if( x == column && x > 10 ) {       //折り返してない場合で、
行頭じゃない場合。(ヘッダ名の幅は最低10桁扱い)
                    //ヘッダ中身の途中で、折り返してない場合のはず。カーソル
移動せずに文字コード取得する。
                    #code = unicode( gettext( x - 1, y, x, y, 1 ) );
                    //全角文字かどうか調べる。
                    if( #code == ' ' || #code == ':' ) {
                        //ヘッダの先頭かもしれないので、普通の処理に移動。例
:"Organization:"みたいに10桁オーバーのヘッダ名の場合。
                        goto Label_CursorLeftRight;
                    }
                    #code2 = unicode( gettext( x - 2, y, x, y, 1 ) );
                    #code2_partial = unicode( gettext( x - 2, y, x - 1, y, 1
 ) );
                    if( #code2 != #code2_partial ) {
                        #code = #code2;     //全角文字のはず。
                    }
                } else {
Label_CursorLeftRight:
                    if( selectionlock ) {
                        left;
                        if( column == 0 ) {
                            #headertop = 1;
                        }
                        #code = unicode;
                        right;
                    } else {
                        shiftleft;
                        if( column == 0 ) {
                            #headertop = 1;
                        }
                        #code = unicode;
                        shiftright;
                    }
                }
            } else {
                //カーソル移動せずに文字コードを取得する。
                #code = unicode( gettext2( column - 1, lineno, column, linen
o, 1 ) );
                if( #code == 0 && column >= 2 ) {
                    //全角文字だと思う。
                    #code = unicode( gettext2( column - 2, lineno, column, l
ineno, 1 ) );
                    if( #code == 0 ) {
                        //おかしい場合は念のためshiftleftへ
                        goto Label_CursorLeftRight;
                    }
                }
            }
            if( #headertop ) {
                $speech = "!ヘッダないようのせんとう";
            }
        }
        if( $speech == "" ) {
            if( #code == 13 ) {
                $speech = "!かいぎょう";
            } else if( #code == 9 ) {
                $speech = "!タブ";
            } else if( #code == eof ) {
                $speech = "!ファイルのまつび";
            } else if( #code == 0 ) {
                $speech = "!ブランク";
            } else {
                $speech = "#" + unichar( #code );
            }
            if( carettabmode == 3 && selecting == 0 ) {
                //タブ文字の後ろの貫通位置の場合は"-"を付けて音声化する。
                //CSVモードでの','の後ろの貫通位置の場合も。
                if( #code == 9
                 || (#code == ',' && getconfig( "TabMode" ) & 0x0F0F == 0x0101)
                  ) {
                    #x = x;
                    #y = y;
                    #xview = xview;
                    moveto #x, #y;
                    if ( xview != #xview ) {
                        if ( #del ) beep;
                        $speech = "-" + $speech;
                    }
                    movetoview #xview, #y;
                }
            }
        }
    }
    if( $speech != "" ) {
        //デバッグ用。 message $speech;
        ddeexecute $speech;
    }
    ddeterminate;

[ ]
RE:37109 秀丸リーダーの読み上げマクロにNo.37117
K'zawa さん 19/02/14 14:08
 
秀まるおさん、こんにちは。
K'zawaです。

プロポーショナルフォントまたはCSV/TSVモードのときのBOX選択で、まだずれていま
す。
このケースでは、行ごとにxの目盛りが異なるので。

私のマクロでは、一旦selopenx, selopenyに移動してから、垂直に元の行に戻して、
元のxとの差を見て選択方向を出しています。(マイナスになったときだけ左の文字
を読み上げなければならない)
100%完全な方法か分かりませんが、今のところうまくいっているような…。

[ ]
RE:37117 秀丸リーダーの読み上げマクロにNo.37118
秀まるお2 さん 19/02/14 14:41
 
 プロポーショナルフォントまで考えてませんでした。テスト不足ですみません。

 K'zawaさんのマクロのselopenxとか使ってる箇所は意味がよく理解できずでしたが、
今一度テストしながら見直してみます。

[ ]
RE:37118 秀丸リーダーの読み上げマクロにNo.37119
秀まるお2 さん 19/02/14 15:10
 
 K'zawaさんのマクロの、複数選択の場合の処理も何をやってるのかちょっとよく分
からずで・・・

 とりあえず、余計なことせずに、K'zawaさんのマクロそのまんま添付させてもらっ
た方がいいような気がしてきました。

 1文字音声化とBackspace音声化の2つのマクロそのままで、インストール時の「秀
丸エディタのマクロ登録」の場面で、

 マクロの登録  -------------

   ●自動登録      ○後で自分で設定する

 に加えて、

 登録するマクロ  -----------

   ●従来互換    ○K'zawaさん作成の新バージョン

 ってことにしたらいいかと思いますが、それでいいでしょうか。

[ ]
RE:37119 秀丸リーダーの読み上げマクロにNo.37129
K'zawa さん 19/02/15 23:45
 
秀まるおさん、こんにちは。
K'zawaです。

> K'zawaさんのマクロの、複数選択の場合の処理も何をやってるのかちょっとよく
>分からずで・・・

複数選択時の処理について説明します。
(マクロ内で選択が解除されない前提)
説明の都合上、削除される文字を音声化の場合とします。

1. 削除じゃないとき、または、カーソル部(従来通りの選択をしている部分)で何
か文字を選択している削除のとき
   →複数選択を無視して複数選択じゃない他のブロックで処理させる

2. カーソル部は空の削除のとき
   →サブルーチンへ

2-1. カーソル部は空、それ以外のどこかに空でない場所がある
   →最初に見つけた空でない選択範囲の最初の文字を代表として読ませる。カーソ
ル部では何も起きないので。

2-2. 全部空
   →非選択時のDelete/Backspaceのようなことが各選択箇所で行われるので、代表
としてカーソル部を読ませる。Delete時はカーソル位置の文字、Backspace時はカー
ソル左の文字。

としています。


> とりあえず、余計なことせずに、K'zawaさんのマクロそのまんま添付させてもら
>った方がいいような気がしてきました。
>
> 1文字音声化とBackspace音声化の2つのマクロそのままで、インストール時の
>「秀丸エディタのマクロ登録」の場面で、
>
> マクロの登録  -------------
>
>   ●自動登録      ○後で自分で設定する
>
> に加えて、
>
> 登録するマクロ  -----------
>
>   ●従来互換    ○K'zawaさん作成の新バージョン
>
> ってことにしたらいいかと思いますが、それでいいでしょうか。

やり方はそれでいいと思いますが、「K'zawaさん作成の新バージョン」は仮称ですよ
ね?意味がわからなそうで…。
ところで、「従来互換」とは、古いマクロをそのままにして、古い秀丸でも動作する
版という意味なんでしょうか?それとも動作する秀丸バージョンは同じで、選択時の
読み上げ位置が違う版という意味でしょうか?

前者だとしたら、新しいほうは、「複数選択対応版」みたいにしたほうがよいと思い
ますが。


マクロですが、少し直しました。
『「行末<->次の行の行頭」移動の禁止』という設定がONのときに、うまくいくよう
にしました。
あと、「ファイルのまつび」「→ファイルのマツビ」に変更しました。一部の音声エ
ンジンで、「のまつび」が一語のように聞こえるので、

マクロの制限事項
「その他」→「動作環境」→「編集」→→→→→→→「高度な編集1」→「BOX選択中
にキーを押すとその文字を各行に挿入する」=ONで、「...」→「BOX選択時の入力方
法」=「BOX選択のまま(矛盾が出る可能性あり,V8.81以前と同等)」のとき、挿入後の
Backspaceで、正しく削除される文字を読むことができません。(編集結果には問題
ない)
「自動的に幅ゼロの複数選択に変換(矛盾なし,V8.81以前と操作性違いあり)」で使用
することを推奨します。


// 1文字発音                           2019/02/14
// 秀丸エディタ Ver8.81以上/秀丸メール Ver6.84以上
// 『「行末<->次の行の行頭」移動の禁止』対応

    setcompatiblemode 0xF0000F;

    // 削除かどうか
    #del = iskeydown( 0x2E );

    // 元のカーソル位置を記憶
    #cursorX = x;
    #cursorY = y;
    #cursorXView = xview;

    disabledraw;
    if ( selecting ) {
        if ( #del && multiselecting && x == selopenx && y == selopeny ) {  
// 複数選択削除でカーソル位置で選択開始点と終点が同じとき
            call MultiSelect;
        // } else if ( #skip ) {
        //  goto EXIT_IF;
        } else if ( y == selopeny ) {   // 1行内選択
            if ( x > selopenx ) {   // 右向き選択
                shiftleft;
            }
        } else if ( rectselecting ) {   // BOX選択(ただし2行以上)のとき
            call RectSelect;
            if ( ##return < 0 ) {   // カーソル左の文字まで選択のとき
                shiftleft;
            } else if ( ##return == 0 && #del && multiselecting ) { // カー
ソル行は選択幅ゼロで複数選択削除のとき
                call MultiSelect;
            }
        } else if ( x == selendx && y == selendy ) {    // カーソル左の文字
まで選択のとき
            if ( column == 0 ) {    // 『「行末<->次の行の行頭」移動の禁止』
対応
                up;
                if ( result ) golineend;
            } else {
                shiftleft;
            }
        }
    }
EXIT_IF:

    // 文字コード取得
    #code = unicode;

// カーソルを元の位置に戻す
    movetoview #cursorXView, #cursorY;
    enabledraw;

    // 読み上げ
    ddeinitiate "HidemaruReader", "Read";
    if ( #code == eof ) {
        ddeexecute "!ファイルのマツビ";
    } else if ( #code == 0x00 ) {
        ddeexecute "!ブランク";
    } else if ( #code == 0x09 ) {
        if ( selecting == 0 ) call Tab;
        ddeexecute $tone + "!タブ";
    } else if ( #code == 0x0D ) {
        ddeexecute "!かいギョー";
    } else if ( #code == 0x2C && selecting == 0 && getconfig( "TabMode" ) &
0x0F0F == 0x0101 ) {
        call Tab;
        ddeexecute $tone + "!コンマ";
    } else {
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;
    endmacro;

// Subroutine
MultiSelect:
    // 空文字列じゃない選択を見つける(カーソル部でゼロ幅選択は除外済み)
    while ( ##i < multiselectcount ) {
        if ( seltopx[##i] != selendx[##i] || seltopy[##i] != selendy[##i] )
break;
        ##i = ##i + 1;
    }

    if ( ##i < multiselectcount ) { // 選択文字列があったとき
        moveto seltopx[##i], seltopy[##i];
    }
    return;

RectSelect:
    // カーソル位置に対してどちら側が選択されているか調べる(プロポーショナ
ルフォント、CSV/TSVモード対応)−
    moveto selopenx, selopeny;
    if ( #cursorY < selopeny ) {
        shiftup selopeny - #cursorY;
    } else {
        shiftdown #cursorY - selopeny;
    }
    ##dx = x - #cursorX;
    moveto #cursorX, #cursorY;
    return ##dx;

Tab:    // タブ貫通対応(CSVモードのカンマも)disabledraw中はなぜかうまくい
かない
    if ( selecting == 0 && carettabmode == 3 ) {
        moveto #cursorX, #cursorY;
        if ( xview != #cursorXView ) {
            if ( #del ) beep;
            $tone = "-";
        }
        movetoview #cursorXView, #cursorY;
    }
    return;


----------


// Backspace発音                        2019/02/14
// 秀丸エディタ Ver8.81以上/秀丸メール Ver6.84以上
// 『「行末<->次の行の行頭」移動の禁止』対応

    setcompatiblemode 0xF0000F;

    // 元のカーソル位置を記憶
    #cursorX = x;
    #cursorY = y;
    #cursorXView = xview;

    disabledraw;
    if ( selecting ) {
        if ( multiselecting && x == selopenx && y == selopeny ) {   // 複数
選択でカーソル位置で選択開始点と終点が同じとき
            call MultiSelect;
        } else if ( y == selopeny ) {   // 1行内選択
            if ( x > selopenx ) {   // 右向き選択
                shiftleft;
            }
        } else if ( rectselecting ) {   // BOX選択(ただし2行以上)のとき
            call RectSelect;
            if ( ##return < 0 ) {   // カーソル左の文字まで選択のとき
                shiftleft;
            } else if ( ##return == 0 && multiselecting ) { // カーソル行は
選択幅ゼロで複数選択のとき
                call MultiSelect;
            }
        } else if ( x == selendx && y == selendy ) {    // カーソル左の文字
まで選択のとき
            if ( column == 0 ) {    // 『「行末<->次の行の行頭」移動の禁止』
対応
                up;
                if ( result ) golineend;
            } else {
                shiftleft;
            }
        }
    } else {    // 非選択のとき
        if ( column == 0 ) {    // 『「行末<->次の行の行頭」移動の禁止』対応
            up;
            if ( result ) golineend;
        } else {
            left;
        }
    }

    // 文字コード取得
    #code = unicode;

// カーソルを元の位置に戻す
    movetoview #cursorXView, #cursorY;
    enabledraw;

    // 読み上げ
    ddeinitiate "HidemaruReader", "Read";
    if ( #code == eof ) {
        ddeexecute "!ファイルのマツビ";
    } else if ( #code == 0x00 ) {
        ddeexecute "!ブランク";
    } else if ( #code == 0x09 ) {
        if ( selecting == 0 ) call Tab;
        ddeexecute $tone + "!タブ";
    } else if ( #code == 0x0D ) {
        ddeexecute "!かいギョー";
    } else if ( #code == 0x2C && selecting == 0 && getconfig( "TabMode" ) &
0x0F0F == 0x0101 ) {
        call Tab;
        ddeexecute $tone + "!コンマ";
    } else {
        ddeexecute "#" + unichar( #code );
    }
    ddeterminate;
    endmacro;

// Subroutine
MultiSelect:
    // 空文字列じゃない選択を見つける(カーソル部でゼロ幅選択は除外済み)
    while ( ##i < multiselectcount ) {
        if ( seltopx[##i] != selendx[##i] || seltopy[##i] != selendy[##i] )
break;
        ##i = ##i + 1;
    }

    if ( ##i < multiselectcount ) { // 選択文字列があったとき
        moveto seltopx[##i], seltopy[##i];
    } else {    // 全部選択幅ゼロのとき
        shiftleft;
    }
    return;

RectSelect:
    // カーソル位置に対してどちら側が選択されているか調べる(プロポーショナ
ルフォント、CSV/TSVモード対応)−
    moveto selopenx, selopeny;
    if ( #cursorY < selopeny ) {
        shiftup selopeny - #cursorY;
    } else {
        shiftdown #cursorY - selopeny;
    }
    ##dx = x - #cursorX;
    moveto #cursorX, #cursorY;
    return ##dx;

Tab:    // タブ貫通対応(CSVモードのカンマも)disabledraw中はなぜかうまくい
かない
    if ( selecting == 0 && carettabmode == 3 ) {
        moveto #cursorX, #cursorY;
        if ( xview != #cursorXView - 1 ) {
            beep;
            $tone = "-";
        }
        movetoview #cursorXView, #cursorY;
    }
    return;

[ ]
RE:37129 秀丸リーダーの読み上げマクロにNo.37130
K'zawa さん 19/02/17 11:48
 
秀まるおさん、こんにちは。
K'zawaです。

すみません、訂正です。

>マクロの制限事項
>「その他」→「動作環境」→「編集」→「高度な編集1」→「BOX選択中にキーを押
>すとその文字を各行に挿入する」=ONで、「...」→「BOX選択時の入力方法」=「BOX
>選択のまま(矛盾が出る可能性あり,V8.81以前と同等)」のとき、挿入後のBackspace
>で、正しく削除される文字を読むことができません。(編集結果には問題ない)

「(編集結果には問題ない)」に問題ありました。カーソル移動によって挿入文字が
消せなくなり、BOXの中身が消えるようになってしまいます。
「(BOX選択→挿入後、Backspaceしなければ問題ない)」ということになります。

[ ]
RE:37130 秀丸リーダーの読み上げマクロにNo.37131
秀まるお2 さん 19/02/18 13:11
 
 いろいろ説明いただきありがとうございます。

 今ちょっと僕の方に余裕が無くて対応が遅くなってしまってたので、すみませんが
秀丸エディタの担当の方に引き継ぎさせていただきます。基本的にはK'zawaさんのマ
クロそのまま使わせていただく方向になるかと思いますけども。

[ ]
RE:37130 秀丸リーダーの読み上げマクロにNo.37141
秀丸担当 さん 19/02/21 12:46
 

秀丸リーダーのマクロを添付させていただいたバージョンの件で、以前にもサポート
で連絡させていただいたメールから連絡させていただこうと思います。"taki@maruo.
co.jp"からメールします。(もし以前と違うメールアドレスになっていたらこのメー
ルにお知らせください)


[ ]
RE:37130 秀丸リーダーの読み上げマクロにNo.37159
秀丸担当 さん 19/02/26 09:42
 

複数選択対応版のマクロを添付させていただいたバージョンとして、V3.06を公開し
ました。
以下のページからダウンロードできます。
https://hide.maruo.co.jp/software/hmread.html

[ ]