moveto系で動かなかったときのresultがfalNo.03152
たけとり さん 09/08/19 00:18
 
 バージョンアップ、お疲れ様です。
 ベータ7でもそうなのですが(いつからそうなったのかわからないのですが)。

golinetop2;
while(result){
 moveto2 0, lineno + 1;
}

といったようなマクロで、目的地(この例だと次の行の先頭)がない場合、resultが
falseにならないのですが、再現しますでしょうか。
 moveto系(moveto, moveto2, movetolineno)が同様の動作を示します。
 right,leftなどは、動けなくなったらきちんとfalseを返すのでwhileループが終了
します。

 よろしくお願いします。

[ ]
RE:03152 moveto系で動かなかったときのreNo.03153
Iranoan さん 09/08/19 00:30
 
 たけとりさん今日は、Iranoan です。
> golinetop2;
> while(result){
>  moveto2 0, lineno + 1;
> }
>
> といったようなマクロで、目的地(この例だと次の行の先頭)がない場合、resultが
> falseにならないのですが、再現しますでしょうか。
 再現はするのですが、おそらくこれは昔からの仕様です。なぜなら、ヘルプ
の「resultについての注意事項」に
> 以下の文は例外的に(現在の秀丸エディタに限って)resultの値を書き換えません。
<snip>
> moveto
> movetolineno
と有るからです。moveto2 は、単に抜けているだけだと思います。

[ ]
RE:03153 moveto系で動かなかったときのreNo.03157
秀丸担当 さん 09/08/19 09:39
 

Iranoanさんの言われる通り、仕様ということでお願いします。
moveto2はヘルプの記載に漏れていました。
ご指摘ありがとうございます。
ヘルプを修正しておきます。

[ ]
RE:03157 moveto系で動かなかったときのreNo.03164
IKKI さん 09/08/19 15:30
 
こんにちは。ユーザの IKKI です。横から失礼します。

> > 以下の文は例外的に(現在の秀丸エディタに限って)resultの値を書き換えませ
>ん。

この際、moveto 系の文も result を更新するようにしてしまってはどうでしょうか?

[ ]
RE:03164 moveto系で動かなかったときのreNo.03166
秀丸担当 さん 09/08/19 17:59
 

>この際、moveto 系の文も result を更新するようにしてしまってはどうでしょうか?

この際そうしてしまってもいいような気がします。
互換性ということもありますが、どこでも動きそうな簡単なマクロだと思って作
ったとして、旧バージョンで動かなかったり、秀丸メールで動かなかったりとい
うことは起きると思うので、慎重に考えたいと思います。

[ ]
RE:03166 moveto系で動かなかったときのreNo.03223
たけとり さん 09/08/21 14:58
 
20日の午前中にgmailから送信したのですが、配信されなかったようなのでWebから再
投稿します。重複していたらすみません。

おはようございます。

2009年8月19日17:59 秀丸担当 <xxxxxxxxxxxxxxxxxxx@maruo.co.jp>:
>
>>この際、moveto 系の文も result を更新するようにしてしまってはどうでしょうか?
>
> この際そうしてしまってもいいような気がします。
> 互換性ということもありますが、どこでも動きそうな簡単なマクロだと思って作
> ったとして、旧バージョンで動かなかったり、秀丸メールで動かなかったりとい
> うことは起きると思うので、慎重に考えたいと思います。
>
>

ヘルプには、

他にもあるかもしれないですが、少なくとも以上の文はresultの値を書き換えません。
しかし、そのことに依存したマクロは将来動作がおかしくなる可能性があるので、な
るべくresultの値は変数に代入して使うよう修正してください。

とあるので、resultを返すというのは、どちらかいうと「本来(?)に戻した」とい
うことになるのではないでしょうか。

それも含めての互換性の維持ということであれば、私の愚考ですが...

・getresultexを用いて。
 getresultex(0)で「resultと同じ」結果を返すのではなく、文字通り拡張して「re
sultを書き換えない文のresult」も返すとか。

・関数にしてしまう。
 そうすると、
 while(moveto2(0, #l)){
   ...
 }
 のようなこともできるので、より便利に。

などというのはいかがでしょうか。

# gofiletopなんかも更新しないですね。まぁ、確実に移動するんでしょうけど。(∀
`*ゞ)

---以下の内容はコミュニテックス会議室システムにより付加されました。
本文中のメールアドレスは伏せ字に変換されました。伏せ字にしたくない場合
はメールアドレスを""で囲んで書き込んでください。

[ ]
RE:03223 moveto系で動かなかったときのreNo.03227
秀丸担当 さん 09/08/21 15:56
 

>とあるので、resultを返すというのは、どちらかいうと「本来(?)に戻した」とい
>うことになるのではないでしょうか。

そういうことですが、互換性に配慮して現状のままになっていたということでお
願いします。

>・getresultexを用いて。

内部的にresultを二重に持つことになり、問題が起きかねないのでやめておこう
と思います。


>・関数にしてしまう。

これは問題無いと思います。
上位にだけある機能になり、下位では実行できないので互換性も問題無いと思い
ます。
やるかどうかわかりませんが、そういうネタとして参考にさせていただきます。

[ ]
RE:03223 moveto 系での result についてNo.03228
Iranoan さん 09/08/21 15:58
 
 今日は、Iranoan です。
> >>この際、moveto 系の文も result を更新するようにしてしまってはどうでしょ
>うか?
> >
> > この際そうしてしまってもいいような気がします。
> > 互換性ということもありますが、どこでも動きそうな簡単なマクロだと思って作
> > ったとして、旧バージョンで動かなかったり、秀丸メールで動かなかったりとい
> > うことは起きると思うので、慎重に考えたいと思います。
 私も moveto 系統でも result が書き換わると便利だと思ったのですが、
moveto 5000, y;
等の扱いはどっち? x 方向で 5000 はありえませんけど。

 また、それ程大きくなくとも、
moveto width, y;
は? つまり freecursor == true は OK だけど、freecursor == false ではど
うするのでしょう? (freecursor == true でも [EOF] より後ろだと同じ) x
方向にずれている時の result は
* とにかく移動しているので true?
  →それでは、元々行末にあったときは false?
* それとも、x 方向はずれているので false?

 これらを考えると、「結局 y 方向に動いているか?」しか意味が無いですよ
ね。それならプログラミングの作法から考えても、そもそも result で判定す
るのではなく、linecount, linecount2 と比較して判定するのが良い気がして
きました。元々移動先が存在していない時の動きは、不定であっても不思議で
はなく、移動を試みる前に、移動先が存在するか確認するのがベターだろうと。

[ ]
RE:03227 moveto系で動かなかったときのreNo.03232
たけとり さん 09/08/21 17:06
 
>やるかどうかわかりませんが、そういうネタとして参考にさせていただきます。

よろしくお願いします。

[ ]
RE:03228 moveto 系での result についてNo.03234
たけとり さん 09/08/21 17:25
 
こんにちは。

>moveto 5000, y;
>等の扱いはどっち? x 方向で 5000 はありえませんけど。

カーソル移動系で返ってくるresultの意味は、
移動したらresultではないでしょうか。

>るのではなく、linecount, linecount2 と比較して判定するのが良い気がして

恒常的に使える手法としては、linelen系ですよね。
# linecount系は新規作成ファイルでは常に1になりますので...。
# まぁ、対処方法はいくらでもあるでしょうけど。
# というよりは、この挙動(linecount系は新規作成ファイルでは常に1)を修正してほ
しい気が...
 :
 :
 :
と、ここまで書いてテストしたら、新規作成ファイルでもちゃんとした値を返すんで
すね。

ということで、マニュアルの誤記報告です。> 秀丸担当者様。
以下の「新規作成状態の場合は1を返します。」は、「新規作成状態の場合は1を返
します。(V8.00未満)」でしょうか?

linecount    現在のファイルの、ワープロ的(折り返しも一行とする)に計算した
行数を表します。新規作成状態の場合は1を返します。
linecount2    現在のファイルの、エディタ的(改行だけを数える)に計算した行数
を表します。新規作成状態の場合は1を返します。

[ ]
RE:03234 moveto 系での result についてNo.03240
秀丸担当 さん 09/08/21 17:57
 

>と、ここまで書いてテストしたら、新規作成ファイルでもちゃんとした値を返すんで
>すね。

新規作成時は常に 1 だと思います。
試してみましたが linecount, linecount2 とも 1 でした。
これが 0 になるケースがあるということでしょうか。
どういうときに 1 にならないか、詳しいことがもしわかれば教えていただけると
助かります。

[ ]
RE:03234 moveto 系での result についてNo.03241
たけとり さん 09/08/21 18:01
 
あちゃ(ノ∀`)

>移動したらresultではないでしょうか。
>
移動したらresult==trueではないでしょうか。

[ ]
RE:03234 moveto 系での result についてNo.03245
Iranoan さん 09/08/21 18:03
 
 たけとりさん今日は、Iranoan です。
> カーソル移動系で返ってくるresultの意味は、
> 移動したらresultではないでしょうか。
 そうですね。
 ただ
down #n;
で動いたら常に true というのも結構違和感が有ります。#n 行動いていると
は限らないので。
 まあ動いたら true なので、moveto 系も true で統一していても良いので
しょうが。

> 以下の「新規作成状態の場合は1を返します。」は、「新規作成状態の場合は1を返
> します。(V8.00未満)」でしょうか?
>
> linecount    現在のファイルの、ワープロ的(折り返しも一行とする)に計算した
> 行数を表します。新規作成状態の場合は1を返します。
> linecount2    現在のファイルの、エディタ的(改行だけを数える)に計算した行数
> を表します。新規作成状態の場合は1を返します。
 これは、新規作成直後の事を言っているのだと思います。まあ、どちらにし
ても、あえて触れる必要がない気もしますが。
 ##単なる過去の残骸なのかなあ〜。とにかくマニュアルからは削除しよう(^^)。

[ ]
RE:03240 moveto 系での result についてNo.03247
Iranoan さん 09/08/21 18:15
 
 秀丸担当さん今日は、Iranoan です。
> 新規作成時は常に 1 だと思います。
> 試してみましたが linecount, linecount2 とも 1 でした。
 多分、「新規作成時」とは「(無題)」のことだと思います。末尾のマクロで、
1 を表示すると読めたのだと思います。(正しく 2 となる)
//------------------------------------------------------------
newfile;
insert "\n";
message str( linecount2 );

[ ]
RE:03240 moveto 系での result についてNo.03277
たけとり さん 09/08/22 11:28
 
こんにちは。

>これが 0 になるケースがあるということでしょうか。

件の文章は、「新規作成直後、EOFしか表示されていない状態(0KB)でも1を返
す。」ということですよね。
誤解していて(Iranoanさんも書いておられますが)新規作成時は行数(改行数)に
関わらず “常に” 1を返すと理解していました。
失礼しました。

[ ]
RE:03277 moveto 系での result についてNo.03293
秀丸担当 さん 09/08/24 09:29
 

>件の文章は、「新規作成直後、EOFしか表示されていない状態(0KB)でも1を返
>す。」ということですよね。
>誤解していて(Iranoanさんも書いておられますが)新規作成時は行数(改行数)に
>関わらず “常に” 1を返すと理解していました。

そういうことでしたか。
確かに誤解を招くかもしれないです。
注意書きを改善しておこうと思います。

[ ]
RE:03293 moveto 系での result についてNo.03338
たけとり さん 09/08/25 18:44
 
>注意書きを改善しておこうと思います。

ベータ8にて確認しました。
これなら、私でも間違えないと思います。
お手数をおかけしました。

[ ]