Lint エラーを黙らせる Vim プラグインを作った

公開:2020/10/20
更新:2020/10/25
2 min読了の目安(約2200字TECH技術記事 2

TL;DR

Lint エラーを抑制する Vim のプラグイン作った。

なぜ作ったか

Typescript のテストコードとかで any で型づけしてサボりたい時とか、一時的にコードで Lint を黙らせたいことがあって、その度に ESlint のルール名を調べて、
// eslint-disable-line @typescript-eslint/no-explicit-any とかをコピペしてコードに貼り付けるという作業がだるかった。
(Lint エラーを解消すればそのだるい作業を行わなくていいというのは置いておく)

あるいは Python でいちいち # noqa: C901 とか flake8 のエラーメッセージから拾って書くのがめんどくて(以下同文)。

作ったもの

普段 ESlint も flake8 も自作の Vim プラグインで QuickFix にエラー内容を突っ込んでるので、そこからエラーを拾って該当行の行末、あるいはその上の行に差し込むというものを作った。

https://github.com/heavenshell/vim-shutup/
function s:eslint_format(...)
  if &ft !~ 'typescript'
    return ''
  endif
  let value = a:000[0]
  let position = a:000[1]
  if position == 'upper'
    return printf('// eslint-disable-next-line %s', value)
  endif
  return printf(' // eslint-disable-line %s', value)
endfunction
function s:py_format(...)
  if &ft !~ 'python'
    return ''
  endif
  return printf('  # noqa: %s', a:000[0])
endfunction
let g:shutup_patterns = {
\ '(\zs.*\ze)': function('s:eslint_format'),
\ '[A-Z][0-9]\{3} ': function('s:py_format'),
\ 'eslint:\(Error\|Warning\):\zs.*\ze:': function('s:eslint_format'),
\ }

こんな感じのを vimrc に書いておくと、エラーが出てる行で :Shutup と打つと Quickfix に出てるエラーメッセージからルール名を拾って、コメントに付与してくれる。

自作のプラグイン限定しては vim-lsp とかを使ってる場合に困るので、もう少し汎用性を持たせたかった。
例えば vim-lsp は以下のようなフォーマットでエラーとして記録される

eslint:Error:no-console:Unexpected console statement.

3 つ目のコロンの箇所にある :no-console: がルール名なので、それを引っこ抜く正規表現を g:shutup_patterns のキーとして定義する。

該当行のエラーが正規表現にマッチすると、定義した関数内に入り、引数の 1 番目にマッチした文字列、2 番目にどの位置に挿入するかのマーカーがやってくる。
挿入する文字列を関数から返すとそれを挿入してくれる。

例えば、以下のように一行に二つ違反するルールがあった場合は、二つのルールを結合して挿入する。

console.log('foo' as any)

自分専用のつもりで作ったけど 40 行足らずで実現できて割と便利で気に入ってる。

制約

ALE などは Quickfix にエラーのルール名が表示されないものは、ルール名を指定してコメントを挿入することができない。

追記
同僚に let g:ale_echo_msg_format = '[%linter%] [%severity%] %s (%code%)' でルール名が出ることを教えてもらったので、無事 ALE でも使えるようになった。

TODO

  • [X]ドキュメント書く
  • [X]テスト書く

スクリーンキャスト

with vim-lsp

with vim-eslint

with swnowflake