Emacsにphp-cs, php-stan導入した(けど片方動かない)

DockerEmacsPHP開発環境

環境

  • Emacs 25.2

init.el

;; require前に書く必要があるらしい
(setq php-mode-coding-style 'psr2)
(when (require 'php-mode nil t) 
  ;; 拡張子phpのファイルを開いたときにphp-modeに。
  ;; TODO
  ;; blade.phpはbladeテンプレートなので除く
  (add-to-list 'auto-mode-alist '("\\.php\\'" . php-mode))

  ;; コメントを行コメに
  (defun php-comment-hook ()
    (setq comment-start "//")
    (setq comment-end ""))

  ;; companyによる補完
  (defun php-company-hook ()
    (require 'company-php)
    (company-mode t)
    (ac-php-core-eldoc-setup) ;; enable eldoc
    (make-local-variable 'company-backends)
    (add-to-list 'company-backends 'company-ac-php-backend)
                                        ; 定義にジャンプ
    (define-key php-mode-map  (kbd "M-.") 'ac-php-find-symbol-at-point)
                                        ; ジャンプ先から戻る
    (define-key php-mode-map  (kbd "M-,") 'ac-php-location-stack-back))

  ;; flycheck
  ;; phpcs and phpstan
  (defun php-flycheck-hook ()
    (require 'flycheck nil t)
    (require 'flycheck-phpstan nil t)
    (setq flycheck-phpcs-standard "PSR2")
    (setq phpstan-executable 'docker)
    (flycheck-mode t))

  (add-hook 'php-mode-hook 'php-comment-hook)
  (add-hook 'php-mode-hook 'php-company-hook)
  (add-hook 'php-mode-hook 'php-flycheck-hook)

  (provide 'php-config))

flycheckの設定部分

  ;; flycheck
  ;; phpcs and phpstan
  (defun php-flycheck-hook ()
    (require 'flycheck nil t)
    (require 'flycheck-phpstan nil t)
    (setq flycheck-phpcs-standard "PSR2")
    (setq phpstan-executable 'docker)
    (flycheck-mode t))

  (add-hook 'php-mode-hook 'php-flycheck-hook)

phpcs

  • PHPコードフォーマッタ
  • デフォルトで、パスが通っているphpcsを実行しに行く
  • windows10: 下記バッチ

phpcs.bat

@echo off
REM path通す
docker container run -i -v %CD%:/project --rm herloct/phpcs %*
  • ホストマシンにPHPを入れて依存させたくないので、dockerコンテナを使用する

    • -i … 検査対象のコードを標準入力するために必要
    • -v … 検査対象のコードを入力するために必要
    • --rm… 停止したコンテナ消す
  • macOS, Linux: 下記シェルスクリプト

phpcs.sh

#!/bin/sh
docker container run -i -v $(pwd):/project --rm herloct/phpcs $@
  • エイリアスでもいいが、winがbatなのでこっちもスクリプトにした

phpstan

  • 静的解析

    • 不要use
    • 不要キャスト
    • 不使用変数
  • これだけで良しなにやってくれる。イマドキだ

    • autoloadファイルの解決とかも良しなにやってくれる
    (setq phpstan-executable 'docker)

が……駄目っ……!

  • phpcsを有効にするとphpstanが動かない
Syntax checker in buffer User.php in php-mode:

  phpstan (disabled)
    - major mode: `php-mode' supported
    - may enable: Automatically disabled!
    - executable: Found at c:/Program Files/Docker/Docker/Resources/bin/docker.exe

Flycheck cannot use this syntax checker for this buffer.

Flycheck Mode is enabled.  Use C-u C-c ! x to enable disabled
checkers.
  • executableが存在するのにmay enable: Automatically disabled!ってどういうことなんだ
  • (setq flycheck-phpcs-standard "PSR2")を消すと動く。謎