Perltidy, CPerlMode

Perlを書く生活を少しだけ幸せにしてくれると噂のツールをちょっとだけ使いはじめてみた.


Perltidy

Perl用のプリティプリンタ. 多分,他人の書いたコードを弄るときやグループで仕事をするときに便利. そんなに汚いコードを書いているわけでもないので,あんまり効果は感じない.

こんな設定ファイル (${HOME}/.perltidyrc) で.

-l=78   # Max line width is 78 cols (default: 80)
-i=4    # Indent level is 4 cols (default: 4)
-ci=4   # Continuation indent (applied when a long line is broken) is 4 cols (default: 2)
    
-se     # Errors to STDERR
-vt=2   # Maximal vertical tightness (default: 0)
-cti=0  # No extra indentation for closing brackets
    
-pt=1   # Parenthesis tightness (default: 1, 1 means medium)
-bt=1   # Brace tightness (default: 1, 1 means medium)
-sbt=1  # Square brace tightness (default: 1, 1 means medium)
-bbt=1  # Block brace tightness (default: 1, 1 means medium)
    
-nsfs   # No space before semicolons
-nolq   # Don't outdent (reverse indent) long quoted strings
    
-wbb="% + - * / x != == >= <= =~ !~ < > | & >= < = **= += *= &= <<= &&= -= /= |= >>= ||= .= %= ^= x="
        # Break before all operators 
    
--nohtml-entites  # HTML option

emacs から簡単に呼び出せるように, 次のような perltidy-region の定義を .emacs に追加しておく.

(defun perltidy-region ()
  "Run perltidy on the current region."
  (interactive)
  (save-excursion
    (shell-command-on-region (point) (mark) "perltidy -q" nil t)))

ちなみに,-html オプションを付けるとかっこいい HTML に整形して出力してくれる. どちらかというと,こっちの機能のほうが重宝.

CPerlMode

emacs の組み込み perl-mode でもそれほど困っているわけではないが, 構文認識などの点でより賢い cperl-mode を導入してみた. .emacsに次のような設定を追加する.

(defalias 'perl-mode 'cperl-mode)

これで perl-mode の代わりに cperl-mode が起動するようになるはず. ("File mode specification error ..." とメッセージが出て失敗する場合は, ここ から 最新版を持ってきて使うとうまく行くかも)

デフォルトではいささか良くないフォントロックをどうにかする設定などを追加.

(add-hook 'cperl-mode-hook
          (lambda ()
            (setq cperl-invalid-face (quote off)) ; スペースを _ で表示するのを止める
            (setq cperl-indent-level 4)
            (setq cperl-continued-statement-offset 4)
    
            (set-face-foreground 'cperl-array-face "khaki2")
            (set-face-underline-p 'cperl-array-face t)
            (set-face-background 'cperl-array-face nil)
            (set-face-bold-p 'cperl-array-face nil)
     
            (set-face-foreground 'cperl-hash-face "khaki2")
            (set-face-underline-p 'cperl-hash-face t)
            (set-face-background 'cperl-hash-face nil)
            (set-face-bold-p 'cperl-hash-face t)
            (set-face-italic-p 'cperl-hash-face nil)
     
            (set-face-foreground 'cperl-nonoverridable-face "white")
            ))

CPerlMode の便利機能として,emacsからperldocが引けるというものがある. M-x cperl-perldocで OK.