マクロで行番号を知る方法は?No.02435
Makkie さん 01/10/02 18:16
 
Makkie と申します。

初歩的な質問なのですが、マクロ実行中に

    秀丸が現在表示している画面において、画面の一番上に表示されている行
    の、ワープロ的に計算した行番号

を知りたいのですが、簡単に知るにはどうすれば良いのでしょうか。

マクロヘルプをあちこち見ても分からないので投稿しました。ご教示いただける
と幸いです。

[ ]
RE:02435 マクロで行番号を知る方法は?No.02436
Arimac さん 01/10/02 18:52
 
「内部的な値を表現するキーワード」->「カーソル関連」->「y」
では駄目?(^^;

[ ]
RE:02435 マクロで行番号を知る方法は?No.02437
ひろ さん 01/10/02 19:11
 
 Makkie さん今日は、ひろです。
>     秀丸が現在表示している画面において、画面の一番上に表示されている行
>     の、ワープロ的に計算した行番号
 goscreentop と y を組み合わせればよいです。

[ ]
RE:02437 マクロで行番号を知る方法は?No.02438
Makkie さん 01/10/03 09:24
 
> Makkie さん今日は、ひろです。
>>     秀丸が現在表示している画面において、画面の一番上に表示されている行
>>     の、ワープロ的に計算した行番号
> goscreentop と y を組み合わせればよいです。

Makkie です。
goscreentop は、一般的な動作としては「画面の一番上に表示されている行に
カーソルを移動させる命令」ではないですよね。[その他]→[コマンド一覧]→
[カーソル移動系]→[画面の先頭に移動]と同じ動きだから、私の環境では、一番
上の行から2行下とか3行下にカーソルが動きます。ファイルの先頭を見ている
ときには、本当の先頭に動きますけど・・・。何らかの環境設定で、この動作を
画面の本当の最初の行に常に動かすようにできるのでしょうか。


[ ]
RE:02438 マクロで行番号を知る方法は?No.02439
ひろ さん 01/10/03 12:29
 
 Makkie さん今日は、ひろです。
> goscreentop は、一般的な動作としては「画面の一番上に表示されている行に
> カーソルを移動させる命令」ではないですよね。
 ちょっと言葉足らずだったようですね。
 言葉で説明するのはかえって面倒なので、ソースを記述します。
call windowTopY;
message str(##return);
endmacro;

windowTopY:
  ##bx = x;
  ##by = y;
  goscreentop;
  ##y = y - 2;//これがみそ
  moveto ##bx,##by;
  if( ##y < 0)return 0;
  else return ##y;

[ ]
RE:02439 マクロで行番号を知る方法は?No.02440
Arimac さん 01/10/03 12:50
 
普段は行番号を表示していないので画面の一番上というのを
誤解しました(^^;

goscreentop;はdisabledraw;をしていると本当の画面の
一番上に行に行くみたいです。

    #save_x = x;
    #save_y = y;
   
    disabledraw;
    goscreentop;
    #screentop_y = y;
    moveto #save_x, #save_y;
    enabledraw #screentop_y;
   
    message str(#screentop_y);

[ ]
RE:02438 マクロで行番号を知る方法は?No.02441
TAKA さん 01/10/03 12:59
 
TAKA です。

>goscreentop は、一般的な動作としては「画面の一番上に表示されている行に
>カーソルを移動させる命令」ではないですよね。[その他]→[コマンド一覧]→
>[カーソル移動系]→[画面の先頭に移動]と同じ動きだから、私の環境では、一番
>上の行から2行下とか3行下にカーソルが動きます。ファイルの先頭を見ている
>ときには、本当の先頭に動きますけど・・・。何らかの環境設定で、この動作を
>画面の本当の最初の行に常に動かすようにできるのでしょうか。

「画面の先頭に移動」は、秀丸のWindowに入る行数によって動きが
違います。マクロも同様です。

試しに、秀丸のWindowの縦幅をいろいろ変更して「画面の先頭に移
動」してもらえれば分かると思います。
縦幅が数行であれば1行目に、少し長くなると2行目に、もう少し
長くなると3行目というように秀丸側でこれくらいに移動した方が
親切であろうという位置に移動します。

私は、表示内の1行目を取得する術はないと思います。


#何故、表示内の1行目を知りたいのだろう?

[ ]
RE:02440 マクロで行番号を知る方法は?No.02442
TAKA さん 01/10/03 13:09
 
どもっ、TAKA です。

>goscreentop;はdisabledraw;をしていると本当の画面の
>一番上に行に行くみたいです。

本当だ。

これって仕様なのでしょうか? > 秀丸担当さん
#返答がなかったら、「hidesoft.2」で聞いてみよう。

[ ]
RE:02441 マクロで行番号を知る方法は?No.02443
ひろ さん 01/10/03 13:40
 
 TAKA さん今日は、ひろです。
> 「画面の先頭に移動」は、秀丸のWindowに入る行数によって動きが
> 違います。マクロも同様です。
 これは知りませんでした。
 Arimac さんの「hidesoft.4:02440」のご発言を利用すると、末尾
のようなマクロで可能のようですね。disabledraw を使うと、立幅に左右さ
れないようです。
//-------------------------------------------------------------------
call windowTopY;
message str(##return);
endmacro;

windowTopY:
  ##bx = x;
  ##by = y;
  disabledraw;
  goscreentop;
  ##wintopy = y;
  moveto ##bx,##by;
  enabledraw ##wintopy;
  return ##wintopy;

[ ]
RE:02441 マクロで行番号を知る方法は?No.02444
Makkie さん 01/10/03 18:12
 
>TAKA です。
>
>
>「画面の先頭に移動」は、秀丸のWindowに入る行数によって動きが
>違います。マクロも同様です。
>
>試しに、秀丸のWindowの縦幅をいろいろ変更して「画面の先頭に移
>動」してもらえれば分かると思います。
>縦幅が数行であれば1行目に、少し長くなると2行目に、もう少し
>長くなると3行目というように秀丸側でこれくらいに移動した方が
>親切であろうという位置に移動します。
>
>私は、表示内の1行目を取得する術はないと思います。
>

Makkie です。

おっしゃるように、画面の表示行数によって1〜3行に変化するので、どうした
ものかと思案してました。60行ぐらい表示すると4行ぐらいになるやしれませ
ん(実際は使わないでしょうが)。
Arimacさんがご指摘のように disabledraw → goscreentop というシーケ
ンスで判別可能なようです。これには気づきませんでした。disabledrawが秀丸
の動きに影響を与えるというのも変な感じですが・・・・・・。とりあえずこれ
で行くことにします。

Arimacさん、ひろさんを含め、どうも有り難うございました。

>#何故、表示内の1行目を知りたいのだろう?

これは、マクロ起動  →  disabledraw →  たくさんの処理 →  enabledrawと
いう流れにおいて、最終的にマクロ起動時の画面状態に(1行のスルロールもさ
せずに)戻したいからです。


[ ]
RE:02444 マクロで行番号を知る方法は?No.02445
TAKA さん 01/10/03 21:59
 
TAKA です。

>これは、マクロ起動  →  disabledraw →  たくさんの処理 →  enabledrawと
>いう流れにおいて、最終的にマクロ起動時の画面状態に(1行のスルロールもさ
>せずに)戻したいからです。

なるほど、マクロとしてすごく綺麗ですね。

[ ]
RE:02442 マクロで行番号を知る方法は?No.02461
秀丸担当 さん 01/10/05 18:02
 
>>goscreentop;はdisabledraw;をしていると本当の画面の
>>一番上に行に行くみたいです。

disabledraw時のgoscreentopは、もともとバグでした。
disabledraw直後には本当の画面の一番上という期待した値が
得られますが、直後でないとどんな動作をするかわかりません。
とりあえず次バージョンV3.09ではこの問題は保留とし、
今後対策を考えたいと思います。

[ ]
RE:02461 マクロで行番号を知る方法は?No.02467
Makkie さん 01/10/06 09:25
 
>
>disabledraw時のgoscreentopは、もともとバグでした。
>disabledraw直後には本当の画面の一番上という期待した値が
>得られますが、直後でないとどんな動作をするかわかりません。
>とりあえず次バージョンV3.09ではこの問題は保留とし、
>今後対策を考えたいと思います。
>

Makkie と申します。

そもそもこの問題の原因は、マクロヘルプに「enabledraw文のパラメ
タで画面の一番上の行番号(ワープロ的に計算した行番号)を指定し
てください」とあるように

  ・画面の一番上の行番号、という概念をマクロの仕様に持ち込んだ

  ・しかしながら、画面の一番上の行番号を取得する手段が(一見し
    たところ)見当たらない
       ( disabledraw; goscreentop; の現状での動作はいかにもバ
         グっぽいし、disabledraw で秀丸の動きが変わるということ
         自体、不安)

という、仕様上の不都合点があるからだと思われます。

従って対応策としては
(1)現在の画面の一番上の行番号を取得できる「内部的な値を表現
      するキーワード」を新設する
          ( screentopy というような・・・・)
(2)disabledraw; goscreentop; の動作は disabledraw がない場合
      と同じにする
というのが、もっともよいと思いますが・・・。(2)による非互換発
生の影響が大きすぎるときには、その対策も必要だと思います。

[ ]
RE:02467 マクロで行番号を知る方法は?No.02468
Arimac さん 01/10/06 17:49
 
>そもそもこの問題の原因は、マクロヘルプに「enabledraw文のパラメ
>タで画面の一番上の行番号(ワープロ的に計算した行番号)を指定し
>てください」とあるように
>
>  ・画面の一番上の行番号、という概念をマクロの仕様に持ち込んだ
>
>  ・しかしながら、画面の一番上の行番号を取得する手段が(一見し
>    たところ)見当たらない

そうだと思います。

>       ( disabledraw; goscreentop; の現状での動作はいかにもバ
>         グっぽいし、disabledraw で秀丸の動きが変わるということ
>         自体、不安)

ヘルプには「goscreentop 画面の先頭に移動」と書いてあるのに
disabledraw;していないと本当の画面の先頭に移動しないという
方がバグだと思います。

実際には、表示している場合は(使用者の利便を図って)カーソル
位置自動補正機能が働いて、本当の画面の先頭に移動しないという
考え方だと思ってました。

ヘルプが仕様ではないにしても、仕様書というものがあったら
見てみたいですね。

[ ]
RE:02468 マクロで行番号を知る方法は?No.02469
ひろ さん 01/10/06 19:56
 
 Arimacさん今日は、ひろです。
> ヘルプには「goscreentop 画面の先頭に移動」と書いてあるのに
> disabledraw;していないと本当の画面の先頭に移動しないという
> 方がバグだと思います。
 そうでしょうか。わたしは、マクロヘルプの「画面の先頭に移動」は、あ
くまで秀丸のコマンドとしての「画面の先頭に移動」だと思いました。だから
> >disabledraw時のgoscreentopは、もともとバグでした。
という回答になるのだと思います。

 マージンの決定方法が解れば、windowheight 等と組み合わせれば、計算
できると思うのですが。

[ ]
RE:02469 マクロで行番号を知る方法は?No.02470
Arimac さん 01/10/06 21:11
 
> そうでしょうか。わたしは、マクロヘルプの「画面の先頭に移動」は、あ
>くまで秀丸のコマンドとしての「画面の先頭に移動」だと思いました。だから
>> >disabledraw時のgoscreentopは、もともとバグでした。
>という回答になるのだと思います。

秀丸のコマンドの方にも「実際には画面の先頭には移動しません」
とは書いてありませんが。

それと一度「動作環境」の「カーソル」の
「スクロールしてもカーソル位置は固定」のチェックをON
にしてスクロールによってカーソル位置を「画面の先頭」になる
位置にしてみて下さい。出来るでしょう(^^;

画面の表示位置はユーザーが見やすいようにエディタが適当に
調整するものだと思いますが、ユーザーが指示した位置に表示上
の都合でカーソルが行かないのは変だと思います。
例えばタグジャンプで指定した行がたまたま「画面の先頭」だった
場合にカーソルがその行に行かないのと同じじゃないですか。

[ ]
RE:02470 マクロで行番号を知る方法は?No.02472
ひろ さん 01/10/07 12:09
 
 Arimacさん今日は、ひろです。
> 秀丸のコマンドの方にも「実際には画面の先頭には移動しません」
> とは書いてありませんが。
 だけど、Arimacさんご自身も仰っているようにその方が便利で
しょう(^^)。

> 「動作環境」の「カーソル」の
> 「スクロールしてもカーソル位置は固定」のチェックをON
> にしてスクロールによってカーソル位置を「画面の先頭」になる
> 位置にしてみて下さい。出来るでしょう(^^;
 この方法は画面の外にすら移動できるので、例外ですよ(^^)。このような
例外を除けば、名称が何であれ、余裕をもって移動する方がユーザに易しい
インターフェースだと思います。(マクロの diabkedraw も、画面が見えな
いのだから例外でよいと思います。)

> ユーザーが指示した位置に表示上
> の都合でカーソルが行かないのは変だと思います。
 そうでしょうか?
 仮に本当の意味での画面先頭に移動したあと、上にカーソルを移動してい
る場合、どのタイミングで余裕を持たせるのでしょう? 上に移動する限り、
余裕は持たせないのでしょうか? それともどこかの時点で一気に余裕を持た
せるのでしょうか? どちらになっても、私には違和感があります。

 また
> 例えばタグジャンプで指定した行がたまたま「画面の先頭」だった
> 場合にカーソルがその行に行かないのと同じじゃないですか。
この例えはわからない。

 ところで、特にマージンの計算方法が自信がありませんが、enabledraw
の状態でも、次のようなマクロでうまくいきませんかね。
//-------------------------------------------------------------------
call WinTop;
message str(##return);
endmacro;

WinTop://disabledraw を実行しなくとも、画面の先頭 の y が解る?
  call TopMargine;
  if( ##return >= y )return 0;
  ##x = x;
  ##y = y;
  goscreentop;
  ##wintop = y;
  moveto ##x,##y;
  return ##wintop - ##return;

TopMargine://calculating top margin?
  if( windowheight < 27){
    ##windowheight = windowheight - 1;
    return (##windowheight - ##windowheight%13)/13;
  }
  else{
    ##windowheight = windowheight - 14;
    return (##windowheight - ##windowheight%14)/14 + 1;
  }

[ ]
RE:02472 マクロで行番号を知る方法は?No.02473
Arimac さん 01/10/07 18:23
 
>> 「動作環境」の「カーソル」の
>> 「スクロールしてもカーソル位置は固定」のチェックをON
>> にしてスクロールによってカーソル位置を「画面の先頭」になる
>> 位置にしてみて下さい。出来るでしょう(^^;
>  この方法は画面の外にすら移動できるので、例外ですよ(^^)。このような
> 例外を除けば、名称が何であれ、余裕をもって移動する方がユーザに易しい
> インターフェースだと思います。(マクロの diabkedraw も、画面が見えな
> いのだから例外でよいと思います。)

ここで言いたいのは、カーソルが本当の画面の先頭に行っても
秀丸エディタの動作は何も破綻しないということです。
disabledraw中というのはユーザーが直接操作しているわけではないので
ユーザーに優しいインターフェィスである必要はないと思うのです。

>> ユーザーが指示した位置に表示上
>> の都合でカーソルが行かないのは変だと思います。
>  そうでしょうか?
>  仮に本当の意味での画面先頭に移動したあと、上にカーソルを移動してい
> る場合、どのタイミングで余裕を持たせるのでしょう? 上に移動する限り、
> 余裕は持たせないのでしょうか? それともどこかの時点で一気に余裕を持た
> せるのでしょうか? どちらになっても、私には違和感があります。

秀丸エディタの動作として一貫性を保つなら、カーソルは本当の
画面の先頭に行くが、画面はスクロールダウンしてカーソル位置は
マージンの効いた位置になるというのが筋でしょうか?

>  また
>> 例えばタグジャンプで指定した行がたまたま「画面の先頭」だった
>> 場合にカーソルがその行に行かないのと同じじゃないですか。
> この例えはわからない。

やってみて下さい。上に書いたような動作になりますよ(^^;

[ ]
RE:02473 マクロで行番号を知る方法は?No.02474
ひろ さん 01/10/08 13:35
 
 Arimacさん今日は、ひろです。
> ここで言いたいのは、カーソルが本当の画面の先頭に行っても
> 秀丸エディタの動作は何も破綻しないということです。
> disabledraw中というのはユーザーが直接操作しているわけではないので
> ユーザーに優しいインターフェィスである必要はないと思うのです。
 私はもともと、disabledraw 中のついては何も言っていません。「画面の
先頭に移動」という機能ついての意見です。ただ「turukame.3:00238」での
TAKA さんのように「disabledraw 中だけ動きが変わるのは変ではないか?」
という意見があるので、それはそれで理解できるというだけです。

> 秀丸エディタの動作として一貫性を保つなら、カーソルは本当の
> 画面の先頭に行くが、画面はスクロールダウンしてカーソル位置は
> マージンの効いた位置になるというのが筋でしょうか?
 筋はそうだと思います。しかし「画面の先頭に移動」するのに、画面が描
き変わってしまうのは、なにか変だと思います。それよりは今の仕様の方が
よいです。そもそも機能名が何であれ、厳密な意味での言葉の意味と、その
動作が異なっていても、ユーザが使いやすければそれでよいと思います。

> >> 例えばタグジャンプで指定した行がたまたま「画面の先頭」だった
> >> 場合にカーソルがその行に行かないのと同じじゃないですか。
> > この例えはわからない。
>
> やってみて下さい。上に書いたような動作になりますよ(^^;
 やっぱりわからない(;_;)。
 この場合でも、タグジャンプで該当行にいきますよね。そもそもタグジャ
ンプは、該当行が画面内に有ろうが無かろうが、ファイルを開いていようが
いまいが関係ないので、なぜここでの例になるのか解りません。

 Arimacさんは、disabledraw の状態も含めてどうなると自然に感じ
るのでしょうか?
 私の意見を纏めておくと、
(1)「画面の先頭/最後に移動」は現状の仕様でよい
(2)disabledraw は画面の書き換えを禁止しているので、その間は
goscreentop/end は本当の画面の先頭/最後に移動でもよいのではないか?
→TAKA さん
 しかし goscreenend は動作しないし、goscreentop も直後では画面先頭
だが、そうでないとどんな動作をするか不明とのことなので、早急な対処が
必要なんでしょうね(^^;。
(3)(2)について仕様変更になってもかまわないが、その場合、代わりに画面
の先頭行を知る何らかの方法が知りたい。->マクロのコマンドでなくてもよ
いから、windowheight 等からマージンを計算するなど代用方が欲しい。
ということです。

[ ]
RE:02474 マクロで行番号を知る方法は?No.02476
Arimac さん 01/10/08 21:16
 
disabledraw 中の goscreentop の使用で秀丸担当氏が
慌てているのは、単に画面が書き換えされないだけではなく
ファイルのどの位置(screentop)を表示しているかという
情報の更新も行われていないからなんではないかと思います。
enabledraw;で画面の一番上の行番号が必要なのはそのため
だろうと思います。
これからすると本当は disabledraw 中は goscreentop は
使ってはいけないんでしょうね。

>  Arimacさんは、disabledraw の状態も含めてどうなると
> 自然に感じるのでしょうか?

少ない法則に従った理路整然とした動作を自然に感じますが。
場合によって例外があるというのは人の意思が介在していて
自然じゃないです。また、プログラムを組む上では落とし穴
になって厄介です。

goscreentopの動作については自然な動作としては
・本当の画面の一番上にカーソルが行く。画面の表示位置は
 スクロールダウンしてカーソルはマージンが掛かった位置
 になる。
理由:gofiletop,golinetop,gowordtop等の同じ系統のコマンドは
 カーソルの移動先がはっきりしているのに対し、
 (現状の)goscreentopはあいまい。

(秀丸エディタとして)自然ではないけど自分の希望する動作
としては
・本当の画面の一番上にカーソルが行く。画面の表示位置は
 変わらない。カーソルを移動すると画面の表示位置は
 スクロールダウンしてカーソルはマージンが掛かった位置
 になる。
理由:そんなにマージンに拘らなくてもいいんじゃないですか?(^^;
(昔使ってたWindexPRO68Kというエディタはこうだったような
 気がするし)

現実的には、いまさら仕様を変えるほど重大な事じゃないし
本当の screentop の行番号を取得するキーワードの追加と
disabledraw 中は goscreentop, goscreenend の使用は
控えるということでよいのではないのでしょうか?
(現状では disabledraw 直後に限り goscreentop で
本当の画面の一番上の行番号が分かるということで・・・)

[ ]
RE:02476 マクロで行番号を知る方法は?No.02478
ひろ さん 01/10/09 00:19
 
 Arimacさん今日は、ひろです。
> 少ない法則に従った理路整然とした動作を自然に感じますが。
<中略>
>  (現状の)goscreentopはあいまい。
 そういった意味では、disabledraw 状態はあいまいさが残っていますね。
(disabledraw でなければ、マージンは除外して画面先頭に移動なので、あ
いまいさは無い。マージンの計算方法が解ればなあ〜。)

> 現実的には、いまさら仕様を変えるほど重大な事じゃないし
> 本当の screentop の行番号を取得するキーワードの追加と
> disabledraw 中は goscreentop, goscreenend の使用は
 goscreentop はともかく、goscreenend は動かなかったりして(^^;。
 Arimacさんは、disabledraw 中での動きが Ver.3.09β7 の動作な
らよいわけですね。やはりどちらにしても、画面の先頭行を知る方法が欲し
いということで、よろしくお願いします。→秀丸担当さん。

[ ]