行頭&行末&空行をいっぺんに削除するマクNo.05360
yasuyyasu さん 06/12/01 01:02
 
またまたこんばんはです。
先日はとても便利なマクロをお教え頂きありがとうございました。
毎日秀丸を愛用させて頂いております。
今日はまたお教え頂きたいことが出来てしまいましたので投稿させて頂きます。

実は、<行頭のスペース、行末のスペース、空行>をいっぺんに削除したいので、
公開されているマクロを色々検索してみましたところ、
行末&行頭のスペースを削除するマクロ(スレッド00891 98/04/23)、
空行を削除するマクロ(Q&A集 HME0065A)を見つけました。
それを単純につなげてみて、試してみたのですが、空行削除の処理だけが範囲指定が
出来ないのです・・・。

これをどのように改造すれば上記3つの処理が範囲指定しない時は全範囲でというよ
うな処理ができるのでしょうか?
初歩的な質問だと思うのですが、当方マクロ初心者ですのでお許しください。
お教え頂けると幸いです。
よろしくお願い申し上げます。

以下、つなげてみたマクロです・・・

----------------------------------------------------------

    $str_ft = "^[\x20\x81\x40\t]+"; //  line top
    $str_fe = "[\x20\x81\x40\t]+$"; //  line end
    $str_fa = $str_ft + "|" + $str_fe;  //  line all
    replaceallfast $str_fa, "", regular, inselect;
  replaceall "^\\n", "", regular, inselect;

----------------------------------------------------------

[ ]
RE:05360 行頭&行末&空行をいっぺんに削除No.05361
yasuyyasu さん 06/12/01 09:06
 
おはようございます。
質問の補足をさせて頂きます。

削除したいのは、行頭のスペース&タブ、行末のスペース&タブ、空行、
タブだけの行 です。範囲選択しない時は全範囲を変換に出来るとありがたいです。

昨日はタブも削除したいという事を記載するのを忘れましたので追記させて頂きます。

よろしくお願い申し上げます。

[ ]
RE:05361 行頭&行末&空行をいっぺんに削除No.05362
K'zawa さん 06/12/01 14:41
 
yasuyyasuさん、こんにちは。
K'zawaです。

>それを単純につなげてみて、試してみたのですが、空行削除の処理だけが範囲指定が
>出来ないのです・・・。
>
>これをどのように改造すれば上記3つの処理が範囲指定しない時は全範囲でというよ
>うな処理ができるのでしょうか?

示されたマクロについて言えば、
最初の置換で範囲選択は解除されます。
なのでもう一度範囲選択しないと駄目です。
それはこの前のマクロが参考になると思います。


それはそれとして…、
replaceallfast一つにまとめれば問題なくなりますが。

[ ]
RE:05362 行頭&行末&空行をいっぺんに削除No.05363
yasuyyasu さん 06/12/01 15:34
 
K'zawaさん、こんにちは。
前回に引き続きお教え頂きありがとうございます。

お教え頂きました事を参考に、前回の範囲指定のマクロもつなげてみたところ、
今度は範囲選択ありなし関係なく、改行が削除できなくなってしまいました・・・

今回は前回と違い、最終行に改行を追加しないのでその部分を除いて
前回と同じように並べてみたのですが・・・。
並べ方が違うようなのですが、自分ではどこをどうすればよいのかわかりませ
ん・・・。
またお教え頂けると幸いです。よろしくお願い致します。

※replaceallfastを1つにすれば、前回のマクロをつなげなくてもよくなるのですか?
 もしよろしければこちらの方法もお教え頂けると嬉しいです。

以下つなげてみたマクロです

---------------------------------------------------------
// 範囲選択中なら変数で記憶し、解除
if(selecting){
  #sel=1;
  #tx = seltopx;  #ty = seltopy;
  #ex = selendx;  #ey = selendy;
  escape;
}
    $str_ft = "^[\x20\x81\x40\t]+";
    $str_fe = "[\x20\x81\x40\t]+$";
    $str_fa = $str_ft + "|" + $str_fe;
  replaceallfast $str_fa, "", regular, inselect;

// 範囲選択を復元
if(#sel == 1){
  moveto #tx,#ty;
  beginsel;
  if(#selfileend == 1) gofileend;
  else moveto #ex,#ey;
}
    if (selecting)replaceall "^\nn", "", regular, inselect;
---------------------------------------------------------


[ ]
RE:05363 行頭&行末&空行をいっぺんに削除No.05364
K'zawa さん 06/12/01 19:13
 
yasuyyasuさん、こんにちは。
K'zawaです。

>お教え頂きました事を参考に、前回の範囲指定のマクロもつなげてみたところ、

説明不足でした。参考と言ってもそのまま使えません。
一度置換をしてしまったら、元の座標で再び範囲選択しても正しくないです。
目印を埋め込むとかしないといけないです。
なのであまりおすすめできません。
本命は一つにまとめるほうです。

その前にもう一つ思いつきました。
Ver6.XXを使用している場合は、
1.範囲選択する。
2.部分編集モードにする。
3.(最初の)マクロを実行。

これで其の範囲外は編集されません。
マクロの先頭に、
setcompatiblemode 15;
だけつけましょう。
あと、replaceallとreplaceallfastを使い分ける必要はないと思います。


>※replaceallfastを1つにすれば、前回のマクロをつなげなくてもよくなるのですか?

よいです。
一回だけなので範囲選択はそのまま使えます。

------------------------------------------------------
$str = "[\x20\x81\x40\t]+";
$str = "^" + $str + "|" + $str + "$|^" + $str + "\\n";
replaceallfast $str, "", regular, inselect;
------------------------------------------------------

[ ]
RE:05364 行頭&行末&空行をいっぺんに削除No.05365
yasuyyasu さん 06/12/01 20:05
 
K'zawaさん、こんばんは。

何度もお答え頂き本当にありがとうございます。
私の使用している秀丸はバージョン5.18でした。
バージョンアップしていたのですね!
近いうちに私のも最新版にしたいと思います。

ところで、お教え頂いたものを試してみたところ、
1点だけ出来ないことがありました。
改行のみの行の削除が出来ませんでした。
改行の前にスペースやタブがあれば削除してくれるのですが、
前に何もない改行部分だけが削除されずに残ってしまいます。

お教え頂いたマクロも是非使用したいので、
上記の点が解消されるための方法をお教え頂けないでしょうか?

何度も申し訳ございませんがよろしくお願い致します!

[ ]
RE:05365 行頭&行末&空行をいっぺんに削除No.05366
K'zawa さん 06/12/01 20:44
 
K'zawaです。

毎度確認不足ですいません(汗)

1行目:$str = "[\x20\x81\x40\t]*";
にすればよいかと。

[ ]
RE:05366 行頭&行末&空行をいっぺんに削除No.05367
yasuyyasu さん 06/12/01 21:47
 
K'zawaさん、ありがとうございます。
こちらこそ、質問ぜめで恐縮です。

早速試してみました!
何でかよくわからないのですがそれがどうも上手くいく場合といかない場合がありま
す。

例えば

ああああ




いいいい

(※2〜5行は改行のみです)

のように、改行のみの行が5行あるとして、
2行目の改行(ああああの下の行)から3行を範囲選択すると
全部の改行が削除になるという具合です。

問題は改行のみの箇所の範囲指定だけなのでなんか悔しいです・・・

そこで考えたのですが、改行のみの行は上手く範囲指定できないのですが、
改行の前にスペースやタブが入っていると上手く出来るので、一括削除処理をする前
に、
改行だけの行の頭にはスペースを入れる処理を入れてみるというのはどうでしょうか?
(改行のみ → スペース+改行 になるみたいな感じです)
どうでしょうか と言ってみたものの、自分ではどうにも出来ないのですが・・・


本当に何度もスミマセン・・・m(__)m

[ ]
RE:05367 行頭&行末&空行をいっぺんに削除No.05368
yasuyyasu さん 06/12/01 22:21
 
すみません!
よく考えてみたら、上記の例のように改行部分だけを範囲選択して改行を削除するなら
普通にDeleteキーで削除すればいいことに気づきました。
お恥ずかしい話です・・・。

空行が混ざっている文章でテストしてみたところ、先程のマクロでOKでした!

これで解決しました。本当にありがとうございました!!
マクロ初心者の私みたいな者にもいつも親切丁寧にお教え頂き感謝申し上げます!



[ ]
RE:05367 行頭&行末&空行をいっぺんに削除No.05369
Kaisan さん 06/12/01 22:32
 
yasuyyasuさん
横から失礼します。

以下のマクロでどうでしょうか
----------------------------------------------
$str = "[\x20\x81\x40\t]+";
$str = "^" + $str + "|" + $str + "$|^\\n";
replaceallfast $str, "", regular, inselect;
----------------------------------------------

空行削除の正規表現で「^」と「\n」の間に
何かあるとうまくいかないようです。

秀丸ver6.50 Beta3 で確認しました。


[ ]
RE:05369 行頭&行末&空行をいっぺんに削除No.05370
yasuyyasu さん 06/12/01 23:22
 
Kaisanさん、こんばんは。

お教え頂きありがとうございます。
私はマクロ初心者なので、K'zawaさんからお教え頂いたマクロと
Kaisanからお教え頂いたマクロどのように違うのかがいまいちわかりません・・・

K'zawaさんからお教え頂きましたマクロも私が希望しておりました
行頭スペース&タブ、行末スペース&タブ、改行のみの行の改行が、
範囲指定しない時は全範囲で一括削除が出来ましたので
これで希望どおりと思っておりました。

Kaisanさんからお教え頂いたマクロも希望とおりの処理が出来ますので
私的にはこれもまた希望どおりなのです!

お恥ずかしいのですが、違いがよくわからないために、2つお教え頂いた今、どちら
を使用させていただこうか迷っております。

>空行削除の正規表現で「^」と「\n」の間に
>何かあるとうまくいかないようです。

何かあると・・・ というのが私レベルにはよくわからないのですが、
お教え頂きました事を参考に、活用させて頂きます。

本当にありがとうございました!
親切丁寧にお教え頂きましたことに感謝申し上げます!

[ ]
RE:05370 行頭&行末&空行をいっぺんに削除No.05371
K'zawa さん 06/12/02 16:01
 
yasuyyasuさん、Kaisanさん、こんにちは。
K'zawaです。

KaisanさんのNo.05369は、
No.05365>改行のみの行の削除が出来ませんでした。
に対するコメントですね。


>違いがよくわからないために、2つお教え頂いた今、どちら
>を使用させていただこうか迷っております。

全く同じ結果が出ると思いますが、
Kaisanさんの方には全然無駄がないです。
そちらを使いましょう。

それで、両者の動きの違いをじっくり考えていたら、
ついでに、

No.05367
>ああああ
>
>
>
>
>いいいい
>
>(※2〜5行は改行のみです)
>
>のように、改行のみの行が5行あるとして、
>2行目の改行(ああああの下の行)から3行を範囲選択すると
>全部の改行が削除になるという具合です。

の方もなんとなく見えて来ました。
秀丸エディタの範囲選択は、座標で記憶されているみたいで、
置換が始まると文章とは無関係なものになってしまうようです。
だから、改行を削除して行数が減ると、
下の行が範囲内に入ってきてしまい、
それで置換の対象になっているようです。

これは仕様なのかバグなのか…?

[ ]
RE:05371 行頭&行末&空行をいっぺんに削除No.05375
yasuyyasu さん 06/12/02 22:03
 
K'zawaさん こんばんは。

>全く同じ結果が出ると思いますが、
>Kaisanさんの方には全然無駄がないです。
>そちらを使いましょう。

なるほど同じ動きだったのですね。
どうりで私では違いが分からなかったはずですね!
Kaisanさんの方をお勧め頂きましたので、そちらを使わせて頂く事にします。
でもKaisanさんのが無駄がないということさえ、私には分かりませんでした。
これもまたお教え頂けてよかったです。

座標のことは前回、今回の質問回答の中でも出てきたので
自分の中で、「これから勉強するリスト」に入れてあります。
私も早く皆様のように自分でマクロが作れるようになりたいです。

色々とお教え頂き感謝申し上げます。
本当にありがとうございました!!


[ ]
RE:05375 行頭&行末&空行をいっぺんに削除No.05381
K'zawa さん 06/12/04 14:56
 
yasuyyasuさん、こんにちは。
K'zawaです。

範囲外の空行が消える件、バグでした。
修正していただけるとのことです。
修正された時点でバージョンアップしないと駄目ですが。

バージョンアップしてない状態でも、

http://hidemaruo.dip.jp:81/hidesoft/hidesoft_2/x16879.html

のなかで秀まるおさんが言っておられる方法でやると大丈夫です。
マクロの話ではないのでマクロは載ってないですが、
簡単なものならキー操作の記録と保存で
マクロファイルにしてから手直しすればよいでしょう。

では。

[ ]
RE:05381 行頭&行末&空行をいっぺんに削除No.05383
yasuyyasu さん 06/12/04 20:23
 
K'zawaさん、こんばんは。

なるほど、バグだったんですね。
バグだということさえ私には分かりませんでした・・・。
でも対処方法もお教え頂きましたので、これで解決しそうです。
作業がより一層早く出来るのでとても助かります。

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

[ ]