以前から使おうと思っていて、 flycheck との組み合わせ方が難しくて後回しになっていた textlint を、 textlint 11リリース という記事を見たのをきっかけに使い始めました。
確認バージョン
- macOS 10.13.6
- GNU Emacs 26.1
- anyenv, nodenv
- node v10.9.0
- textlint v11.0.0
- textlint-rule-preset-ja-technical-writing 3.1.0
- textlint-rule-preset-ja-spacing 2.0.1
node のインストール
nodenv の使い方は rbenv とほぼ同じなので以下の手順で現状の最新版を入れました。
nodenv install 10.9.0
nodenv global 10.9.0
textlint のインストールと動作確認
そして textlint の公式サイトの Getting Started with textlint の手順に従って、 使いたいレポジトリ (今回は znz/blog.n-z.jp) のトップで 以下のように初期設定しました。
npm init -y
npm install --save-dev textlint
npm install --save-dev textlint-rule-no-todo
npx textlint --init
そして、以下のファイルを file.md
として保存して、 npx textlint file.md
で動作確認しました。
# file.md
- [ ] Write usage instructions
`- [ ]` is a code and not error.
ここで入れた textlint-rule-no-todo
は最終的には使っていないので、 消し方を探してみたところ、 npm uninstall --save-dev textlint-rule-no-todo
で package.json
と package-lock.json
から消せました。
preset
どの preset を使えば良いのかがわからなかったのも、 textlint をまだ使っていなかった理由だったのですが、 リリース記事にあった textlint-rule-preset-ja-technical-writing が厳しめで、 ちゃんと動いているかどうか見えてほしい使い始めに良さそうと思って、 使ってみることにしました。
緩めで始めたいのなら、 textlint-rule-preset-japanese が良さそうでした。
preset を探してみると textlint-rule-preset-ja-spacing というのもあったので使ってみることにしました。
.textlintrc
インラインマークアップの都合で「、」の直後に半角文字がくる時もスペースを入れるようにしているので、 exceptPunctuation
は false
にしました。
コードの前後にも空白があった方が良いので、 ja-space-around-code
は両方 true
にしました。
{
"rules": {
"preset-ja-technical-writing": true,
"preset-ja-spacing": {
"ja-space-between-half-and-full-width": {
"space": "always",
"exceptPunctuation": false
},
"ja-space-around-code": {
"before": true,
"after": true
}
}
}
}
とりあえずこの設定で使い始めて様子をみて変えていくつもりです。
flycheck の設定
ネット上でみつけた設定のうち、 引数でルールを直接指定した部分は .textlintrc
を使うなら不要と思って、 外したものを設定しました。
(flycheck-define-checker textlint
"A linter for prose."
:command ("textlint" "--format" "unix"
;; "--rule" "no-mix-dearu-desumasu" "--rule" "max-ten" "--rule" "spellcheck-tech-word"
source-inplace)
:error-patterns
((warning line-start (file-name) ":" line ":" column ": "
(id (one-or-more (not (any " "))))
(message (one-or-more not-newline)
(zero-or-more "\n" (any " ") (one-or-more not-newline)))
line-end))
:modes (text-mode markdown-mode gfm-mode))
(add-to-list 'flycheck-checkers 'textlint)
パス設定
Enable npx with eslint にあるように npx
を使うという手もありそうですが、 eslint
を試そうとしていたときにうまくいった add-node-modules-path を使って、 以下のようにパスを通すようにしています。
(with-eval-after-load 'markdown-mode
(add-hook 'gfm-mode-hook #'add-node-modules-path)
(add-hook 'markdown-mode-hook #'add-node-modules-path))
anyenv
には、以下のようにしてパスを通しています。
(defun my-add-to-path (path)
(when (file-directory-p path)
(setenv "PATH" (concat path ":" (getenv "PATH")))
(add-to-list 'exec-path path)))
;; anyenv
(my-add-to-path (expand-file-name "~/.anyenv/bin"))
(mapc #'my-add-to-path
(mapcar #'expand-file-name
(file-expand-wildcards "~/.anyenv/envs/*/bin")
))
(mapc #'my-add-to-path
(mapcar #'expand-file-name
(file-expand-wildcards "~/.anyenv/envs/*/shims")
))
まとめ
とりあえずこれで flycheck で textlint が動くようになったので、 使い続けてみたいと思っています。