NeomakeでEslintが動かない場合の対処
ブログを引っ越ししましたので,5秒後に移動します
以下のブログを参考にSyntasticからNeomakeに乗り換えてみたのですが,私の環境ではEslintがうまく実行されませんでした.
[Vim]SyntasticによるESLintチェックが遅いのでNeomakeに乗り換えた - dackdive's blog
TL;DR
次のようにしたら動きました.
NeoBundle 'neomake/neomake' NeoBundle 'benjie/local-npm-bin.vim' augroup ft_javascript autocmd! " get eslint path of current environment function! s:GetEslintExe() let l:eslintExe = GetNpmBin('eslint') if empty(l:eslintExe) return 'eslint' else return l:eslintExe endif endfunction " set exe of neomake eslint autocmd FileType javascript let g:neomake_javascript_myeslint_maker = { \ 'exe': s:GetEslintExe(), \ 'args': ['-f', 'compact'], \ 'errorformat': '%E%f: line %l\, col %c\, Error - %m,' . \ '%W%f: line %l\, col %c\, Warning - %m' \ } augroup END let g:neomake_javascript_enabled_makers = ['myeslint'] let g:neomake_error_sign = {'text': '>>', 'texthl': 'Error'} let g:neomake_warning_sign = {'text': '>>', 'texthl': 'Todo'} call neomake#configure#automake('nrw', 750)
環境
- Mac 10.13.3
- MacVim 8.0
現象
参考ブログに倣ってインストールしてみましたが,ローカルのeslintがなく,グローバルのeslintだけある場合にNeomake実行時に次のようなエラーが出ました.
19:31:12 [D +7.45] [-.-:1:1] automake: handling event FileType. 19:31:12 [D ] [-.-:1:1] Using setting automake.ignore_filetypes=['startify'] from 'global'. 19:31:12 [E +0.02] [-.-:1:1] Exe () of maker eslint is not executable. 19:31:12 [D ] [-.-:1:1] automake: configured buffer for ft=javascript (no enabled makers). 19:31:12 [D ] [-.-:1:1] automake: setting tick for new buffer. 19:31:12 [D ] [-.-:1:1] automake: no enabled makers.
エラーログは次のような設定を入れて出力させました.
let g:neomake_verbose = 3 let g:neomake_logfile = '/tmp/neomake.log'
また,この時:NeomakeInfo
を実行すると,eslintのexe項目が空文字でした.
原因
ローカル環境のeslintを使うように調整してくれるbenjie/local-npm-bin.vimが,ローカル環境のeslint(node_modules/.bin/eslint
)が見つからない場合にeslintのexeに空文字を設定するようになっていたのが原因でした(該当コード.GetNpmBin()
はローカル環境の実行ファイルが見つからない時に空文字を返す).
参考ブログのbenjie/neomake-local-eslint.vim
から名前から変わっているから,動作が当初から変わってしまったのかな?
解決策
myeslint
というmakerを新たに定義して,filetypeがjavascriptに変わる時に現在のローカル環境のeslintをmakerのexeにセットするようにしました- benjie/local-npm-bin.vimが
eslint
makerを上書きしてしまうタイミングが後になるからか,eslint
makerをvimrcで書き換える方法ではうまく動きませんでした
" filetype: javascript augroup ft_javascript autocmd! " get eslint path of current environment function! s:GetEslintExe() let l:eslintExe = GetNpmBin('eslint') if empty(l:eslintExe) return 'eslint' else return l:eslintExe endif endfunction " set exe of neomake eslint autocmd FileType javascript let g:neomake_javascript_myeslint_maker = { \ 'exe': s:GetEslintExe(), \ 'args': ['-f', 'compact'], \ 'errorformat': '%E%f: line %l\, col %c\, Error - %m,' . \ '%W%f: line %l\, col %c\, Warning - %m' \ } augroup END
その他
- 参考ブログではautocmdでNeomakeの実行を設定していましたが,公式の方法に則って以下のようにしました
call neomake#configure#automake('nrw', 750)
syntasticからNeomakeへの乗り換えで変更したdiffは↓で確認可能です.