Emacs上でtextlintを使って日本語の校正をするには



# 手軽に日本語のチェックがしたい

商売柄、年末は大量の日本語を読んで手直しする羽目になるのだが、内容はともかく、誤字脱字やら抜き言葉、用語の揺れ程度は機械的にチェックしたいのである。Microsoft Wordのようなワープロにも若干の校正機能は付いているが貧弱だし、[Just Right!](https://www.justsystems.com/jp/products/justright/)のような専門ソフトウェアもあるが高価な上にプロプライエタリで、おまけにWindowsでしか使えなかったりもする。


# textlintのインストール

そんなときに便利なのが[textlint](https://textlint.github.io/)だ。ルールを指定することでチェック内容を柔軟に変えることが出来、しかもクロスプラットフォーム対応なので、WindowsでもGNU/Linuxでも同じように使える。

textlintはJavaScriptで書かれているので、自身のインストールは[npm](https://www.npmjs.com/)を使う。大体のGNU/Linuxディストロにはnpmが入っているだろうから `apt-get install npm` でいけるだろう。Windowsの場合はScoopを使って `scoop install npm` で入れるのがおすすめである。このへんは先日書いた[Emacs設定の記事](https://www.mhatta.org/wp/2022/12/25/how-to-use-emacs-without-tears-and-joint-pain/)でも触れた通りだ。

なおあまり推奨はされていないようだが、 `-g` オプションを付けてグローバルにインストールしたほうがスタンドアロンのツールとして使う分には何かと便利なように思われる。その場合、Windowsの場合は不要だが、GNU/Linuxでは `/usr/local` 以下へインストールすることになるので、 `sudo` が必要になる。

```powershell
> npm -g install textlint
```

さらに、プラグインや校正ルールをインストールする必要がある。どんなプラグインやルール・ファイルがあるかは[Collection of textlint rule](https://github.com/textlint/textlint/wiki/Collection-of-textlint-rule)に一覧がある。今回はたまたま日本語に絞っているが、英語などにも対応しているようだ。

texlint本体をグローバルでインストールした場合、これらも `-g` オプションをつけてインストールしなければならない。textlintは標準でMarkdownには対応しているので、Org形式やHTML形式に対応するプラグインを別途追加してある。雑な人間なので、[textlint-jaの公式Githubレポジトリ](https://github.com/orgs/textlint-ja/repositories)にあるルールはとりあえず全部インストールしてしまった。各ルールの説明も同じところにある。

```powershell
> npm install -g textlint-ja/textlint-rule-morpheme-match \
 @textlint-ja/textlint-rule-no-dropping-i \
 @textlint-ja/textlint-rule-no-filler \
 @textlint-ja/textlint-rule-no-insert-dropping-sa \
 @textlint-ja/textlint-rule-no-insert-re \   
 @textlint-ja/textlint-rule-no-synonyms \
 sudachi-synonyms-dictionary \
 textlint-filter-rule-ja-named-entities \
 textlint-plugin-html \
 textlint-plugin-org \
 textlint-rule-ja-joyo-or-jinmeiyo-kanji \
 textlint-rule-ja-kyoiku-kanji \
 textlint-rule-ja-no-abusage \
 textlint-rule-ja-no-inappropriate-words \
 textlint-rule-ja-no-mixed-period \
 textlint-rule-ja-no-orthographic-variants \
 textlint-rule-ja-no-redundant-expression \
 textlint-rule-ja-no-successive-word \
 textlint-rule-ja-no-weak-phrase \
 textlint-rule-ja-unnatural-alphabet \
 textlint-rule-max-kanji-continuous-len \
 textlint-rule-max-ten \
 textlint-rule-no-double-negative-ja \
 textlint-rule-no-doubled-conjunction \
 textlint-rule-no-doubled-conjunctive-particle-ga \
 textlint-rule-no-doubled-joshi \
 textlint-rule-no-dropping-the-ra \
 textlint-rule-no-hankaku-kana \
 textlint-rule-no-mix-dearu-desumasu \
 textlint-rule-no-mixed-zenkaku-and-hankaku-alphabet \
 textlint-rule-no-nfd \
 textlint-rule-no-redundant-expression \
 textlint-rule-prefer-tari-tari \
 textlint-rule-preset-ja-spacing \
 textlint-rule-preset-ja-technical-writing \
 textlint-rule-preset-japanese
```

表記の統一をやるソフトウェアなのにルール名が案外統一されていないのはご愛敬といったところか。

さらに、ホームディレクトリにtextlintの設定ファイルを用意する必要がある。ファイル名は `.textlintrc` でもよいのだが、 `.textlintrc.json` と拡張子までつけておくとJSONとして扱ってくれるので編集が楽である。

```javascript
{
    "plugins": ["org","html"],
    "filters": {
        "ja-named-entities": true
    },
    "rules": {
        "@textlint-ja/textlint-rule-no-dropping-i": true,
        "@textlint-ja/textlint-rule-no-filler": true,
        "@textlint-ja/textlint-rule-no-insert-dropping-sa": true,
        "@textlint-ja/textlint-rule-no-insert-re": true,
        "@textlint-ja/no-synonyms": true,
        "ja-joyo-or-jinmeiyo-kanji": true,
        "ja-kyoiku-kanji": false,
        "ja-no-abusage": true,
        "ja-no-inappropriate-words": true,
        "ja-no-mixed-period": true,
        "ja-no-orthographic-variants": true,
        "ja-no-redundant-expression": true,	
        "ja-no-successive-word": true,
        "ja-no-weak-phrase": true,
        "ja-unnatural-alphabet": true,
        "max-kanji-continuous-len": true,
        "max-ten": false,
        "no-double-negative-ja": true,
        "no-doubled-conjunctive-particle-ga": true,
        "no-doubled-joshi": true,
        "no-dropping-the-ra": true,
        "no-mix-dearu-desumasu": true,
        "no-mixed-zenkaku-and-hankaku-alphabet": true,
        "no-nfd": true,
        "prefer-tari-tari": true,
        "preset-ja-spacing": true,
        "preset-ja-technical-writing": false,
        "preset-japanese": true,
        "preset-jtf-style": true
    }
}
```

自分に必要ないルールは `false` を指定して無効にすれば良い。このあたりは若干の試行錯誤が必要だろう。

ここまででスタンドアロンのユーティリティとしてはすでに使えるので、

```powershell
> textlint somejapanese.txt
```

などと実行してチェックしてみるとよい。


# Emacsからの利用

Emacsからは[Flycheck](https://www.flycheck.org/en/latest/)と組み合わせてバッファ内のリアルタイム校正が出来る。[先日のEmacs設定の記事](https://www.mhatta.org/wp/2022/12/25/how-to-use-emacs-without-tears-and-joint-pain/)で使った `init.el` にはすでに必要な記述が入っているので、textlintをインストールすればすぐ有効になるはずだが、ようは `flycheck-define-checker` の部分で、これによりtextlintの出力を受け取ってEmacsのバッファで表示している。

```el
;; checker for textlint
(flycheck-define-checker textlint
  "A linter for prose."
  :command ("textlint" "--format" "unix" 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 org-mode web-mode))
)
```

うまく行けばこんな風に表示される。

![textlint.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/275112/4d9f74c7-725c-c80b-63b9-7f87b100e916.jpeg)


---

この記事は、[個人ブログ](https://www.mhatta.org/wp/2022/12/30/how-to-proofread-japanese-using-textlint-on-emacs/)からの転載です。Emacs 上の Org-mode で書き、[Org2blog](https://github.com/org2blog/org2blog) で Wordpress に投稿したのと同じ原稿を、[ox-qmd](https://github.com/0x60df/ox-qmd) で変換してそのまま投稿しました。