vimに非同期なtextlintを適用して快適な編集環境を実現してみた

vimでtextlintを作動させた際に、同期処理の場合は都度ひっかかるような状態になることがあります。aleを利用して非同期にすることで対処してみました。
2019.04.12

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

はじめに

vim上でtextlintを使う際に、環境次第ではlint実行時にまるでフリーズしたような硬直に見舞われることが増えてきました。暫く待つことで解消されるのですが、lintによるものなのか本当にPCトラブルが起きているのか見分けが付かない点で不便です

vimのプラグインを漁っている過程でtextlintを非同期で実施すれば解消されることを知り、既に導入していたaleに合わせてみました。その備忘録となります。

必要なライブラリ

必要なvimプラグインは以下の通りです。

textlintはnpm経由でインストールが必要です。

textlint/textlint

The pluggable natural language linter for text and markdown. - textlint/textlint

textlint設定手続き

極力エラーが出ることを防ぐために、先にtextlintを設定します。既に導入されている方は飛ばしてしまって問題ありません。

npm install textlint --global

~/.textlintrc

とりあえずの設定となっています。

{
  "rules": {
    "max-ten": {
        "max": 3
    },
    "spellcheck-tech-word": true,
    "preset-japanese": true,
  }
}

vim設定手続き

vimプラグインについては利用しているプラグイン管理に依存しますが、今回はdeinです。

Shougo/dein.vim

zap: Dark powered Vim/Neovim plugin manager. Contribute to Shougo/dein.vim development by creating an account on GitHub.

deinの導入(特にNeobundleからの移行)については、以下の記事を参考にして下さい。

NeoBundleからdein.vimへの移行 - Qiita

5年ほど前に構築したVimの環境を使いまわしていたら、いつの間にか**NeoBundle**がオワコンになっていたようで**dein**に移行したよという話です。基本的には [NeoBundle から dein.vim に乗り換えたら...

dein.toml

導入用に最低限の設定にしています。

[[plugins]]
repo = 'w0rp/ale'
[[plugins]]
repo = 'itchyny/lightline.vim'
[[plugins]]
repo = 'maximbaz/lightline-ale'

$XDG_CONFIG_HOME/nvim/init.vim

lightlineとaleに関する設定を追加します。

let g:lightline = {}
let g:lightline.component_expand = {
      \  'linter_checking': 'lightline#ale#checking',
      \  'linter_warnings': 'lightline#ale#warnings',
      \  'linter_errors': 'lightline#ale#errors',
      \  'linter_ok': 'lightline#ale#ok'
      \ }
let g:lightline.component_type = {
      \     'linter_checking': 'left',
      \     'linter_warnings': 'warning',
      \     'linter_errors': 'error',
      \     'linter_ok': 'left'
      \ }
let g:lightline.active = { 'right': [[ 'linter_checking', 'linter_errors', 'linter_warnings', 'linter_ok'  ]]  }
let g:ale_linters = {}
let g:ale_linters.markdown = ['textlint']
let g:ale_completion_enabled = 1

まとめ

textlintをaleにて動かすと非同期の良さがとにかく実感できます。同期によるつっかかりが気になる方にはおすすめです。

参考にした記事