テキストって、見た目は普通でも中身が汚れてることがある。
全角スペース混入、タブ混在、行末に空白、無駄な連続スペース……。
こういう “地味な汚れ” は、あとから差分が見づらくなったり、コピペ先で崩れたり、地味に事故の元になる。
だから 一発で掃除する「空白正規化マクロ」 を作って、いつでも叩けるようにしようって話だ。
これで何ができる?
このマクロは、次をまとめて実行する。
- 全角スペース( )→ 半角スペース( )
- タブ → スペース(幅は設定可)
- 行末の空白(スペース/タブ)を削除
- (オプション)連続スペースを1個に圧縮(※強めモード)
さらに便利ポイント:
- 選択範囲があるなら選択だけ
- 選択が無いならファイル全体
マクロ本体(コピペで使える)
ファイル名:ws_normalize.mac
/*
ws_normalize.mac
空白正規化:
- 全角スペース → 半角スペース
- タブ → スペース(TAB幅指定)
- 行末の空白(スペース/タブ)削除
- 強めモード:連続スペースを1個へ圧縮(※コード/表形式には注意)
仕様:
- 選択範囲があれば「選択だけ」
- 選択がなければ「全文」
*/
#mode = val(input("空白正規化モード: 0=安全(推奨) / 1=強め(連続スペースも圧縮)", "0"));
#tabw = val(input("タブを何個のスペースにする?(例: 2 / 4)", "4"));
if (#tabw < 1) #tabw = 4;
$TAB = char(9);
$FW = " "; // 全角スペース(U+3000)
$SP = " ";
$tabs = "";
#i = 0;
while (#i < #tabw) {
$tabs = $tabs + $SP;
#i = #i + 1;
}
#useSel = selecting; // 0/1
// -------------------------------------
// 1) 全角スペース → 半角スペース
// -------------------------------------
if (#useSel) {
replaceallfast $FW, $SP, inselect;
} else {
replaceallfast $FW, $SP;
}
// -------------------------------------
// 2) タブ → スペース(#tabw個)
// -------------------------------------
if (#useSel) {
replaceallfast $TAB, $tabs, inselect;
} else {
replaceallfast $TAB, $tabs;
}
// -------------------------------------
// 3) 行末の空白(スペース/タブ)削除
// ※ ^ $ は行単位を想定
// -------------------------------------
if (#useSel) {
replaceallfast "[ \\t]+$", "", inselect, regular;
} else {
replaceallfast "[ \\t]+$", "", regular;
}
// -------------------------------------
// 4) 強めモード:連続スペースを1個に圧縮
// ※注意:コード/表/桁揃えを壊す可能性あり
// -------------------------------------
if (#mode == 1) {
if (#useSel) {
replaceallfast " {2,}", " ", inselect, regular;
} else {
replaceallfast " {2,}", " ", regular;
}
}
message "空白正規化 完了";
導入手順(3分で終わる)
1) マクロをファイル保存
- 秀丸で新規ファイルを開く
- 上のマクロを貼り付ける
ws_normalize.macという名前で保存
2) 秀丸に登録
- [マクロ] → [マクロ登録] を開く
- 空いてる番号を選ぶ
- さっき保存した
ws_normalize.macを指定して登録
3) ショートカット割り当て(おすすめ)
- [その他] → [キー割り当て] を開く
- 登録したマクロにキーを割り当てる
- 例:
Ctrl + Shift + W(W=whitespace で覚えやすい)
使い方(安全モードが基本)
安全モード(0)=基本これ
- 全角スペース→半角
- タブ→スペース
- 行末空白削除
だけやる。
コード・表・ログ、だいたい全部に安心して使える。
強めモード(1)=文章向け
上に加えて
- 連続スペースを 1個に圧縮
もやる。
※これ、Pythonのインデントとか、表形式の桁揃えとか、ログの整列を壊す可能性がある。
だから「文章だけ」とか「やっていいデータだけ」に使うのが筋。
カスタム(よく使う調整)
タブ幅を固定したい(毎回入力が面倒)
この行を:
#tabw = val(input("タブを何個のスペースにする?(例: 2 / 4)", "4"));
こう変える(例:常に4):
#tabw = 4;
入力を減らしたい(常に安全モードでいい)
この行を:
#mode = val(input("空白正規化モード: 0=安全(推奨) / 1=強め(連続スペースも圧縮)", "0"));
こう変える:
#mode = 0;
よくある質問
Q. 「全角→半角」って、英数字まで半角化するの?
A. このマクロは 全角スペース( ) を半角スペースにするタイプ。
英数字の全角(ABC、123)まで変換したいなら、別途「全角英数字→半角」の処理を追加するのが良い。
(必要なら、その拡張版も作れる)
Q. 連続スペース圧縮って、なぜ危ない?
A. “意味のあるスペース” まで潰すから。
コードのインデント、表の列揃え、ログの整形……こういうのはスペースが意味を持つ。
Q. 選択範囲だけにかけたい
A. そのまま範囲選択して実行すれば 選択だけに効く仕様にしてある。
まとめ:テキストの“汚れ”は先に潰す
空白は、見えないのに差分やコピペで悪さをする。
だから「気づいた時に掃除」じゃなくて、いつでも一発で掃除できる状態が強い。
このマクロをショートカットに入れておけば、
「なんか変だな」って時に迷わず叩ける。これが仕事を速くする。

コメント