読者です 読者をやめる 読者になる 読者になる

ゆず日記

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

syntasticを使う際には必ずcheckerを指定しようというお話。

Vim JavaScript

syntastic_version: 3.4.0-31 の頃にこの記事を書いてます。

結論

scrooloose/syntastic で JSHint を使っている人は、 syntastic_javascript_checkers で明示的に指定しよう。

let g:syntastic_javascript_checkers = [‘jshint’]

なんでこんな話になるのか

大体 .vimrc にこんな設定を書いているハズ。

let g:syntastic_mode_map = {
  \ 'mode': 'active',
  \ 'active_filetypes': ['javascript'],
  \ 'passive_filetypes': ['html']
  \}
let g:syntastic_auto_loc_list = 1

で、人によっては以下の一行を書いてたり、書いてなかったり。

let g:syntastic_javascript_checker = 'jshint'

さらに、JSHint だけでなく JSLint もインストールしてるよって人もいると思う。

syntastic_javascript_checker = ‘jshint' 書いてる人

以下のような warning が出る。.vimrcの複数箇所に記述してるわけでもないのでちょっと納得いかない。

syntastic: warning: variable g:syntastic_javascript_checker is deprecated

syntastic_javascript_checker = ‘jshint' 書いてなくて、JSHint と JSLint 両方インストールしてる人

要はほぼ未設定だけど JSHint と JSLint 両方入ってる環境。一見 JSHint が優先して動作してるから問題なさそうに見える。が、

  1. 普段は JSHint っぽい Warning が出る。
  2. 全部エラーを消すと突然大量の Error が出る。.jshintrc を設定しても改善なし。

これは実は以下の仕様で動作してる

  1. JSHint で check する
  2. JSHint の Error がなければ、JSLint で check を開始する

何でや!JSHint でチェック完了してるんだから JSLint 実行しなくてもいいやろ!

対策

scrooloose/syntastic にはこう書いてます。

Some filetypes, like PHP, have style checkers as well as syntax checkers. These can be chained together like this:

vim let g:syntastic_php_checkers = ['php', 'phpcs', 'phpmd'] This is telling syntastic to run the php checker first, and if no errors are found, run phpcs, and then phpmd.

You can also run checkers explicitly by calling :SyntasticCheck .

配列順に、最初に php checker を実行しますが、エラーが無ければ次に phpcs, そして phpmd と実行するようですね。

で、syntastic は /plugin/syntastic/registry.vim の中にデフォルト設定としてこんな感じに書いてあります。

let s:defaultCheckers = {
...
        \ 'javascript':  ['jshint', 'jslint’],
...

ということで、以下のような長さが1個の配列を設定すれば諸々の問題なく syntastic で JSHint のみを使用できます。

let g:syntastic_javascript_checkers = [‘jshint’]

蛇足

個人的に以下も追加してます。

let g:syntastic_enable_signs = 1
let g:syntastic_error_symbol = '✗'
let g:syntastic_warning_symbol = '⚠'