続く改行と空白を1つの空白にするマクロNo.01586
じゅふ さん 00/11/07 21:08
 
私はマクロの超初心者です。
いくつか続く改行と空白を削除して1つの空白にしたいんです。
つまり言葉と言葉の間は、1つだけの空白にしたいんです。例えば、



 秀丸エディタは,Windows95,Windows98以降、      または
             

WindowsNT3.51,Windows2000以降で   動作するテキストエディタ
です。「秀丸エディタ」という名前は      長いので,ヘルプファイルの中では

            

単に「秀丸」と          表記します。



というのを、



 秀丸エディタは,Windows95,Windows98以降、 またはWindowsNT3.51,Windows2000
以降で 動作するテキストエディタ です。「秀丸エディタ」という名前は 長いの
で,ヘルプファイルの中では 単に「秀丸」 と表記します。


というふうにしたいです。
私はマクロプログラムほとんどよくわからないのです。
改行は "\n" を使うのは知ってます。しかし、それだけしか知りません。うぅ。
どなたか、私の質問に対するマクロを教えてください。

[ ]
RE:01586 続く改行と空白を1つの空白にすNo.01587
きいろいまふらあ さん 00/11/07 23:07
 
じゅふさん、こんばんは。きいろいまふらあです。

まずマクロでなくて、普通の置換だとどうやるか、ということで。
2段階の処理でやるのが簡単そうです。

まず、(処理範囲内の)改行を「 」に置換します。
 検索文字列「\n」
 置換文字列「 」←全角の空白ね
 正規表現をチェック

次に、連続する「 」を単一の「 」に置換します。
 検索文字列「 +」←全角の空白+「+」
 置換文字列「 」←全角の空白
 正規表現をチェック

「+」は直前のパターンの1回以上の繰り返しを表します。

これをマクロでやろうとすると
あらかじめ複数行にわたる範囲を行選択しておいて

replaceall "\\n"," ",inselect;
undo; //もしかしたらここで1回だけundoしたほうがいいかも
selectline;
replaceall " +"," ",inselect;

というマクロを走らせればいいと思います。
マクロの中では「\n」を「\\n」と書く必要があります。
undoは、最後の行の行末の改行を「 」に置換してしまうのを
元に戻すためです。

あ、選択範囲の末尾が[EOF]だったらどうしましょう?(^^;
ま、そこまでは考えてません、ということで。

[ ]
RE:01587 続く改行と空白を1つの空白にすNo.01588
番頭++ さん 00/11/08 11:10
 
> replaceall "\\n"," ",inselect;
> undo; //もしかしたらここで1回だけundoしたほうがいいかも
> selectline;
> replaceall " +"," ",inselect;

「正規表現」の regular, がたんないすよ ...
  (このコメントは全角の空白を「 」含んでいます。)

replaceall "\\n"," ",regular,inselect;
undo; //もしかしたらここで1回だけundoしたほうがいいかも
selectline;
replaceall " +"," ",regular,inselect;

[ ]
RE:01588 続く改行と空白を1つの空白にすNo.01589
ENCODINGSHIFTJIS さん 00/11/08 11:31
 
●カット&ペーストで持ち込んだ時そうなる場合
メニュー>その他>ファイルタイプ別の設定>全般>折り返し文字数を999に>保存しない
で更新
すると、空白は行頭に集まりやすい。BOX選択削除とか行頭空白置換削除する。
●編集中に行の形が乱れた時は
「××整形」のマクロを動かす、マクロ集の中にいろいろあります。
__end__

[ ]
RE:01588 続く改行と空白を1つの空白にすNo.01590
きいろいまふらあ さん 00/11/08 13:36
 
番頭++さん、どもです。きいろいまふらあです。

>「正規表現」の regular, がたんないすよ ...

おっしゃる通りです。
テストしながら直したんですが、肝心のレスにフィードバックするのを
忘れてしまいました。失礼しました。

[ ]
RE:01586 続く改行と空白を1つの空白にすNo.01596
じゅふ さん 00/11/09 21:58
 
皆さん、いろいろお答えありがとうございます。
教えてもらったマクロをやったんですが、意図したものができませんでした。
というか、私の質問が悪かったです。私がやりたいことは、

1 改行は全て削除する
2 空白が続く場合、1つの空白を残し、後は全て削除する

自分なりに考えたプログラムは、
ファイルの先頭から文字を調べていき、
改行文字"\\n"のとき、それをdeleteする。
空白文字"\ ”のとき、次の文字もそれなら、それをdeleteする。
これを、ファイルの最後までやる。
if (調べてる文字=="\\n")
    delete;
else
    if (調べてる文字=="\ ")
        if(調べてる文字の次の文字=="\ ")
           delete;
昨日今日、自分なりに一生懸命頑張って考えたのが上のです。
とほほ。こんなんでは全然だめです。

私のやりたいことわかっていただけたでしょうか?
で、私の質問に対する答えのマクロをどなたか教えてください。

秀丸エディタ Version3.05 マクロ言語ヘルプ目次を見たんですが、
うぅ、全然わかりません・・・。

[ ]
RE:01596 続く改行と空白を1つの空白にすNo.01597
かかし さん 00/11/09 22:20
 
かかしです、こんにちは。

>1 改行は全て削除する
>2 空白が続く場合、1つの空白を残し、後は全て削除する

1、については「削除する」=「何もない文字に置換する」と考えます
2、は、「1個以上の連続する空白文字を1個の空白文字に置換する」と考えます。

すると、マクロを使わずに2回の置換で済むことになります。

(以降の置換では、正規表現のチェックを忘れずに!)

1、
検索文字列:\n
置換文字列:(なし)

2、
検索文字列: +(「半角スペース」と「半角の+」)
置換文字列: (半角スペース)

で、OKです。

空白が続く場合=半角空白、全角空白、タブ文字
の場合は、2、の検索文字列を

検索文字列:[  \t]+(「半角スペース」と「全角スペース」と「\t」と「半角の
+」)

に置き換えると、良いと思います。

>if (調べてる文字=="\\n")
>    delete;
>else
>    if (調べてる文字=="\ ")
>        if(調べてる文字の次の文字=="\ ")
>           delete;
>昨日今日、自分なりに一生懸命頑張って考えたのが上のです。
>とほほ。こんなんでは全然だめです。

いろいろ考えることが、上達の一歩だと思っております。
がんばって下さい。

---かかし

[ ]
RE:01596 続く改行と空白を1つの空白にすNo.01598
きいろいまふらあ さん 00/11/10 00:30
 
きいろいまふらあです。

>1 改行は全て削除する
>2 空白が続く場合、1つの空白を残し、後は全て削除する

最初のとちょっと変わりましたね。しかも…

>ファイルの先頭から文字を調べていき、

>これを、ファイルの最後までやる。

…ファイル全体を処理するんですね。

replaceall "\\n", "", regular;
replaceall " +", " ", regular;  //空白部分はそれぞれ全角の空白
endmacro;

この3行のマクロでいけるはずです。
お試し下さい。

なお、じゅふさんの考えられたロジックもマクロで記述することは可能です。
ですが、遅いです。
それと、改行の直前と直後に空白「 」があった場合の処理など、
ちょと面倒ですね。

[ ]
RE:01596 続く改行と空白を1つの空白にすNo.01600
ENCODINGSHIFTJIS さん 00/11/10 12:36
 
ダイ・ハードなプログラム言語で書くなら、上記の形になりますが
スクリプト・マクロ系ではちがいます。要素操作の速さが違いますから
速さより、読み易さ/書きやすさです、非定形処理の書き捨てマクロの
作成も多いのがこの世界です。

改行をなくした結果の行長にも注意、秀丸の処理容量制限もあります。
ヒント:行の桁表示は最大4桁。行指向の動作をするエンジンです

ヘルプはン全部必要です
<html><head><title>秀丸マクロ</title>
</head><body ><a name="sc0"><center><h1>秀丸マクロの目次</h1></center></a>
<a name="sc1"><h2>変数の使い方</h2></a>
<a name="sc2"><h2>式について</h2></a>
<a name="sc3"><h3>数値</h3></a>
<a name="sc4"><h3>演算子</h3></a>
<a name="sc5"><h3>内部的な値を表現するキーワード</h3></a>
<a name="sc6"><h4>結果コードと定数</h4></a>
<a name="sc7"><h4>resultについての注意事項</h4></a>
<a name="sc8"><h4>カーソル関連</h4></a>
<a name="sc9"><h4>テキスト関連</h4></a>
<a name="sc10"><h4>範囲選択関連</h4></a>
<a name="sc11"><h4>ウィンドウ関連</h4></a>
<a name="sc12"><h4>ファイル名関連</h4></a>
<a name="sc13"><h4>各種状態関連</h4></a>
<a name="sc14"><h4>ファイルタイプ別の設定関連</h4></a>
<a name="sc15"><h4>クリップボード関連</h4></a>
<a name="sc17"><h4>日付と時刻関連</h4></a>
<a name="sc18"><h3>文字列</h3></a>
<a name="sc19"><h3>関数</h3></a>
<a name="sc20"><h3>resultについての注意事項</h3></a>
<a name="sc21"><h2>エラーの処理</h2></a>
<a name="sc22"><h2>内部的な値を表現するキーワード</h2></a>
<a name="sc23"><h2>関数一覧</h2></a>
<a name="sc24"><h2>通常のコマンドを実行する文</h2></a>
<a name="sc25"><h3>挿入系文</h3></a>
<a name="sc26"><h3>ファイル系文</h3></a>
<a name="sc27"><h3>カーソル移動系文</h3></a>
<a name="sc28"><h3>クリップボード系文</h3></a>
<a name="sc29"><h3>削除系文</h3></a>
<a name="sc30"><h3>その他編集系文</h3></a>
<a name="sc31"><h3>検索系文</h3></a>
<a name="sc32"><h3>ウィンドウ系文</h3></a>
<a name="sc33"><h3>メニュー系文</h3></a>
<a name="sc34"><h3>その他のコマンド系文</h3></a>
<a name="sc35"><h2>メッセージ系</h2></a>
<a name="sc36"><h2>プログラム実行系</h2></a>
<a name="sc37"><h2>マクロ制御系</h2></a>
<a name="sc38"><h2>入力系</h2></a>
<a name="sc39"><h2>INIファイル系</h2></a>
<a name="sc40"><h2>レジストリ系</h2></a>
<a name="sc41"><h2>設定系</h2></a>
<a name="sc42"><h2>秀丸管理</h2></a>
<a name="sc43"><h2>外部プログラムとの交信</h2></a>
<a name="sc44"><h3>クリップボードと変数とのやりとり</h3></a>
<a name="sc45"><h3>DDE</h3></a>
<a name="sc46"><h3>DLL呼び出し機能</h3></a>
<a name="sc47"><h2>秀丸のヘルプにあるもの</h2></a>
</body></html>


[ ]
RE:01596 続く改行と空白を1つの空白にすNo.01601
じゅふ さん 00/11/10 21:05
 
みなさん、いろいろありがとうございました。
教えてもらったもので私のしたいことが出来ました。
今後ともよろしく御願いします。

[ ]