マクロの動作がよく分かりませんNo.06070
可愛村のたかし さん 09/03/15 14:19
 
下のような文に、文末に日時を挿入するマクロに挑戦してみました。

==原文==
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

==目標の整形==
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
                                        ---------------------
                                        09/03/15(日) 13:31:44
                                        ---------------------

++最初のマクロ
gofileend;
#y = lineno ;
moveto 40,#y+1 ;
insert "---------------------" ;
moveto 40,#y+2 ;
insert date + " " + time ;
moveto 40,#y+3 ;
insert "---------------------" ;
endmacro;

上のマクロで整形後の文。
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
---------------------09/03/15(日) 13:40:---------------------10

なぜだか分からないが、以下のようにすると、希望の整形ができた。
gofileend;
#y = lineno ;
insertreturn;//?1
moveto 40,#y-1 ;//?2
insert "---------------------" ;
insertreturn;//?3
moveto 40,#y ;//?4
insert date + " " + time ;
insertreturn;//?5
moveto 40,#y+1 ;//?6
insert "---------------------" ;
endmacro;

{ //? } の位置の文がなぜ必要なのかがどなたか解説していただけませんか?
 改行の挿入、Yの座標値に試行錯誤しました。{lineno} が #yに渡す値はいくら
になるのでしょう? 上書き、挿入モードといった設定が影響しているのでしょうか?
 


[ ]
RE:06070 マクロの動作がよく分かりませんNo.06071
きいろいまふらあ さん 09/03/15 14:43
 
たまにマクロを書く、きいろいまふらあと申します。

> 改行の挿入、Yの座標値に試行錯誤しました。{lineno} が #yに渡す値はいくら
>になるのでしょう? 上書き、挿入モードといった設定が影響しているのでしょう
>か?

「上書きモード」「挿入モード」も関係すると思いますが、そのほかに、秀丸の
マクロでは、座標(何行目のどの位置か)を表すのに、

・画面上での見た目を基準とした x, y(折り返し桁数の影響を受ける)
・(折り返しではない)改行を基準とした column, lineno

の2種類があります。また、カーソル位置を移動するコマンドにも

・x, y に対応する moveto
・column, linenoに対応する movetolineno

があります。これらの意味を一度マクロヘルプで確認されるとよいと思います。

正確な言い方ではないですが、「movetoを使うときの座標はx, y(を元にした数
値)で指定、movetolinenoを使うときは lineno, column(を元にした数値)で
指定する(のが常道)」ということです。

また、#yに代入された値を確認するには、

>#y = lineno ;

の次に

message "#y = " + str(#y);

などという行を入れておくとよいです。
(#yは数値変数ですので、表示するためにstr()で文字に変換してます。)
私がマクロを作るときにはよく使う方法です(messageでなくmenuでも可)。
マクロの動作が安定したら、行ごと消してしまいます。

ご参考になれば幸いです。

[ ]
RE:06070 マクロの動作がよく分かりませんNo.06072
h-tom さん 09/03/15 15:27
 

h-tom です。

>{ //? } の位置の文がなぜ必要なのかがどなたか解説していただけませんか?
基本的に、文字のない箇所に、カーソル移動することはできないからです。
(x方向は、フリーカーソルが有効の場合、移動は可能ですが、y方向は移動
できない)
新規ファイルを開き、カーソルを下に移動させても、移動できないのと同じ。

[ ]
RE:06070 マクロの動作がよく分かりませんNo.06073
K'zawa さん 09/03/15 15:27
 
可愛村のたかしさん、こんにちは。
K'zawaです。

きいろいまふらあさんの話に付け加えさせていただきますと、
改行よりも右に移動できるかどうかは、フリーカーソルモードかどうかに依存し
ます。
フリーカーソルモードでなら、moveto等で移動できますが、
[EOF]は超えられません。
うまく行ったマクロは、insertreturnで行を増やして、戻ってそこに挿入する
ことになっているようです。

余談ですが、
insertreturnは、enterキーを押したときの動作をするコマンドで、
設定依存です。
設定に依存しないで改行を入れるには、insertで"\n"を書き込みます。
改行より右に文字列を書き入れた時、間にスペースが入るかタブかも設定依存
です。

[ ]
RE:06073 素早い回答に感謝します。No.06074
可愛村のたかし さん 09/03/15 17:15
 
 きいろいまふらあさん、h-tomさん、 K'zawaさん、

 レスを頂いた皆さんに、まとめてお礼いたします。
 
 マクロヘルプを読んでいるうちに混乱してきのです。
 ・x, y に対応する moveto
・column, linenoに対応する movetolineno

 似たような機能の動作があって、何が最適なのか迷ってしまいます。

 一つ一つの動作を確認しながら作るのが、かえって早くできるというのが最近に経
験です。プログラミングとは無縁でしたから、分からないことが多すぎて大変なので
すが、意図した動きが作れると嬉しいです。
 
 多くの人の助言が得られて助かりました。

[ ]