13
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

neovimらしいeslint

Last updated at Posted at 2016-07-22

(注)最近はale.vimに移行しました。

概要

vimでjavascriptを書くための設定をしていたところどうにもシンタックスチェックが遅いの改善しようと思った。

もともとはSyntasticeslint使っていたが、保存しないとしてくれないし、そもそも遅い。
eslint自体遅いという話もあるので、非同期できないのか調べたけどまだ出来ない模様。いま取り組んでいるようなので、そのうち出来ると思うけど、そもそもsyntasticがvim用なのでneovimの非同期処理は使わないみたい。

neovimの非同期処理を使ったリンターがないか調べてみたらあったのでそちらに移行することにした。

Neomake

その名もNeomake
名前からてっきりコンパイルしてくれるやつかと思っていたら、linterとかもしてくれるみたい。それも非同期で!
まだ導入したばかりだけど、問題なく動くし固まらないし良さそう。

導入

必要となるのは以下のもの

  • neovim
  • eslint
  • Neomake

eslint

npm install -g eslint

neomake

適当なプラグインマネージャーを使ってインストールしたらいい。
自分の場合、dein.vimを使っているので以下のようtomlで記述している。

[[plugins]]
repo = 'neomake/neomake'
on_path = '.*'
hook_add = '''
source  ~/.config/nvim/plugins/neomake.rc.vim
'''
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Neomake setting

" 保存時とenter時にNeomakeする
autocmd! BufWritePost,BufEnter * Neomake

let g:neomake_javascript_enabled_makers = ['eslint']

簡潔にするために、neomake.rc.vimにneomakeの設定を書いているが、上記の設定は.vimrcinit.vimに書いてもいい。

基本的にこれだけで動くはずである。ダメだった場合
let g:neomake_verbose=3let g:neomake_logfile='/tmp/neomake.log'を設定してみてデバッグしよう。

eslintの場合、.eslintrcに設定を書いているので特に引数を与える必要は無いと思うけど、以下のようにパラメータを付与することが出来る(試していないので保証できないが)。

let g:neomake_javascript_eslint_maker = {
    \ 'exe': 'eslint',
    \ 'args': ['-f', 'compact'],
    \ 'errorformat': '%E%f: line %l\, col %c\, Error - %m,' .
        \ '%W%f: line %l\, col %c\, Warning - %m'
    \ }

使い方

jsファイルを開くとしばらくしたらgutterにマークが出るはずである。
その行に行くとエラーの内容が見える。

エラーの一覧はlocation listにある。
なので以下のコマンドが使える。

コマンド 説明
:lopen location listを閉じる
:lclose location list を閉じる
:lnext 次のエラーに移動
:lprev 前のエラーに移動

eslint_d

mysticateaさんにeslint_dなるものがあると教えてもらったので使ってみた。
eslint_dはeslint用のサーバーを立上けることで立ち上げのオーバーヘッド(〜700ms)をなくして高速化を図ったものらしい。特にjs環境でないvimなどはlintするたびに別プロセスを立ち上げるので特に有効なはずである。

eslint_dはeslint3.0.0+対応している。

導入

npm i -g eslint_d

neomake自体はeslint_dに対応しているので、以下のようにするだけでいい。
ついでにインサートモードを抜けた時もlintするようにした。
また、vim終了時にeslint_dを閉じるようにした。

neomake.rc.vim
"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
" Neomake

augroup neomake_run
  " 保存時とenter時にlintする
  autocmd! BufWritePost,BufEnter * Neomake

  " インサートモードを抜けた時もlint
  autocmd! InsertLeave *.js Neomake 

  " vim終了時にeslint_dを終了
  autocmd! VimLeave *.js  !eslint_d stop
augroup END

let g:neomake_javascript_enabled_makers = ['eslint_d']

おまけ

実際どれだけ速いのか試してみた。

❯ wc test.js
     798    2474   24938 test.js

❯ time eslint test.js
eslint test.js  1.05s user 0.14s system 105% cpu 1.123 total

❯ time eslint test.js
eslint test.js  1.08s user 0.13s system 110% cpu 1.092 total

❯ time eslint test.js
eslint test.js  1.00s user 0.12s system 114% cpu 0.978 total

❯ time eslint_d test.js
eslint_d test.js  0.12s user 0.07s system 12% cpu 1.495 total

❯ time eslint_d test.js
eslint_d test.js  0.10s user 0.07s system 43% cpu 0.405 total

❯ time eslint_d test.js
eslint_d test.js  0.10s user 0.06s system 48% cpu 0.326 total

❯ time eslint_d test.js
eslint_d test.js  0.10s user 0.07s system 52% cpu 0.336 total

2回目以降は2倍ほど速い!

13
16
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
16

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?