ゆず日記

戦う Vimmer 兼 Dvorakユーザ 兼 Kinesisユーザ 兼 おぺらー が戦わないブログ

Vim でオレオレ PHPCS とオレオレ PHPMD でチェックをするお話。

Syntastic を入れる

Vim の Syntastic で PSR-2 コーディング規約でチェックするお話。 - ゆず日記 を参考。

オレオレPHPCS

PSR-2 ベースに今回はルールを作るものとする

% pear install PHP_CodeSniffer # PHP_CodeSniffer インストール
% pear config-show # インストールパス確認
% cd ~/.phpbrew/php/php-5.4.29/lib/php/PHP/CodeSniffer/Standards

# PSR2 のルールセットをコピーする
% cp -r PSR2 OREORE
% vi OREORE/ruleset.xml

今回は試しにPSR-2ディレクトリをまるごとコピーして、インデントが2スペースでも警告が出ないようインデントルールを無視するセットを作ってみる。

# 2行目のrulesetをOREOREに
<?xml version="1.0"?>
<ruleset name="OREORE">
 <description>The OREORE coding standard.</description>


# 59-64行目をコメントアウト
 <!-- Code MUST use an indent of 4 spaces, and MUST NOT use tabs for indenting. -->
 <!-- <rule ref="Generic.WhiteSpace.ScopeIndent"> -->
  <!-- <properties> -->
   <!-- <property name="ignoreIndentationTokens" type="array" value="T_COMMENT,T_DOC_COMMENT"/> -->
  <!-- </properties> -->
 <!-- </rule> -->
 <!-- <rule ref="Generic.WhiteSpace.DisallowTabIndent"/> -->

% phpcs --standard=oreore ./hoge.php # インデント警告が無くなる。

.vimrc にはこんな感じで実行時のオプション指定できる。

" ルール名に依る指定
let g:syntastic_php_phpcs_args='--standard=oreore'

今見たら、--standardにはパス指定も可能だったので

" パスに依る指定
let g:syntastic_php_phpcs_args='--standard=$HOME/.conf/phpcs/ruleset.xml'

とかにして置くと dotfiles リポジトリや開発環境のリポジトリのルールセットを参照して警告がセットできる。

もっと詳しくは Manual :: A sample ruleset.xml file that describes all features of the format を見よう。

オレオレPHPMD

PHPMD - PHP Mess Detector の通りにインストール

Syntastic のデフォルト設定はこんな感じ syntastic/phpmd.vim at master · scrooloose/syntastic · GitHub

'post_args': 'codesize,design,unusedcode,naming'

phpmd にはもう1つ controversial-rules と呼ばれるルールがあるようだが、その名の通り賛否両論なようなので有効にされてないというところか。

なお、変数名が3文字以下の場合、 $db とかでも警告が出てウザいので、試しに naming ルールを消してみる。

let g:syntastic_php_phpmd_post_args='codesize,design,unusedcode'

これでVimを起動すると、naming ルールの警告がでなくなる。

ただし、これは naming-rules に載っている他の naming ルールも出なくなる。例えば、getX() などのメソッドなのに boolean を返すメソッドは命名箇所に isX() とかにしろよという警告がでなくなるため、厳密にやるのであれば creating-a-ruleset を参考に独自 ruleset を指定するべきである。

"べきである"とか言っちゃったのでやってみた。

let g:syntastic_php_phpmd_post_args='$HOME/.conf/phpmd/ruleset.xml'

とかにして、ruleset.xmlに以下のように書いてみる。

<?xml version="1.0"?>
<ruleset name="OREORE PHPMD rule set" xmlns="http://pmd.sf.net/ruleset/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pmd.sf.net/ruleset/1.0.0 http://pmd.sf.net/ruleset_xml_schema.xsd" xsi:noNamespaceSchemaLocation=" http://pmd.sf.net/ruleset_xml_schema.xsd">
<description>
  OREORE PHPMD rule set
</description>
<rule ref="rulesets/codesize.xml" />
<rule ref="rulesets/design.xml" />
<rule ref="rulesets/unusedcode.xml" />
<rule ref="rulesets/naming.xml">
  <exclude name="ShortVariable" />
  <exclude name="LongVariable" />
</rule>
</ruleset>

<exclude name="ShortVariable" /> でルールセット内の特定ルールのみ無効にしている。

もし無効にするのでなく、閾値を変更するには以下のようにするといい感じ。

<rule ref="rulesets/codesize.xml/CyclomaticComplexity">
  <priority>1</priority>
  <properties>
    <property name="reportLevel" value="5" />
  </properties>
</rule>