WindowsのVS Codeでtextlintを使ってリアルタイムに文章校正する。

Windows上のVS Codeでtextlintを使うためにやるべきことは以下の通り。

Node.jsとnpmをインストールする

textlintはNode.js製のプログラムなのでまずはNode.jsとNode.js用のパッケージ管理ツールであるnpmをインストールする。

例えば次のようなページが参考になる⇒Node.js / npmをインストールする(for Windows) - Qiita

上記のページに従って、公式サイトにアクセスし、Windows用のバイナリをダウンロードしてインストールする。 インストールに成功していれば以下のコマンドでバージョンを確認できる。

PS D:\> node --version
v8.10.0
PS D:\> npm --version
5.6.0

textlintをインストールする

npmを使ってtextlintをインストールする。ここでは手っ取り早くグローバルインストールする*1

また、ルールを一から設定するのは手間なので、azuさん作の日本語の技術文書向けプリセットであるtextlint-rule-preset-ja-technical-writingをインストールする。 ついでに例外を明示するためにtextlint/textlint-filter-rule-commentstextlint/textlint-filter-rule-whitelistもインストールする。

PS D:\> npm install -global textlint textlint-rule-preset-ja-technical-writing textlint-filter-rule-comments textlint-filter-rule-whitelist

textlintを設定する

インストール後には設定ファイルを作成する必要がある。 textlintの対象にしたいフォルダへ移動してtextlint --initすると設定ファイルである.textlintrcが生成される。

PS D:\> cd D:\hoge
PS D:\hoge> textlint --init
PS D:\hoge> ls


    ディレクトリ: D:\hoge


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
-a----       2018/03/23     22:53             34 .textlintrc
-a----       2018/03/23     22:06           1174 textlintのインストール.md

あとは生成された設定ファイルで、先ほどインストールしたプリセットルールを有効にする。

{
  "filters": {
      "comments": true
  },
    "rules": {
        "preset-ja-technical-writing": true
    }
}

トラブルシューティング

ここまでやって動くと思いきや、エラーでるのでそのトラブルシューティング

textlintが動作しない

[Error - 23:04:48] Server initialization failed.
  Message: Request initialize failed with message: Failed to resolve module: textlint
  Code: -32603

textlintへのパスが通っていないから発生したエラー。VS Codeを再起動して解決。

モジュールが利用できない

PS D:\Users\username\hoge> textlint --config .\.textlintrc .\textlintのインストール.md
× Error
Failed to load textlint's filter rule module: "comments" is not found.
See FAQ: https://github.com/textlint/textlint/blob/master/docs/faq/failed-to-load-textlints-module.md


× Stack trace
ReferenceError: Failed to load textlint's filter rule module: "comments" is not found.
See FAQ: https://github.com/textlint/textlint/blob/master/docs/faq/failed-to-load-textlints-module.md

    at TextLintModuleResolver.resolveFilterRulePackageName (C:\Users\username\AppData\Roaming\npm\node_modules\textlint\lib\textlint\src\engine\textlint-module-resolver.js:116:19)
    at TextLintModuleLoader.loadFilterRule (C:\Users\username\AppData\Roaming\npm\node_modules\textlint\lib\textlint\src\engine\textlint-module-loader.js:221:43)
    at C:\Users\username\AppData\Roaming\npm\node_modules\textlint\lib\textlint\src\engine\textlint-module-loader.js:80:23
    at Array.forEach (<anonymous>)
    at TextLintModuleLoader.loadFromConfig (C:\Users\username\AppData\Roaming\npm\node_modules\textlint\lib\textlint\src\engine\textlint-module-loader.js:79:32)
    at TextLintEngine.AbstractTextLintEngine (C:\Users\username\AppData\Roaming\npm\node_modules\textlint\lib\textlint\src\engine\textlint-engine-core.js:97:27)
    at new TextLintEngine (C:\Users\username\AppData\Roaming\npm\node_modules\textlint\lib\textlint\src\textlint-engine.js:22:47)
    at Object.executeWithOptions (C:\Users\username\AppData\Roaming\npm\node_modules\textlint\lib\textlint\src\cli.js:133:26)
    at Object.execute (C:\Users\username\AppData\Roaming\npm\node_modules\textlint\lib\textlint\src\cli.js:90:25)
    at C:\Users\username\AppData\Roaming\npm\node_modules\textlint\bin\textlint.js:34:20
    at <anonymous>
    at process._tickCallback (internal/process/next_tick.js:188:7)
    at Function.Module.runMain (module.js:695:11)
    at startup (bootstrap_node.js:188:16)

commentsモジュールが見つからずに発生したエラー。再度全モジュールをnpm install -globalして解消。

コマンドラインでは動くけど、ファイルを開いても拡張機能が動作しない

textlintのVS Code拡張は以下の条件で動作するので、ファイル単位ではなく、フォルダ(プロジェクト)単位で開く必要がある。フォルダを開いて解決。

既に、textlintの設定をしているプロジェクト(node_modulesにtextlintやルールがインストールされていて、.textlintrcが配置されている場所)なら、VS Codeでそのディレクトリを開くだけで動作します。

VS Codeでtextlintを使って文章をチェックする - Qiita

指定のルールだけ設定を変更したい場合(2018/06/24追記)

‘preset-ja-technical-writing‘で一部のルールを無効化したり、設定を変更したりしたいときは、以下のように入れ子に記載する。

{
    "filters": {
        "comments": true
    },
    "rules": {
        "preset-ja-technical-writing": {
            "sentence-length": {
                "max": 100
            }
        }
    }
}

おわりに

ここまでできれば、リアルタイムにlintしながら文章を書くことができる。 ただ、この時点ではデフォルト設定がのみなので、効果は限定的だ。より効果を出すためには、 .textlintrc をカスタマイズして辞書やフィルタを育てていけばよい。 楽をするために頑張って、退屈なことは機械にやらせよう。

*1:Linuxなどにおいてインストールするときは、パーミッションエラー等になることもあるそうなので、よく考えてローカルモードでやった方がよいだろう