もた日記

くだらないことを真面目にやる

Vimメモ : ALE(Asynchronous Lint Engine)で非同期コードチェック

ALE(Asynchronous Lint Engine)


wonderwall.hatenablog.com

上記記事で、flake8でPythonのコードをチェックするためにSyntasticvim-flake8を使ってみたが、チェック中に操作ができないので非同期で動作するプラグインを調べてみる。
プラグインとしてはvim-watchdogsNeomakeがあるが、今回はALE(Asynchronous Lint Engine)プラグインを試してみる。

github.com

ALEはNeovimとVim 8で動作する非同期コードチェックのプラグインで、図のように入力しながらのコードチェックが可能になる。

f:id:wonder-wall:20170226195638g:plain

サポート言語とLintツール


サポートしている言語とLintツールは下記リンクに書いてある。
GitHub - w0rp/ale: Asynchronous Lint Engine

言語とLintツールの例としては下記表を参照。

Language Tools
CoffeeScript coffee, coffeelint
CSS csslint, stylelint
HTML HTMLHint, tidy
JavaScript eslint, jscs, jshint, flow, standard
JSON jsonlint
Python flake8, mypy, pylint
Ruby rubocop
SASS sass-lint, stylelint
SCSS sass-lint, scss-lint, stylelint


インストール


NeoBundleの場合は下記行をvimrcに追加。

NeoBundle 'w0rp/ale'

deinの場合は下記行をdein.tomlなどに追加。

[[plugins]]
repo = 'w0rp/ale'


使い方


LintツールとALEのインストールが成功していれば特に設定しなくても動作するようになっており、ファイルオープン時や入力中に非同期でコードチェックが実行される。
画面の左端にエラーの場合は>>、警告の場合は--が表示され、選択行に対するメッセージが画面下部に表示される。

f:id:wonder-wall:20170301213408p:plain

FAQと設定


READMEにFAQが書いてあるので、FAQを見ながら設定方法を確認する。設定のヘルプは:help ale-options:help ale-linter-optionsに書いてある。

特定のLintツールのみを有効にする

デフォルトの設定では編集中の言語で利用可能なLintツールが全て実行されるので、特定のLintツールのみを有効にしたい場合は以下のように記述する。

let g:ale_linters = {
\   'javascript': ['eslint'],
\}


左端のシンボルカラムを表示したままにする

エラーと警告を表す>>--が表示されている左端のシンボルカラムは、全てのエラーと警告がなくなると非表示になる。画面全体が左に動くことになるため、これが気になる場合は下記設定を追加することでシンボルカラムを常に表示しておくことができる。

let g:ale_sign_column_always = 1


シンボルを変更する

エラーと警告のシンボルを変更したい場合は以下のように記述する。

let g:ale_sign_error = '!!'
let g:ale_sign_warning = '=='

ハイライトも変更可能で、無効にしたい場合は下記設定を追加する。

highlight clear ALEErrorSign
highlight clear ALEWarningSign

f:id:wonder-wall:20170301215631p:plain

エラーと警告数をステータスラインに表示する

エラーと警告数をステータスラインに表示したい場合は、statusline設定に%{ALEGetStatusLine()}を追加する。
lightline.vimを使用している場合は以下のように設定すればよい。

let g:lightline = {
  \'active': {
  \  'left': [
  \    ['mode', 'paste'],
  \    ['readonly', 'filename', 'modified', 'ale'],
  \  ]
  \},
  \'component_function': {
  \  'ale': 'ALEGetStatusLine'
  \}
\ }

f:id:wonder-wall:20170301220835p:plain

ステータスラインで表示するフォーマットを変更したい場合は、下記設定を追加。1番目がエラー、2番目が警告、3番目がエラーと警告がなかった場合の表示。

let g:ale_statusline_format = ['⨉ %d', '⚠ %d', '⬥ ok']

f:id:wonder-wall:20170301221151p:plain

メッセージのフォーマットを変更する

メッセージのフォーマットも以下のように変更可能。

let g:ale_echo_msg_error_str = 'E'
let g:ale_echo_msg_warning_str = 'W'
let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'

f:id:wonder-wall:20170301221520p:plain

コードチェック完了後に特定の操作を実行する

コードチェック完了後に特定の操作を実行したい場合は、以下のように記述する。

augroup YourGroup
    autocmd!
    autocmd User ALELint call YourFunction()
augroup END


エラー間を移動する

エラー間をキー操作で移動したい場合は以下の設定を追加。C-jで次のエラー、C-kで前のエラーに移動できる。

nmap <silent> <C-k> <Plug>(ale_previous_wrap)
nmap <silent> <C-j> <Plug>(ale_next_wrap)


ファイル保存時のみチェックするようにする

入力中のコードチェックはやめて、ファイル保存時のみチェックしたい場合は下記設定を追加。
なお、ファイルオープン時のチェックも無効にできる。

let g:ale_lint_on_save = 1
let g:ale_lint_on_text_changed = 0

" ファイルオープン時にチェックしたくない場合
let g:ale_lint_on_enter = 0


ロケーションリストの代わりにQuickFixを使用する

ロケーションリストの代わりにQuickFixを使用する場合は下記設定を追加。

let g:ale_set_loclist = 0
let g:ale_set_quickfix = 1

エラーと警告の一覧を見るためにウィンドウを開いておきたい場合は下記設定を追加。

let g:ale_open_list = 1

" エラーと警告がなくなっても開いたままにする
let g:ale_keep_list_window_open = 1

f:id:wonder-wall:20170301223515p:plain

実践Vim 思考のスピードで編集しよう! (アスキー書籍)

実践Vim 思考のスピードで編集しよう! (アスキー書籍)