
みなさんこんにちは、ガノー(Twitter:Ganohr)です。
秀丸エディタは近年目まぐるしい進化を遂げており、コーディングに用いる方々が徐々に増えてきています。
当方は以下の記事で紹介している通り、WordPressのプラグインやテーマ開発のために、秀丸エディタの環境を最近整備し始めました。
これまではAtomやSublime Text、VSCodeなどを利用してきましたが、比較的軽量でカスタマイズし易く、また自動補完機能の実装やテンプレート機能の実装により他のエディタと遜色ないコーディングが可能になりつつあります。


最近はPHPMDやphpcs/phpcbfなどを秀丸マクロから呼び出し可能にしたため、より一層移行を加速しつつあります。
ただ、私がphpをやる主な理由がWordPress関連の開発です。
そこで結構困るのが秀丸の保存時のスペースタブ変換の微妙さ加減です。なぜなら秀丸は「ファイル保存時に、スペースの連続をタブに変換する機能を持っているが、行頭インデントのみならず、行内のスペースの連続までタブに変換してしまう」という挙動を行うことです。
特にPHPプログラミングにおいて標準とされるコーディングスタイル――PSR――では行頭インデントはスペースを用いることとなっていますが、「WordPressのコーディングルールでは行頭インデントはタブ文字で行うことが推奨」されています。
そのためコーディングスタイルはWordPressをベースに採用してphpcs/phpcbfを調整しているため、行頭インデントはタブにする方が都合が良いです。

そこで秀丸の「自動実行実行マクロ」でphpファイルを保存した際は、自動的に行頭のスペースによるインデントをタブへ置き換えるマクロを開発し、設定していきましょう
更新履歴
・2022/12/05 タブ文字とスペースが混在しているときの処理を更新
・2022/11/28 公開
今回開発するマクロを採用する場合と採用しない場合、phpcs/phpcbfを適用した場合の違い

上記のコードを見てください。これは行頭が半角スペースでインデントされています。加えて、行内部でも前後の対応が分かりやすいよう、半角スペースで位置合わせがされています。
可読性向上のため行内部に半角スペースを入れ込み、前後の位置関係を整えるのはWordPressのコーディングスタイルでも許されています。

今回開発したマクロを採用してこのコードを保存すると、自動的に行頭の半角スペースのみをタブに置き換えてくれます。
しかし、phpcs/phpcbfにWordPressスタイルを追加してオートフォーマットを実行すると、以下のように行頭のスペースはタブに置換してくれますが、行内部に入れ込んだ意味のある半角スペースの連続が一つのスペースだけに除去されてしまいます。
これはコーダーにとっては致命的でしょう。

秀丸の保存時の半角スペースをタブに変換する機能はここまでひどいことにはなりませんが、行内の半角スペースまで変換するというわけの分からない仕様です。

これだと4タブ以外の環境で開くと、位置合わせが無意味になってしまいます。
もしもこれを、行頭のスペースのみをタブに置き換えるという――WordPressコーディングスタイル準拠――であれば、4タブでも8タブでも崩れることなく位置合わせされます。

秀丸のように文中の半角スペースの連続まで半角タブへ置き換えてしまうと第三者がコードを編集しようとした際に、タブ幅によっては位置合わせがずれてしまう。

WordPressのように、多数の開発者が組織や人種の別け隔てもなく参画していくものでは、可能な限り色々な環境でも正常に編集可能であることが求められます。
コードの著作権
コピーして貼り付けたり、再配布すること一切を禁止します。自身の環境や閉鎖的な環境、
プライベートな環境へ採用することは自由です。
マクロのダウンロード
phpファイル保存時に行頭のスペースインデントだけをタブに置き換える秀丸マクロ
#tab_max = 40;
setcompatiblemode 0x82010a;
if ( true
&& filetype != ".php"
&& filetype != ".js"
&& filetype != ".css"
&& filetype != ".mac"
) {
endmacro;
}
disabledraw;
#x = x;
#y = y;
begingroupundo;
#tab = getconfig( "Tab" );
if ( #tab < 0 ) {
#tab = 0 - #tab;
}
$spaces = @"[ ]{" + str(#tab) + @"}";
$tabs = "";
#i = 0;
while (#i < #tab_max) {
replaceallfast "^" + $tabs + $spaces, $tabs + @"\t", nohilight, regular;
$tabs = $tabs + @"\t";
searchdown $tabs + $spaces, nohilight, regular;
if (!result) {
break;
}
#i = #i + 1;
}
replaceallfast @"[ \t]+$", "", nohilight, regular;
moveto #x, #y;
endgroupundo;
save;
enabledraw;
当該マクロを使用する際の推奨設定
当該マクロを使用する際は、秀丸のメニューから「その他→ファイルタイプ別の設定」から「その他→保存・読込み→保存するときの変換→タブ・空白の変換→変換なし」を選んでおいてください。

ダウンロードしたマクロを秀丸の自動保存マクロへ登録する方法
zipファイルを解凍して得られたSaveSpaceToTab.MAC
を、%AppData%\Hidemaruo\Hidemaru\Macro\
へ保管して下さい。
次は秀丸のメニューから「マクロ→マクロ登録」と選択し、「自動起動」を選択後「自動起動マクロを有効にする」のチェックを入れ、「保存直前と直後」にチェックを入れ、保存した「SaveSpaceToTab.MAC」を選択し、「OK」をクリックして下さい。
これでphpファイルを編集して保存すると、自動的に行頭の半角スペースだけをタブへ自動的に置換できます。


制限事項
このマクロは行頭のインデントにおいて「タブと空白が混在している場合」、全てをタブに置き換えることが出来ません。
このマクロが置換できるのは「タブ幅と同じ空白が連続しているものの混在」です。
運用上、現在の実装のほうが柔軟で高速なため、この制限ありバージョンを採用しています。
最後に
秀丸は色々と一歩足りないところが多いのですが、マクロや強調表示をカスタマイズできるため自分好みの環境を作れます。
今回のマクロは簡単ですが、色々と応用が効きますので、これを参考にしてオリジナルの環境を構築していく手がかりにしてくだされば幸いです。
以上、ガノーでした!
コメントを書く