【小ネタ】nvimで突然textlintがエラーを吐くようになった時にやったこと

2022.10.24

こんにちは、AWS 事業本部コンサルティング部に所属している今泉(@bun76235104)です。

私は平時nvimを利用しており、ブログ記事を書く際にはtextlintを利用して、おかしな文章を極力少なくしようとしています。

ある日nvimを利用している際に、それまで動かしていたtextlinが急にエラーが表示されるようになりました。

地味にハマってしまったので、ハマりポイントを共有します。

先に結論

時間がない方はこちらだけご覧ください。

よくあることですが、nvim上で動作しているtextlintとターミナル上で実行するtextlintが異なっていました。

# ターミナル上でのこの結果と
which textlint
# nvim上でのこのコマンドの結果が異なる
:!which textlint

症状

私はnvimプラグインのnull-ls.nvimを利用して、textlintをLSPのシステムに乗せて、マークダウンを編集中に非同期でチェックするしくみを導入しています。(参考:【Neovim】null-lsを利用してtextlintを動かす

以下のようにtextlintが発見した修正すべき点をnvimに表示させているような形です。

nvim_textlint_20221022

ところがある日nvimの設定ファイルを見直しているタイミングで、以下のようなエラーがnvim上で表示され、textlintが正しく動作しなくなりました。

Error
Failed to load textlint's preset module: "ja-technical-writing" 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 preset module: "ja-technical-writing" is not found.
See FAQ: https://github.com/textlint/textlint/blob/master/docs/faq/failed-to-load-textlints-module.md

解決に至るまでに試したこと

私はtextlintをnpmでグローバルにインストールしています。

以下コマンドで、textlintがターミナル上で実行できることを確認しました。

textlint --preset ja-technical-writing test.md

以下のように指摘してくれます。

textlint_display_error_2022_1023

textlintやtextlintで利用するモジュールは利用できる状態だということがわかります。

ではnvim上とターミナル上で実行しているtextlintコマンドが異なるのではという気づきを得ました。

ということでターミナル上とnvim上で実行しているtextlintのパスを調べてみました。

# ターミナル上
which texlint
> /opt/homebrew/bin/textlint

次にnvimでコマンドを実行します。

!which textlint
> /Users/ユーザー名/.local/share/nvim/mason/bin/textlint

明らかに実行しているパスが違いますね。

原因・解決方法

私はmason.nvimというLSPサーバーを簡単に管理できるプラグインを利用しています。

以下のようにnvim上で:Masonコマンドを実行することで、グラフィカルにLSPサーバーをインストール可能です。

mason_nvim_install_capture_2022_1022

おそらくこの画面でLSPを管理している時に、誤ってtextlintをインストールしてしまったようです。

nvim上で以下コマンドを実行してtextlintのLSPサーバーをアンインストールしました。

:MasonUninstall textlint

そして、確認のためもう一度nvim上で実行されているtextlintのパスを確認します。

:!which textlint
> /opt/homebrew/bin/textlint

意図したパスのtextlintが実行され、無事nvim上にtextlintの指摘が表示されるようになりました。

まとめ

自分が意図しているコマンドと実行されるコマンドが異なるという、お手本のような事例でした。

今回はmason.nvimでインストールしたLSPサーバーが原因でした。

「ローカルインストールしたモジュールを実行しているつもりが、グローバルにインストールしたモジュールを実行していた」ということも良くありますので、皆さんもお気を付けください。