PHP_CodeSniffer und PHP Mess Detector mit Syntastic in Vim integrieren


VIM mit Syntastic for PHP  and Drupal development

Abbildung 1, Vim mit Editor Tab und location list.
Bei der Statischen Code Analyse1 (englisch linting), welche den den White-Box-Test-Verfahren zugeordnet ist wird der Quellcode einer Software auf seine Beschaffenheit überprüft.
Hierzu gehört z.B. neben dem eigentlichen Linting, in PHP mit z.B. php -l oder dem Tool phplint die Überprüfung von Coding-Standards2 oder das Erkennen von potenziellen Problemem bzw. suboptimalen Code wie z.B. ungenutzen Variablen, Properties oder Funktionen, zu hoher Komplexität (z.B. in Zusammenhang mit Wartbarkeit) und die Erkennung möglicher Fehler.

In der Programmiersprache PHP werden hierfür die Werkzeuge PHP_CodeSniffer3 (squizlabs/PHP_CodeSniffer4) und PHP Mess Detector5 genutzt, welche sich bequem in IDE's wie PHPStorm integrieren lassen6. Aber wie schaut es mit einem scheinbar betagtem und angestaubtem UNIX-Editor wie dem VIM aus?

Natürlich geht das auch im VIM! Wie zeigt dieser Post.

Als erstes brauchen wie das Syntax-Check-Plugin Syntastic7 für VIM, welches wir via Paketmanager unserer Distribution (hier Debian) installieren:

sudo apt-get install vim-syntastic

Dann brauchen wir noch phpmd und phploc, unsere eigentlichen Werkzeuge für die Code-Analyse, die wir über composer installieren:

composer global require "phpmd/phpmd"  
composer global require "phploc/phploc"

Unsere über composer installierten Tools sollten sich natürlich im Suchpfad für ausführbare Dateien, kurz PATH befinden, hierzu dem Startup-File(~/.bashr, ~/.zshrc, usw.) deiner Shell folgendes Statement verpassen:

export PATH=$PATH:"/home/florian/.composer/vendor/bin"

Als letztes muss VIM noch konfiguriert werden, hier bearbeiten wir die Datei .vimrc in unserem Home-Verzeichnis mit

vi ~/.vimrc

und fügen die folgenden Zeilen am Ende der Datei hinzu:

  1. " Syntastic
  2. let g:syntastic_aggregate_errors=1
  3. let g:syntastic_sort_aggregate_errors=1
  4. let g:syntastic_id_checkers=1
  5. let g:syntastic_cursor_column=1
  6. let g:syntastic_enable_signs=1
  7. let g:syntastic_always_populate_loc_list=1
  8. let g:syntastic_enable_highlighting=1
  9. let g:syntastic_error_symbol='x'
  10. let g:syntastic_warning_symbol='!'
  11. let g:syntastic_mode='active'
  12. let g:syntastic_php_checkers=1
  13. let g:syntastic_check_on_open=1
  14. let g:syntastic_check_on_wq=1
  15. let g:syntastic_auto_loc_list=1
  16. let g:syntastic_mode_map={
  17. \'mode': 'active',
  18. \'active_filetypes': ['php'],
  19. \'passive_filetypes': []
  20. \}
  21. unlet g:syntastic_php_checkers
  22. let g:syntastic_php_checkers = ["php", "phpcs", "phpmd"]
  23. let g:syntastic_php_phpcs_args='--report=csv --standard=my_standard'
  24.  
  25. augroup AutoSyntastic
  26.   autocmd!
  27.   autocmd BufWritePost *.php call s:syntastic()
  28.   autocmd BufWritePost *.module call s:syntastic()
  29.   autocmd BufWritePost *.install call s:syntastic()
  30.   autocmd BufWritePost *.profile call s:syntastic()
  31.   autocmd BufWritePost *.inc call s:syntastic()
  32.   autocmd BufWritePost *.test call s:syntastic()
  33. augroup END
  34. function! s:syntastic()
  35.   SyntasticCheck
  36. endfunction

Listing 1, ~/.vimrc mit Syntastic Konfiguration für PHP- und Dateinamenserweiterungen für die Drupal-Entwicklung (Z. 28 bis 32)

Die Bedienung gestaltet sich jetzt wie folgt:
Die Editor ist jetzt zweigeteilt, s.o. Abbbildung 1, oben befindet sich das Editor-Tab, hinzugekommen ist das sog. location list unten:

  1 UneededHelper.module|7 col 1 error| There must be no blank line following an inline comment [php/phpcs]
  2 UneededHelper.module|15 col 3 error| Whitespace found at end of line [php/phpcs]
  3 UneededHelper.module|16 col 4 warning| @package tag is not allowed in class comment [php/phpcs]
  4 UneededHelper.module|22 error| Avoid unused private fields such as '$foo'. [php/phpmd]
  5 UneededHelper.module|24 col 3 error| Doc comment for parameter \"$bar\" missing [php/phpcs]

Listing 2, location list Beispieleinträge

Im Editor-Bereich sind am linken Rand Indikatoren für Fehler und Warnungen, die sog. signs dazugkommen, bei mir S>, entweder Rot hinterlegt für Error oder Gelb für Warning. Mit CRTL und 2xW springt man von Editorfenster in die location list, in der dann mit den Richtungstasten durch die einzelnen Listeneinträge gehen kann, ein ENTER lässt dich dann an die entsprechende Stelle in Code springen. Nach Behebung eines Listeneintrages im Code, und speichen sollte die Liste nun schrumpfen :D

Danke bro für das Teilen dieses Jedi-Vim-Wissens!