WordPress コーディング基準がこれまで慣れ親しんできたコーディングスタイルや自分の好みとことごとく逆なので、心底参りかけていた。「タブでなければなりません」とことさら強調するスタイルはさすがに初めてみた。
書いちゃったものを、何の支援もなく一つ一つ直してくのは酷なわけで、せめて php-mode.elのカスタマイズくらいはしようかと。
どうやってカスタマイズするんだ? と調べてびっくり。
1 (defun php-enable-default-coding-style ()
2 "Set PHP Mode to use reasonable default formatting."
3 (interactive)
4 (c-set-style "php"))
5
6 (c-add-style
7 "pear"
8 '("php"
9 (c-basic-offset . 4)
10 (c-offsets-alist . ((case-label . 0)))))
11
12 (defun php-enable-pear-coding-style ()
13 "Sets up php-mode to use the coding styles preferred for PEAR
14 code and modules."
15 (interactive)
16 (setq tab-width 4
17 indent-tabs-mode nil)
18 (c-set-style "pear")
19
20 ;; Undo drupal/PSR-2 coding style whitespace effects
21 (set (make-local-variable 'show-trailing-whitespace)
22 (default-value 'show-trailing-whitespace)))
23
24 (c-add-style
25 "drupal"
26 '("php"
27 (c-basic-offset . 2)))
28
29 (defun php-enable-drupal-coding-style ()
30 "Makes php-mode use coding styles that are preferable for
31 working with Drupal."
32 (interactive)
33 (setq tab-width 2
34 indent-tabs-mode nil
35 fill-column 78)
36 (set (make-local-variable 'show-trailing-whitespace) t)
37 (add-hook 'before-save-hook 'delete-trailing-whitespace nil t)
38 (c-set-style "drupal"))
39
40 (c-add-style
41 "wordpress"
42 '("php"
43 (c-basic-offset . 4)))
44
45 (defun php-enable-wordpress-coding-style ()
46 "Makes php-mode use coding styles that are preferable for
47 working with WordPress."
48 (interactive)
49 (setq indent-tabs-mode t
50 fill-column 78
51 tab-width 4
52 c-indent-comments-syntactically-p t)
53 (c-set-style "wordpress")
54
55 ;; Undo drupal/PSR-2 coding style whitespace effects
56 (set (make-local-variable 'show-trailing-whitespace)
57 (default-value 'show-trailing-whitespace)))
58
59 (c-add-style
60 "symfony2"
61 '("php"
62 (c-offsets-alist . ((statement-cont . php-lineup-hanging-semicolon)))))
63
64 (defun php-enable-symfony2-coding-style ()
65 "Makes php-mode use coding styles that are preferable for
66 working with Symfony2."
67 (interactive)
68 (setq indent-tabs-mode nil
69 fill-column 78
70 c-indent-comments-syntactically-p t
71 require-final-newline t)
72 (c-set-style "symfony2")
73
74 ;; Undo drupal/PSR-2 coding style whitespace effects
75 (set (make-local-variable 'show-trailing-whitespace)
76 (default-value 'show-trailing-whitespace)))
77
78 (c-add-style
79 "psr2"
80 '("php"
81 (c-offsets-alist . ((statement-cont . +)))))
82
83 (defun php-enable-psr2-coding-style ()
84 "Makes php-mode comply to the PSR-2 coding style"
85 (interactive)
86 (setq indent-tabs-mode nil
87 fill-column 78
88 c-indent-comments-syntactically-p t
89 require-final-newline t)
90 (c-set-style "psr2")
91
92 ;; Apply drupal-like coding style whitespace effects
93 (set (make-local-variable 'require-final-newline) t)
94 (set (make-local-variable 'show-trailing-whitespace) t)
95 (add-hook 'before-save-hook 'delete-trailing-whitespace nil t))
てわけなので、まずは「カスタマイズ」するまでもなく、「M-x php-enable-wordpress-coding-style」で切り替えられる。
「ビックリ」したのはこうやって切り替えられることではなく、色んなスタイルがあることでもなく。
色んなスタイルが乱立してることに関しては C/C++ に勝るものはないしな。ちなみにワタシは C/C++ の場合は、K&R スタイルに近いのに今でも愛着がある。Python は悩まなくていいよなぁ。PEP8 だけでいいんだから。
驚いたというよりは、苛立つのは。以下 WordPress 規約からの引用:
このガイドラインは、Pear 標準に多くの点で似ていますが、いくつかの事項で異なります。
違ってもいいんだけどさ、違う、じゃなくて、なんで「逆らう」の、てことだわ。PEAR 標準は、「タブじゃなくスペース」。これに対して、(中身があまりに薄っぺらい規約な割には)強烈に
本物のタブを使います。スペースはダメです。
という。しかもその理由がまったく腑に落ちない:
こうすると、多くの閲覧環境で柔軟に扱えます。
逆じゃね?
なんつぅか、みな仲良くそういってるなら、従うのにやぶさかじゃねーんだよ。だけどさ、同じ PHP 文化で、しかも「至上最も不毛なとこ」で闘ってどーすんのよ。
…にしても薄い標準だ。見てガッカリした。何か落とし穴的なことから守ってくれるような、そんな標準があるんだろうと思って読んだけどな。
ま、php-mode.el のおかげで、そこそこのストレスで済むから別にいいけどね。コーディングスタイルなんかで個性出すことの方がバカなんであってだな。コーディング標準の役割は、不毛な宗教論争を避けることにもあるわけで。ので WordPress と PEAR が喧嘩してようが、知ったこっちゃないわ。標準があっただけマシ、と思うことにする。