textlintをVimから使う

textlintVimの定番シンタックスチェック用プラグインである scrooloose/syntastic から使える、ということは @azu さんのブログ記事や、同じく @azu さんによる最初のぼくのtextlint記事に対して頂いたブックマーク・コメントなどを通して、情報としては把握していたのですが、どうもそのリンク先に飛んでみても具体的な設定方法などが示されておらず、

ハードル高……という感じで手を打てずにいました。

しかしふと一念発起的に、「とりあえずなんかやってみるか」と、カンであれこれやってみていたら、「あ……動いた」みたいな感じになったので、その知見を共有します。

とりあえず動くまで

まず結論的に、VimMarkdownやテキストファイル(.txt)を開いているときにtextlintを走らせるための設定を示すと以下です。

.vimrc

Plug 'scrooloose/syntastic'

set statusline+=%#warningmsg#
set statusline+=%{SyntasticStatuslineFlag()}
set statusline+=%*

let g:syntastic_always_populate_loc_list = 1
let g:syntastic_auto_loc_list = 1
let g:syntastic_check_on_open = 1
let g:syntastic_check_on_wq = 0

let g:syntastic_markdown_checkers = ['textlint']
let g:syntastic_text_checkers = ['textlint']

簡単に解説すると、1行目はVimプラグインのパッケージ管理ツール vim-plug を使って syntastic を読み込んでいるところ。

一旦途中を飛ばして、最後の2行がtextlint に関わる設定。
そこでMarkdownとテキストファイルをtextlintでチェックするように、と書いています。

……と、あたかも当然のことのように書きましたが、この2行分の内容がどこを探しても例示されていなくて*1、しかしぼくはPerlに関する同プラグインの記述を以下のようにしているので、

let g:syntastic_enable_perl_checker = 1
let g:syntastic_perl_checkers = ['perl', 'podchecker']

この一部をそれっぽく書き換えてみたら動いた、という感じでした。

話を戻して、その中間部分の数行は syntastic の基本的なレコメンド・セッティングです。

ここまで設定すると、こんな感じでエラーが画面下部に出てくるようになります。

f:id:note103:20160623041800p:plain

Great!!

passive モードを設定する

ただ、このままだとファイルを保存するたびにチェックが走ってしまい、その間はVimが止まって文章の編集をできなくなってしまうので(しかもけっこう待つ……)チェックしたいときだけ走らせられるように、以下の記述も追加します。

let g:syntastic_mode_map = { 'mode': 'active',
                           \ 'passive_filetypes': ['markdown', 'text'] }

これによって、通常は保存するたびにsyntastic が動き、Markdown とテキストファイルのときだけは明示的に命令した時点でチェックが走るようになります。

では、その明示的に命令するのはどうやるのかというと、syntastic の実行コマンドというのが以下なので、

:SyntasticCheck

こんな感じでマッピングを設定しておきます。

" Syntastic Run:
nnoremap <Leader>sc :SyntasticCheck<CR>

これによって、Leaderキー(通常はバックスラッシュでしょうか。ぼくはカンマにしていますが)とscを打鍵したときだけチェックが走るようになります。

また、チェック機能自体を有効・無効化するトグルコマンドが以下なので、

:SyntasticToggleMode

以下のように設定しておくと、エラー画面を閉じたりするのもラクで便利です。

" Syntastic Toggle:
nnoremap <Leader>st :SyntasticToggleMode<CR>

なお、これらの syntastic の設定方法については、以下が大変参考になりました。

留意点

ところで、これにまつわるちょっとしたハマりどころというか、ありがちなミスとして、前回の記事に書いたこととも繋がりますが、

Vimから使う場合でも、.textlintrc がホームディレクトリまたはカレントディレクトリ以上の階層に存在しないとtextlintは動きません。

そりゃそうでしょ、という感じでもありますが、何度か「あれ……動かないな」と思ってみたら単にそれだけのことだった、ということがあったので。

ようはVim経由だからといって、Vimプラグインのインストールや設定だけで完結するわけではなく、通常の設定は別途必要だということですね。

まとめ

以上、textlint をVimから利用する方法についてまとめてみました。

最初に以下の記事を書いたときは、この方法を知らなかったので、Vim からエラー(指摘)を見るためにシェルスクリプトPerlを組み合わせながらけっこう泥臭いことをやっていましたが、

note103.hateblo.jp

おかげさまでその大半が不要になりました(笑)。

何しろ、Vim で文章を書いたり編集したりしているときはこの程度のエラー表示で充分という気もしますし、またこのtextlint とsyntasticの組み合わせは、シンプルであるがゆえになかなか強力という印象もあるので(くり返し使いやすい、というか)。

一方、textlint には pretty-error フォーマットや、--fix オプションなど多彩な機能がありますから、これまでの知見を生かしながら、さらに自分に適した方法を探していきたいと思っています。

*1:一応こういう検索結果はできるかぎり見回ったのだけど、参考になるようなならないような……という感じだった。 Search Results · GitHub