秀丸メールでmovetolinenoで元のヘッダ位No.25544
緒方聡 さん 08/10/18 00:27
 
お世話になってます。

問題と思われるので報告します。

【概要】
新規メールのヘッダ上で取得した column, lineno を引数に movetolineno 行っても、
元の位置に戻らない

【再現率】
3/3 (100%)

【環境】
秀丸メール 5.10

【再現手順】
1. 新規メール作成
2. To: の入力位置にカーソルを移動
3. 以下のマクロを実行

movetolineno column + 1, lineno;
endmacro;

【問題点】
本文最初に移動してしまう。

【期待する動作】
カーソルが移動しないこと。

【補足】
moveto x, y; の動作は期待通り。

[ ]
RE:25544 秀丸メールでmovetolinenoで元のNo.25545
アルビレオ さん 08/10/18 01:07
 
ユーザーのアルビレオです。

>【概要】
>新規メールのヘッダ上で取得した column, lineno を引数に movetolineno 行っても、
>元の位置に戻らない

マクロヘルプ「秀丸メールと秀丸エディタとのマクロ動作の違い」より
>moveto 0, 0; で、メール本文の先頭に移動します。
>moveto 0, -9999; で、メールのヘッダ部分の先頭に移動します。

テストしてみると、カーソルがヘッダ部にあるとき lineno は常に 0 でした。
これは仕様と考えた方がよさそうです。

もともとヘッダ部は SetHeader などによる変化が予測困難なので、ヘッダ部で
のカーソル位置は記録できないものだと割り切った方がいいでしょう。

[ ]
RE:25544 秀丸メールでmovetolinenoで元のNo.25546
Iranoan さん 08/10/18 01:41
 
 緒方聡さん今日は、Iranoan です。
 念の為お断りしておくと、開発者とは何の関わりも無い単なる一ユーザです。
> 秀丸メール 5.10
<snip>
> 2. To: の入力位置にカーソルを移動
> 3. 以下のマクロを実行
>
> movetolineno column + 1, lineno;
 秀丸メールの話ですよね。それなら仕様で、ヘッダ部では lineno は常に 0 です。
http://www.maruo.co.jp/turukame/1/x01062_.html#1063

[ ]
RE:25544 秀丸メールでmovetolinenoで元のNo.25547
緒方聡 さん 08/10/18 21:48
 
アドバイスいただいてありがとうございます。
このトピックは秀丸メールの会議室に書けばよかったんですね。

ヘッダ部での y の値には、適切な不の値が入っているので
lineno にも適切な不の値が入っていることを期待したわけですが
そうはならない仕様ということですか。

今は秀丸メールがない環境なので、確認できませんが
以下のような感じで回避できるんでしょうか。

if (y < 0) {
    $part = gettext(0, -9999, x, y);
    while (true) {
        #pos = strstr($part, "\n");
        if (#pos != -1) {
            $part = rightstr($part, strlen($part) - (#pos + 1));
            #lineoff = #lineoff + 1;
        } else {
            break;
        }
    }
}
movetolineno column + 1, lineno - #lineoff;

カーソルがヘッダにあってもなくても、
現在のカーソルと同じ位置に移動する処理です。
※ 動作確認をしていません

秀丸メールのマクロヘルプというものは見たことがありませんでした。

[ ]
RE:25547 秀丸メールでmovetolinenoで元のNo.25550
秀まるお2 さん 08/10/20 12:09
 
 lineno == 0の場合はyを覚えておくって作戦にすればいいんじゃないかと思い
ますけど。

    #lineno = lineno;
    #column = column;
    if( #lineno == 0 ) {
        #lineno = y;
        #column = x;
    }
    ...
    ... やりたい処理 ...
    ...
    // 元の位置に戻す処理
    if( #lineno <= 0 ) {
        moveto #column, #lineno;
    } else {
        movetolineno #column + 1, #lineno;
    }

[ ]
RE:25550 秀丸メールでmovetolinenoで元のNo.25552
緒方聡 さん 08/10/20 23:25
 
ちょっと説明が足りていませんでした。

私の例では、なぜ改行を数えているかというと、
エディタ的な行番号が知りたいからなんです
(そのために lineno を使ってます)。

ちょっとマクロ処理を見直してみて、解決しなければ
具体的な質問を別トピックでさせてもらおうと思います。

フォローありがとうございました。

[ ]