最近業務で久々にPerlを書いている。最近社内ではperltidyをちゃんと使っているようで、自分の開発環境が追いついてなかったので、git commit時に自動perltidy & emacsから手動でperltidyを実行できる環境を整えてみた。
git commit時に自動perltidy
git pre-commit時に自動的にPerltidyを実行する | blog.fukata.org をほとんどパクらせてもらった。
.git/hooks/pre-commit
#!/bin/bash # 自動perltidy CURRENT_DIR="$(pwd)/$(dirname $0)" PJ="${CURRENT_DIR%/.}/../.." ORIG_IFS=$IFS IFS=$'\n' for f in $(git diff --cached --name-only --diff-filter=AM) do # file is perl and exits if [[ "$f" =~ ^.+\.(pl|pm|t)$ && -e "$PJ/$f" ]]; then carton exec -- perltidy -pro="$PJ/.perltidyrc" -q -b "$PJ/$f" if [ $? -eq 0 ]; then git add "$PJ/$f" rm -f "$PJ/$f.bak" fi fi done IFS=$ORIG_IFS
emacsから手動でperltidyを実行
上記設定でgit commit時に自動でperltidyしてくれるんだけど、そうは言ってもemacsで手動でも実行したい時はあるよなと思って、便利関数を用意した。
(defun run-perltidy () (interactive) (let* ((topdir (magit-toplevel)) (file (buffer-file-name (current-buffer)))) (quickrun :source `((:command . "carton exec -- perltidy") (:default-directory . ,topdir) (:exec . (,(concat "%c -b -bext=/ " file)))))))
quickrunだけでは現在編集中のファイルの絶対パスは取れないので、現在編集中のファイルの絶対パスを取るために少しだけ工夫している。