perltidy and Emacs

perltidy をもっと便利に使おう。主に Emacs から。
まずは O'Reilly の "PERL HACKS" HACK #6 から cperl-mode の設定。

(load-library "cperl-mode")
(add-to-list 'auto-mode-alist '("\\.[Pp][LlMm][Cc]?$" . cperl-mode))
(while (let ((orig (rassoc 'perl-mode auto-mode-alist)))
	 (if orig (setcdr orig 'cperl-mode))))
(while (let ((orig (rassoc 'perl-mode interpreter-mode-alist)))
	 (if orig (setcdr orig 'cperl-mode))))
(dolist (interpreter '("perl" "perl5" "miniperl" "pugs"))
  (unless (assoc interpreter interpreter-mode-alist)
    (add-to-list 'interpreter-mode-alist (cons interpreter 'cperl-mode))))

HACK #7 選択したリージョン内を perltidy で整形。

(defmacro mark-active ()
  "Xemacs/emacs compatibility macro"
  (if (boundp 'mark-active)
      'mark-active
    '(mark)))
(defun perltidy ()
  "Run perltidy on the current region or buffer."
  (interactive)
  ;; Inexplicably, save-excursion doesn't work here.
  (let ((orig-point (point)))
    (unless (mark-active) (mark-defun))
    (shell-command-on-region (point) (mark) "perltidy -pbp -q" nil t)
    (goto-char orig-point)))
;;(global-set-key "\C-ct" 'perltidy)

本では単に -q だけしてるけど、いまは完全 Perl Best Practice (PBP) 形式に合わせていて perltidy の設定ファイルを作っていないのでオプション追加。Cygwin でやる場合は PATH 通しておいて、perl.exe perltidy しないといけないかも。

さて、ここまで来ると、cperl-mode のインデント動作が perltidy のと食い違うのが我慢できなくなるので、なるべく cperl-mode が PBP 準拠の動きをしてくれるように設定する。

;; Use cperl mode instead of the default perl mode
(defalias 'perl-mode 'cperl-mode)

;; turn autoindenting on
(global-set-key "\r" 'newline-and-indent)

;; Use 4 space indents via cperl mode
(custom-set-variables
 '(cperl-close-paren-offset -4)
 '(cperl-continued-statement-offset 4)
 '(cperl-indent-level 4)
 '(cperl-indent-parens-as-block t)
 '(cperl-tab-always-indent t)
 )

;; Insert spaces instead of tabs
(setq-default indent-tabs-mode nil)
(setq-default show-training-whitespace t)

;; Set line width to 78 columns
(setq fill-column 79)
(setq auto-fill-mode t)

余談だけど、cperl-mode で M-x cperl-set-style RET [STYLE_NAME] してから C-xh M-x cperl-indent-region するといろいろスタイルが試せて面白い。詳細は M-x describe-function RET cperl-mode 参照。

Perlベストプラクティス

Perlベストプラクティス

Perl Hacks ―プロが教えるテクニック & ツール101選

Perl Hacks ―プロが教えるテクニック & ツール101選

あとは flymake で文法チェックとか

perl-completion.el で anything 補完とか

あたりを見ておくか。

と、こんなことばかりをやっていて肝心のスクリプトに手がついていない。さすがバッドノウハウの王者 Emacs だな。でもこういう作業こそ楽しかったりするのだけど。

[追記]

perltidy region は日本語が化けてしまうことが判明。(コメントに入れてた日本語がことごとく死んで泣きそうになった。)
どうしたものやら……。