$shibayu36->blog;

株式会社はてなでエンジニアをしています。プログラミングや読書のことなどについて書いています。

git commit時に自動perltidy & emacsからperltidy実行

最近業務で久々に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だけでは現在編集中のファイルの絶対パスは取れないので、現在編集中のファイルの絶対パスを取るために少しだけ工夫している。