既存のプロジェクトのファイルにEmacsでインデントをかけていくスクリプトを書きました, しかしESLintのインデントルールとEmacsのモードが異なっていたので不採用
既存のプロジェクトのファイルが自動インデント規則に従ってない場合, 全てに自動インデントをかけたいことがあります.
JavaScriptとかならESLintである程度は抑制できるのかもしれませんが, どうもESLintはコードフォーマッティングツールとしてはあまり優秀ではないみたいです. prettier/prettier: Prettier is an opinionated code formatter. というのがあるらしいです. しかしこういうものはプロジェクト全体に導入する必要があるじゃあないですか, とりあえずインデントを揃えたいだけなので今回は見送ります.
そしてHTMLとCSSには簡単に導入できるそういったツールはない.
SASSにはsass-convert
がありますが…
というわけで,
Emacsでインデント揃えたいです.
.editorconfig
の設定をちゃんと適用できるエディタ環境で揃えないといけないという事情があり,
そういったエディタでスクリプトを回せるのはEmacsとVimぐらいでしょう.
以下のような手順で出来るでしょう.
- プロジェクトのGitで管理しているファイルを全て列挙する,
(magit-list-files)
で可能 - Emacsで
(find-file f)
,(mark-whole-buffer)
,(indent-region (point-min)(point-max))
を繰り返す
なんだ簡単だなと思ったらfind-file
でハマりました.
カレントディレクトリが1回目のfind-file
で変更されるため,
2回目以降のfind-file
が相対ディレクトリで正しく開けなくなるようですね.
file-truename
をかけて絶対パスに変換します.
(mapc (lambda (f) (find-file f) (mark-whole-buffer) (indent-region (point-min)(point-max)) (save-buffer)) (mapcar 'file-truename (magit-list-files)))
で完成と思ったのですがeditorconfigを有効にしていなかったので無効でインデントされました.(1敗)
(editorconfig-mode 1)
を付け加えておきました.
package-lock.json
みたいな大きなファイルがあるとものすごく重くなって全く進まなくなるのでこれを動かす時は削除してしまいましょう.(2敗)
まっさらの状態でないとタグジャンプのファイル更新が重たいどころか失敗して止まってしまうのでgit clean -dxi
してEmacsを再起動しておきましょう.(1敗)
magitを読み込んでおかないと動かないのでstatusでも表示しておきましょう.(4敗)
画像ファイルなどを読み込むとへんなことになるので事前に排除しておきましょう.(2敗)
git - List all text (non-binary) files in repo - Stack Overflowを参考にして, テキストファイルだけ処理するようにします.
(mapc (lambda (f) (find-file f) (mark-whole-buffer) (indent-region (point-min)(point-max)) (save-buffer)) (mapcar 'file-truename (split-string (shell-command-to-string "git grep --cached -Il ''") "\n" t)))
Emacsのjs-modeは一般的なインデントをしないどころか複雑な正規表現リテラルのパースに失敗するので-modeを使いましょう.(1敗) 素のjs-modeとかほとんど誰も使ってないと思うのにこれまで生のJavaScriptを書いて来なかったので放置していました. と思ったらweb-modeもESLintのインデントルールに沿っていないみたいですね.
当初の手段だったEmacsでインデントを適用していくというものは達成できましたが, そもそもEmacsのモードのインデントルールが一般的なESLintのものと異なっているという問題が発生して目的は達成できませんでした.
というか, Emacsで行うという手段すら簡単ですぐ終わるから行おうと思っていた手段だったのに, 結構面倒臭くて手段の採択理由も満たせませんでした.
ESLintのインデントルールにマッチしたインデントを行ってくれるEmacsのモードを探しに行こうと思います.
せっかくなのでHTMLとCSSだけはこの方法でインデントしようと思いましたが, 2ファイルしかない…