coc.nvimでtextlintを使う

Mon, Oct 26, 2020 One-minute read

WordPressからHogoへの移行に伴い、記事をMarkdownで書くようになったのでtextlintのセットアップを行いました。
普段nvimとcoc.nvimを使っているので、textlintもefm-langserverを使ってcoc.nvimから使えるようにしました。

coc.nvim -> efm-langserver -> textlint

設定ファイルはGitHubのdotfilesリポジトリにもあげています。

前提条件

  • neovimとcoc.nvimを導入済み
    • neovim v0.4.4
    • coc.nvim 0.0.79-6cb5c6cd2d

各ツールのインストール

textlint

textlintとtextlintルールのtextlint-rule-preset-ja-technical-writingをインストールします。

npm install -g textlint
npm install -g textlint-rule-preset-ja-technical-writing

efm-langserver

efm-langserverを使いtextlintをLanguage Server化することで、coc.nvimでdiagnosticsを表示できるようにします。

go get github.com/mattn/efm-langserver

各設定

textlint

textlintは $HOME/.textlintrc に下記のように設定ファイルを用意しました。
インストールしたルールプリセットの preset-ja-technical-writing を有効にしています。

{
  "rules": {
    "preset-ja-technical-writing": true
  }
}

設定ファイルの詳細は下記のドキュメントにあります。
https://github.com/textlint/textlint/blob/master/docs/configuring.md

efm-langserver

efm-langserverは $HOME/.config/efm-langserver/config.yaml に下記のように設定ファイルを用意しました。

version: 2
root-markers:
  - .git/

tools:
  textlint: &textlint
    lint-command: 'textlint --format unix --stdin --stdin-filename ${INPUT}'
    lint-ignore-exit-code: true
    lint-stdin: true
    lint-formats:
      - '%f:%l:%c: %m [%trror/%r]'
    root-markers:
      - .textlintrc

languages:
  markdown:
    - <<: *textlint

lint-commandにはtextlintの実行コマンドを設定しています。
--format unix オプションをつけて実行すると、実行結果が下記のように出力されるので、出力に合わせてlint-formatsでフォーマットを指定しています。

textlint --format unix README.md
/path/to/README.md:5:5: 文末が"。"で終わっていません。 [Error/ja-technical-writing/ja-no-mixed-period]

1 problem

--stdin --stdin-filename ${INPUT} はバッファに対してlintを実行するようにしていますが、 --stdin だけだとプレインテキストとしてlintが実行されるので、 --stdin-filename オプションでファイル名も渡す必要があります。
下記のGitHub Issueに記載がありました。
https://github.com/textlint/textlint/issues/117

coc.nvim

coc.nvimの設定はefm-langserverのREADMEにある設定をそのままもってきました。

{
  "languageserver": {
    "efm": {
      "command": "efm-langserver",
      "args": [],
      "filetypes": ["markdown"]
    }
  }
}

動作

最終的に下記のように動作するようになりました。

参考

下記を参考にさせていただきました。