現在開いているテキストファイルを1行目かNo.41892
ひらひら さん 25/04/26 13:14
 
初歩的な質問で申し訳ございません。

現在開いているテキストファイルを1行目から走査して、messageで表示するマクロを
教えて頂けますでしょうか?
以下のような、内容のテキストファイルがあったら、「あああ」「いいい」「うう
う」と順にmessageで表示するコードになります。
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー
あああ
いいい
ううう
ーーーーーーーーーーーーーーーーーーーーーーーーーーーーーー

初歩的な質問で申し訳ございません。
何卒よろしくお願いします。

[ ]
RE:41892 現在開いているテキストファイルNo.41893
こみやんま さん 25/04/26 15:23
 
目的を達成するだけなら、以下みたいなのでしょうが...

// ----------------------------------------
#lineIx = 1;
#lineCount = linecount; // 改変対応用。評価を1回にする。

while(#lineIx <= #lineCount) {
    $lineText = getlinetext( #lineIx );
    message($lineText);
    #lineIx = #lineIx + 1;
}
// ----------------------------------------



ただ、メッセージボックスでボコボコだしてたら、
UI/UXが悪過ぎて実践では使用に耐えないので、普通は次のように

// ----------------------------------------
// デバッグ用にアウトプット枠に出す
debuginfo(2);

#lineIx = 1;
#lineCount = linecount; // 改変対応用。評価を1回にする。
#lineDigits = strlen(str(#lineCount));  // 全体の行数の桁数

while(#lineIx <= #lineCount) {
    $lineText = getlinetext( #lineIx );

    // 行の桁数で0埋め
    $lineFormatNumber = sprintf("%0"+str(#lineDigits) + "d", #lineIx);
    // 行番:テキスト内容
    $lineFormat = sprintf("%s:%s", $lineFormatNumber, $lineText);

    debuginfo($lineFormat);
   
    #lineIx = #lineIx + 1;
}
// ----------------------------------------

みたいにするんじゃないでしょうか。


AIの返答精度が高いJavaScriptで書いた場合は、

// ----------------------------------------

jsmode "WebView2\\" + currentmacrofilename;

js {
    // デバッグ用
    debuginfo(2);
   
    function getFormattedLineText(ix, lineText) {
        let lineFormatNumber = ix.toString().padStart(lineDigits, "0");
        let lineFormat = `${lineFormatNumber}:${lineText}`;
        return lineFormat;
    }
   
    const lineCount = linecount();       // 評価を1回にする。
    const lineDigits = lineCount.length;
   
    for(var ix = 1; ix <= lineCount; ix++) {
        let lineText = getlinetext(ix);
        let lineFormat = getFormattedLineText(ix, lineText);
        console.log(lineFormat);
    }
}

// ----------------------------------------

[ ]
RE:41892 現在開いているテキストファイルNo.41894
igus さん 25/04/26 16:45
 
//行ごとにメッセージ出すよ.mac

//gofiletop;
while(code!=eof){
  golinetop2;selectline 1;
  message getselectedtext();
  down;
}


[ ]
RE:41892 現在開いているテキストファイルNo.41896
こみやんま さん 25/04/26 20:37
 
サンプルみたいな実践力皆無なクロは別として

順次「行」を時間をかけて表示したい、といったことを
本当に「実践力があるもので」とするのは、
それなりに難易度が高いです。

理由としては、
```
マクロの実行時間がながければ長いほど、それを実行している間に、他のマクロの実
行が可能なこと
```
暗黙の当然の要件として入ってくるからです。

そうでなければ、該当マクロが実行されている間、
「秀丸エディタは一切さわりません」
みたいな意味不明なことになってしまいます。

これは現段階で秀丸のスクリプトで実現可能ではありますが、
それなりに難易度が高くなります。


// ----------------------------------------------

jsmode "WebView2\\" + currentmacrofilename;

js {

const fontName = fontname();

renderpanecommand({
    target: "MyMessagePanel",
    place: "top",
    size: 100,
    show: 1
});

// javascriptでdocumentに div タグの作成
const textDiv = document.createElement('div');

// レンダリングペインへの送信。
function sendRenderPane(ix, lineFormat) {
    // HTMLとして扱えるように、タグ内部テキストとして...
    textDiv.innerText = lineFormat;
   
    // HTMLタグごとレンダリングう枠へと送信。フォントも編集エリアのものを採
用しておこう。
    renderpanecommand({
        target: "MyMessagePanel",
        url: `data: text/html;charset=utf-8,<title>${ix} 行目</title><font f
ace="${fontName}" size="4">${textDiv.outerHTML}</font>`
    });
}

// レンダリングペインは見えてるの?
function isRenderPaneShow() {
    const isShow = renderpanecommand({
        target: "MyMessagePanel",
        get: "show"
    });
   
    return +isShow == 1;
}


// マクロを再実行した時には、前のをキャンセルする。
var timeoutHandler;
hidemaru.clearTimeout(timeoutHandler); // 再実行した時に前のを停止

function main() {
    function processLine(ix) {
        // 最後まで行ったら終わり
        if (ix > linecount()) {
            hidemaru.clearTimeout(timeoutHandler);
            outputAlert("全行終了しました。\r\n");
            return;
        }

        // レンダリング枠閉じたら終わり
        if (ix > 1 && !isRenderPaneShow()) {
            hidemaru.clearTimeout(timeoutHandler);
            outputAlert("ウィンドウ枠が閉じられました。");
            return;
        }
       
        // 該当行のテキストを加工し、レンダリング枠へと転送
        let lineText = getlinetext(ix);
        let lineFormat = getFormattedLineText(ix, lineText);
        sendRenderPane(ix, lineFormat);

        // 次の行を2秒後に
        timeoutHandler = hidemaru.setTimeout(processLine, 2000, ix+1);
    }

    timeoutHandler = hidemaru.setTimeout(processLine, 0, 1); // 最後の「1」
は1行目からのスタート

}

// 該当の行を「行番|文面」に加工。
function getFormattedLineText(ix, lineText) {
    const lineCount = linecount();
    const lineDigits = String(lineCount).length;
    let lineFormatNumber = ix.toString().padStart(lineDigits, "0");
    let lineFormat = `${lineFormatNumber}|${lineText}`;
    return lineFormat;
}


// 警告等、アウトプット枠
function outputAlert(msg) {
    var dll = loaddll("HmOutputPane.dll");
    dll.dllFuncW.OutputW(hidemaru.getCurrentWindowHandle(), msg + "\r\n");
}

main();

}


// ----------------------------------------------

[ ]
RE:41894 現在開いているテキストファイルNo.41897
igus さん 25/04/26 20:58
 
ちなみに今回の秀丸マクロを応用してアンドロイド端末でテキストを読み上げさせな
がら秀丸でテキストを確認、編集する例がこちらです。

http://pansy.s1010.xrea.com/2023/04/24/%e8%aa%ad%e3%81%bf%e9%80%9a%e3%81%97%e3%81%a7%e3%81%ae%e7%a2%ba%e8%aa%8d%e4%bd%9c%e6%a5%ad/

[ ]
RE:41897 現在開いているテキストファイルNo.41898
こみやんま さん 25/04/26 21:11
 
たとえば、
http://pansy.s1010.xrea.com/wp-content/uploads/2023/04/20230424.mp4

この実行中に、「他のマクロ」は実行可能に制作してありますか?
少なくとも他の秀丸エディタでのマクロ実行は可能になっていますか?

それとも実行中は、じっと眺めているだけになってしまいます?


[ ]
RE:41898 現在開いているテキストファイルNo.41899
igus さん 25/04/26 21:28
 
テキストの読み上げに合わせて秀丸でテキストを追っていくものでマクロ実行中は速
度を調整するくらいで別のマクロを実行することはできませんが、それで問題ないと
思ってます。

[ ]
RE:41899 現在開いているテキストファイルNo.41900
こみやんま さん 25/04/26 21:42
 
読み上げている間、当該の秀丸エディタだけではなく、
「他の秀丸エディタについてもマクロは動作しない」わけですから、
読み上げてる間、
他の「半分見聞きしながらテキスト作業」がロクに出来ないのではないでしょうか。

むしろ改善できるポイントであり、
秀丸が弱かった部分が9.22あたりで
大きく転換した部分です。


[ ]
RE:41900 現在開いているテキストファイルNo.41901
igus さん 25/04/26 21:54
 
当人が問題ないと思っている部分について、わざとややこしく考えるのはいかがなも
のでしょう?簡単に書けるマクロなら簡単に書いておいた方が、あとで使いまわすに
も便利だと思うのですが。


[ ]
RE:41901 現在開いているテキストファイルNo.41902
ひらひら さん 25/04/26 22:11
 
こみやんま様
igus様

ご回答頂き誠にご回答ありがとうございます。
私の拙い質問のため、やり取りを生じさせてしまい申し訳ございません。。

お二人が書いてくださったシンプルなコードの方が、こちらの想定していたものでし
た。
ただ、最終的にはレンダリング枠への描画に繋げていくことも考えていたので、こみ
やんま様が書いていただいた複雑なコードも助かります!
igus様も、「初心者にはシンプルなコードでいいのでは」というご配慮誠にありがと
うございます。

お二人共、お時間を割いて頂き誠にありがとうございました。

[ ]