行の最後のタブーだけを削除したいNo.09172
SunSolaris さん 20/02/23 23:49
 
 初めまして、行の最後にタブーが存在する時に、行の最後だけのタブーだけを削除
したいのですが?

(例)
15:01 ポラリスステークス ダート・右 1400m 曇 重 サラ系4歳以上 オープン (国
際) [指定] ハンデ 2100、840、530、320、210万円 [EOF]

(マクロの内容)
 golineend :
 if("\t" == true){
//行の最後にタブの有り無し判断
    backspace;  //Backspace
     }
else{
 right; //カーソルを右に移動します
 }

上記の内容を実行すると下記の様なメッセージが出力されます。

マクロエラー:型が合いません
エラー箇所の内容(変更した内容):
if("\t" == true){
    backspace;

御教授を御願い致します。

[ ]
RE:09172 行の最後のタブーだけを削除したNo.09173
Iranoan さん 20/02/24 00:00
 
こんにちは Iranoan です
>  初めまして、行の最後にタブーが存在する時に、行の最後だけのタブーだけを削
>除したいのですが?
これだけなら、マクロにしなくても置換で出来ます
検索文字:\t+$
置換文字:
         ↑つまり空
正規表現:ON

マクロに関しては、
>  if("\t" == true){
を次のようにします
if( code == '\t' ){

[ ]
RE:09173 行の最後のタブーだけを削除したNo.09174
SunSolaris さん 20/02/24 02:12
 
Iranoan  様

 早速の御連絡有難う御座います。

>検索文字:\t+$
>置換文字:
>         ↑つまり空
>正規表現:ON

実行できるのですが。
>マクロに関しては、
>>  if("\t" == true){
>を次のようにします
>if( code == '\t' ){
下記のように記述したのですが

golineend :
 if(code == '\t' ){
//行の最後にタブの有り無し判断
    backspace;  //Backspace
     }
 else{
  right; //カーソルを右に移動します
  }
では
14:15 フローラルウォーク賞 芝・左 1600m 晴 良 サラ系3歳 500万円以下 (混合)
(特指) 馬齢 890、360、220、130、89万円 [EOF]
となり最後の行のタブーが削除出来ません御教授を御願い致します。

[ ]
RE:09174 行の最後のタブーだけを削除したNo.09175
motoak さん 20/02/26 15:12
 
>>検索文字:\t+$
>>置換文字:
>>         ↑つまり空
>>正規表現:ON
>
>実行できるのですが。

置換で

setcompatiblemode 0x20000; // 検索オプションの内容を記憶しマクロ終了時に再現
する
replaceall "\t+$", "" ,regular; // または replaceallfast

ではだめなんですか?

>>マクロに関しては、
>>>  if("\t" == true){
>>を次のようにします
>>if( code == '\t' ){
>下記のように記述したのですが

こちらの方法も、マクロ初心者で拙いながら試してみましたが、

while ( code != eof ){
golineend;
 while( 1 ){
 left;
 if( code == '\t' )
 delete;
 else break;
 }
right 2;
}

と、まだるっこしい形になっちゃいましたが、
どの状態でもうまくいくのかも、少々不安です。
こちらでもすっきりとした形で出来るのか、僕も知りたいです。

[ ]
RE:09175 行の最後のタブーだけを削除したNo.09176
motoak さん 20/02/26 16:20
 
SunSolaris さん

ご挨拶を失念しておりました。
すみませんm(_ _)m

秀丸マクロ初心者の motoak といいます。

10年ほど前に一度勉強し始めたのですがすぐに挫折。
最近になってコマンドを並べる程度でも仕事の効率が飛躍的に上がることを実感し、
再挑戦しているところです。

[ ]
RE:09176 行の最後のタブーだけを削除したNo.09177
秀丸担当 さん 20/02/27 12:06
 

参考までの情報として、マクロ中の""の中で\そのものを記述するには、"\\"と書く
必要があります。
以下の例では、検索/置換ダイアログに「\t」と入力したものと同じではなく、タブ
文字そのものを表しています。入力欄にタブ文字そのものを貼り付けて幅の広い空白
のようなものを書いているのと同じ状態です。
replaceall "\t+$", "" ,regular;

検索/置換ダイアログで「\t」と記述するのと同じにするには、"\\t"と書く必要があ
ります。
replaceall "\\t+$", "" ,regular;

けど、どちらも結果的に同じ動作なので間違いではないです。

rightやleftを使って移動しながら調べるマクロは、概ね合っていると思います。
1つ気になるところとしては、行末に移動するのは、golineend2のほうがいいです。
golineendだと折り返しがある場合の見た目上の行末になるので、折り返し位置にタ
ブがある場合は削除されてしまいます。
あと、厳密には[その他]→[動作環境]→[編集]→[高度な編集2]の、『「行末<->次の
行の先頭」移動の禁止』のオプションがあったりして、rightが効かないことがあり
ました。でもrightに関しては、自分が作るとしても、このオプションを使っている
人はいないという前提で作ってしまうところだと思います。
確実にするにはmovetolinenoとかを使うといいですが、replaceallのほうが早いと思
います。


[ ]
RE:09177 行の最後のタブーだけを削除したNo.09178
motoak さん 20/02/28 12:16
 
motoak です。

秀丸担当 さん
ありがとうございます。

SunSolaris さん
横から入って図々しく、すみませんm(_ _)m


>参考までの情報として、マクロ中の""の中で\そのものを記述するには、"\\"と書く
>必要があります。

エスケープの仕方、ときおり insert コマンドや message コマンドの場合と混同し
て書いてしまうことが有り、この場合、一見問題なかったのでそのままになってしま
いました。ありがとうございます。

>1つ気になるところとしては、行末に移動するのは、golineend2のほうがいいです。

ありがとうございます。

>確実にするにはmovetolinenoとかを使うといいですが、replaceallのほうが早いと
>思います。

勝手ながら、練習問題を解くつもりで、movetolineno を使って書いてみました(し
つこくてすみません)。

最初は改行のみやタブと改行のみの行でうまくいかず、それをやり過ごしても今度は
最後の行末が EOF の場合に行ったり来たりを繰り返してしまい、付け足し付け足し
で冗長になってしまいました。
もし、もっとすっきりできるなら、ご面倒で無ければお示し願えればありがたいので
すが。他でも応用できそうなので。

秀丸のマクロを足がかりに、できれば語彙の多い言語でもプログラミングが出来るよ
うになれればと思っています。よろしくお願いします。
--------------------------------------------
gofiletop;
golineend2;
while ( code != eof ){
 while( 1 ){
 if( column == 0 ){ down; golineend2; } // 改行のみまたはタブと改行のみの行
への対応
 left;
 if( code == '\t' ) delete;
 else break;
 }
#num = lineno;
movetolineno 1 , #num + 1; //
golineend2;
}
// 2行目と12行目の「golineend2」は、最後の行末が EOF になっている場合への対応
--------------------------------------------

[ ]
RE:09178 行の最後のタブーだけを削除したNo.09179
秀丸担当 さん 20/02/28 16:01
 

ちなみにもう一つ参考に、"\\"と書くのは、最近のバージョンでは、先頭に@を付け
て@"\"とする方法もあります。
@""の書き方だと、\はエスケープする必要無く、代わりに「"」を「""」と書く必要
があります。
正規表現とかパスの記述が書きやすくなると思います。
例:
message "\\t";
message @"\t";
message "c:\\folder";
message @"c:\folder";

標準の.macの自動判別のカラー表示は古い書き方にしか対応していないので、新しい
書き方にも対応するようにしようと思います。

movetolinenoを使う方法は、自分が作るとしても、movetolineno 1 , #num + 1;のよ
うに加算していく感じで、だいたい似たような感じになると思います。

[ ]
RE:09179 行の最後のタブーだけを削除したNo.09180
motoak さん 20/03/01 16:40
 
秀丸担当さま

motoak です。

> movetolinenoを使う方法は、自分が作るとしても、movetolineno 1 , #num + 1;の
>ように加
> 算していく感じで、だいたい似たような感じになると思います。                
>        

ありがとうございます。
引き出しが1つ増えました。

ところで、@"" を早速試してみました。
// 度々すみません。

message "アメリカのテレビドラマ\n\"Halt and Catch Fire\"\nはおもしろい";

だと

アメリカのテレビドラマ
"Halt and Catch Fire"
はおもしろい

と表示されるので、これをもとに、

message @"アメリカのテレビドラマ\n""Halt and Catch Fire""\nはおもしろい";
message @"アメリカのテレビドラマ\t""Halt and Catch Fire""\tはおもしろい";

を実行したところ、メッセージはそれぞれ

アメリカのテレビドラマ\n"Halt and Catch Fire"\nはおもしろい
アメリカのテレビドラマ\t"Halt and Catch Fire"\tはおもしろい

と出てしまいました。

message @"アメリカのテレビドラマ
""Halt and Catch Fire""
はおもしろい";

message @"アメリカのテレビドラマ  ""Halt and Catch Fire""  はおもしろい";

とすると、それぞれ

アメリカのテレビドラマ
"Halt and Catch Fire"
はおもしろい

アメリカのテレビドラマ  "Halt and Catch Fire"  はおもしろい
// タブはフォーラム内では明確に表示されないようなので2個の全角スペースで代用。

と、予想通りの表示になってくれます。

度々申し訳ないのですが、前者の書き方での問題点をご指摘いただければと思います。
秀丸のバージョンは 8.91 32bit版 です。
よろしくお願いします。

[ ]
RE:09180 行の最後のタブーだけを削除したNo.09181
秀丸担当 さん 20/03/02 11:10
 

@""の書き方で、@"\n"や@"\t"が改行やタブではなく、円記号とアルファベットにな
るのは、それが正しいです。
というよりむしろ、改行やタブにはさせず、円記号を円記号のままにすることが目的
です。

改行を含んで複数行の記述もでき、複数行にまたがる文字列もそれで合っています。

標準のカラー表示では、複数行に渡って書くと色付けがおかしくなってしまい、間違
った記述をしているかのように見えてしまいます。
このあたりが対応不足でした。すみません。
V8.92のβ版では標準のカラー表示でも対応する予定です。

現状では、[その他]→[ファイルタイプ別の設定]→[デザイン]→[複数行コメント]を
ユーザー定義にして、複数行の文字列の書き方の定義をすると、色付けも可能です。
[マクロ]→[マクロヘルプ]の、「目次− 式について−文字列」のページの下のほう
にある定義方法の例があります。

[ ]
RE:09181 行の最後のタブーだけを削除したNo.09182
motoak さん 20/03/03 13:44
 
秀丸担当さま

>@""の書き方で、@"\n"や@"\t"が改行やタブではなく、円記号とアルファベットにな
>るのは、それが正しいです。
>というよりむしろ、改行やタブにはさせず、円記号を円記号のままにすることが目
>的です。

ありがとうございます。やっと理解が出来ました。
マクロヘルプの理解力不足でした。
message コマンドでの改行は「\」をエスケープする必要がないと理解していました
ので、なぜ「『\』はそのまま『\』と書くことができます」という説明があるのか良
くわかりませんでした。


>V8.92のβ版では標準のカラー表示でも対応する予定です。
>現状では、[その他]→[ファイルタイプ別の設定]→[デザイン]→[複数行コメント]
>をユーザー定義にして、複数行の文字列の書き方の定義をすると、色付けも可能です。
>[マクロ]→[マクロヘルプ]の、「目次− 式について−文字列」のページの下のほう
>にある定義方法の例があります。

ありがとうございます。
定義方法の例で「種類『単一行(行末まで)』」は「複数行コメント」にはないので、
「強調表示」での「行の強調表示」で定義すればよいのか、また今は定義しても次の
先行版の間だけのことですし。
僕にとってはエスケープについてもう少し理解を深めることの方が先決だと思います
のでV9.92β の公開を待つことにします。

ありがとうございました!

[ ]