# [[Obsidian textlint]]の導入方法を解説
## はじめに
個人的に[[Obsidian]]の利用に欠かせないプラグインとして[[Obsidian textlint]]がある。
文章についての様々な校正ルールを組み合わせて設定し、そのルールから外れた箇所を自動的に検出してくれる校正支援プラグインだ。
[[Obsidian Publish]]でこのオンラインノートを公開し始めてからは他者に読まれることを想定しながら書く必要が出てきた。そこで、例えば一文が長すぎて読みづくなっている箇所などを自動的に検出してくれるこのプラグインをますます重宝するようになった。
>[!example]
> ![[obsidian-textlint.webp]]
>
> 私の[[Obsidian]]保管庫での[[Obsidian textlint]]の動作模様。ノートは[[textlint]]ルールのテスト用のもの。
> ルールに違反している行番号を右サイドバーに表示し、エディタ中の該当箇所には赤線が入る。マウスオーバーで違反内容を表示する。
しかし、このプラグインは[[Obsidian]]の外部で設定・ビルドする必要があり初心者にはハードルが高い。その性質上、[[Obsidian]]のコミュニティプラグインからインストールできない野良プラグインでもある。
そこでこのノートでは[[Obsidian textlint]]に興味がある方のなかで、プラグインのリポジトリに置かれた説明を読んでもよく分からないという方向けに導入方法をまとめる。
ただし、最低限ターミナルソフトによる[[Git]]や[[Node.js]]の操作について軽く理解していること、またはそれらを調べるコストを払うことを前提とする。
なお、このプラグインの開発者である[[Hideyuki Okada]]さんはすでに[[Obsidian]]プラグインの開発から離れている[^1]。さらに、その後の[[Obsidian]]本体のバージョンアップにより修正しないとエラーで動作しない箇所がある。
そのため、ここでは元のリポジトリをフォークし、スムーズに動作させるための最小限の修正を施したリポジトリを用いる。どちらを利用するにしろ[[Obsidian]]公式のチェックが入っていない野良プラグインのため、ご利用の際は各自の自己責任でお願いしたい。
>[!check]
> - オリジナルのリポジトリ
> - [hdykokd/obsidian-textlint: A plugin for Obsidian that integrates textlint](https://github.com/hdykokd/obsidian-textlint)
> - フォークした修正版リポジトリ(このノートではこちらを使用)
> - [ko-shin-ryo/obsidian-textlint-fork: A plugin for Obsidian that integrates textlint](https://github.com/ko-shin-ryo/obsidian-textlint-fork)
## [[textlint]]とは
![[textlint#概要]]
例えば、以下のようなルールを適用できる:
- 「ら抜き言葉」や「い抜き言葉」を検出する
- 二重否定を検出する
- 一文の文字列数や、一文中の読点の数が設定値を超えているか検出する
- [[Markdown]]のヘッダ(`#`)の整合性崩れを検出する
## [[Obsidian textlint]]とは
![[Obsidian textlint#概要]]
[[Obsidian]]に[[textlint]]を統合することで、作成している文書の校正をリアルタイムで行うことができる。
設定はJSONファイルで行い、[[Node.js]]上で[[Obsidian]]のプラグインとして動作するプログラムを生成(ビルド)し、そのプログラムを保管庫に設置することで機能させる。
## インストールから最初の動作確認まで
### 1. [[Node.js]]をインストールする
[[Node.js]]を使ってビルドするため、インストールは必須。
![[Node.js#Node.jsのインストール]]
### 2. リポジトリからソースコードを取得する
[ko-shin-ryo/obsidian-textlint-fork](https://github.com/ko-shin-ryo/obsidian-textlint-fork)からソースコードを取得する。
下記コマンドのように`git clone`するなり、ZIPでダウンロードするなりしてください。
```sh
git clone https://github.com/ko-shin-ryo/obsidian-textlint-fork.git
```
### 3. パッケージの準備をする
[[Obsidian textlint]]の動作に必要なパッケージをインストールする。
ターミナルソフトを使って[[#2. リポジトリからソースコードを取得する|手順2]]で取得したコードのディレクトリに移動。本体である`obsidian-textlint-fork`ディレクトリと、その配下にある`textlint-builder`ディレクトリでそれぞれインストールを行う。
```sh
cd obsidian-textlint-fork
npm i
cd textlint-builder
npm i
```
### 4. [[textlint]]ルールをインストールする
`textlint-builder`ディレクトリ内で以下のコマンドを実行する。
ここでは技術文書向けの[[textlint]]ルールプリセットである
[[textlint-rule-preset-ja-technical-writing]]をインストールする。
![[textlint-rule-preset-ja-technical-writing#^command]]
### 5. `textlintrc.json`を編集する
`textlint-builder`ディレクトリ配下にある`textlintrc.json`を以下のように編集する。
ここでは[[#4. textlint ルールをインストールする|手順4]]でインストールした[[textlint-rule-preset-ja-technical-writing]]をルールに加える。
```json
{
"rules": {
"preset-ja-technical-writing": true
},
"filters": {}
}
```
`textlintrc.json`の記述によってインストール済みの[[textlint]]ルールの中でどれを利用するかが決まる。
加えて、利用するルールの詳細設定や、特定のルールを無視するフィルタの設定ができる。詳細は後の章で解説する。
### 6. `textlint-builder`でビルドを実行する
`textlint-builder`ディレクトリで下記コマンドを実行、[[#5. `textlintrc.json`を編集する|手順5]]で設定した[[textlint]]ルールをビルドする。
```sh
npm run build
```
>[!tip]
> Windows環境の[[PowerShell]]などでは「'mv' is not recognized as an internal or external command, operable program or batch file.」というエラーが出るはず。
> これは[[Linux]]系コマンドに対応していない環境のために出るエラーだ。
>
> Windows上で[[Linux]]系コマンドを使用するために[[Windows Subsystem for Linux]]を利用するなどの選択肢もあるが、慣れていない方はターミナルソフトとして[[Git Bash]]を利用するのが最も手軽と思われる。
### 7. `obsidian-textlint-fork`でビルドを実行する
`obsidian-textlint-fork`ディレクトリに移って下記コマンドでビルドする。
ビルドが成功すると、[[#6. `textlint-builder`でビルドを実行する|手順6]]で作った[[textlint]]ルールを反映させたプラグイン用のコードが生成される。
```sh
npm run build
```
### 8. [[Obsidian]]保管庫にプラグイン用のディレクトリを作成する
[[Obsidian textlint]]を導入したい保管庫の以下の箇所に`obsidian-textlint`ディレクトリを作成する。
```
[保管庫ルート]\.obsidian\plugins\obsidian-textlint
```
>[!tip]
> `.obsidian`は隠しディレクトリのため、設定によっては表示されない場合がある。もし保管庫ルートで見つけられない場合は各自の環境に応じた隠しディレクトリの表示方法を調べていただきたい。
作成した`obsidian-textlint`ディレクトリに[[#7. `obsidian-textlint`でビルドを実行する|手順7]]のビルドで生成された以下のファイルをコピーする。
- `dist`ディレクトリ
- `main.js`
- `manifest.json`
- `styles.css`
[[Obsidian]]を起動している場合は一度アプリケーションを再起動する。
### 9. プラグインを起動する
[[Obsidian]]のコミュニティプラグインに[[Obsidian textlint]]が追加されているためそれをオンにする。
コマンドパレットから「**textlint: show textlint diagnostics**」を実行すると右サイドバーにtextlint diagnosticsビューが表示される。以降はアクティブノートに対して自動的に[[textlint]]による診断処理が走るようになる。
## [[textlint]]ルールの設定方法
[[#インストールから最初の動作確認まで]]で設定した[[textlint-rule-preset-ja-technical-writing]]は、技術文書向けの校正ルールをひとつにまとめている。
[[Obsidian]]で普段遣いするには少し厳し目の設定であるため、それなりの文字数のノートを開いたらなんらかのルール違反が検出されるだろう。
そこで、[[textlint-rule-preset-ja-technical-writing]]の設定を一部変更して自分の保管庫に合ったルールにしよう。
### [[textlint-rule-preset-ja-technical-writing]]の設定を変更する
`textlintrc.json`から各ルールのオンオフ切り替えや詳細設定ができる。
例えば、[感嘆符!!、疑問符??を使用しない](https://github.com/textlint-ja/textlint-rule-preset-ja-technical-writing?tab=readme-ov-file#%E6%84%9F%E5%98%86%E7%AC%A6%E7%96%91%E5%95%8F%E7%AC%A6%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%97%E3%81%AA%E3%81%84)というルールは技術文書では重要かもしれないが[[Obsidian]]で日常的なメモを書くケースでは不要かもしれない。
そこで、`textlintrc.json`を以下のように編集してこのルールだけをオフにできる。
```json
{
"rules": {
"preset-ja-technical-writing": {
"no-exclamation-question-mark": false
}
},
"filters": {}
}
```
加えて、[連続できる最大の漢字長は6文字まで](https://github.com/textlint-ja/textlint-rule-preset-ja-technical-writing?tab=readme-ov-file#%E9%80%A3%E7%B6%9A%E3%81%A7%E3%81%8D%E3%82%8B%E6%9C%80%E5%A4%A7%E3%81%AE%E6%BC%A2%E5%AD%97%E9%95%B7%E3%81%AF6%E6%96%87%E5%AD%97%E3%81%BE%E3%81%A7)というルールも、その意図は理解できるがいささか厳しすぎる。
そこで、8文字までに緩和しよう。しかしそれでも[[世界三大難解哲学書]]や[[独立行政法人情報処理推進機構]]のようなけったいな文字列は引っかかってしまう。だから例外も設定しよう。`textlintrc.json`を以下のように編集する。
```json
{
"rules": {
"preset-ja-technical-writing": {
"no-exclamation-question-mark": false,
"max-kanji-continuous-len": {
"max": 8,
"allow": [
"世界三大難解哲学書",
"独立行政法人情報処理推進機構"
]
}
}
},
"filters": {}
}
```
この状態で手順6からビルドをし直し、保管庫の`obsidian-textlint`ディレクトリに生成されたファイルをコピーしてアプリを再起動すれば、意図した通り上記のルールは緩和されるはずだ。
このように、[[textlint]]ルールの設定方法はそのリポジトリ内に記載があるはずなので、そちらを参考にカスタマイズしていくことになる。
### 他の[[textlint]]ルールを導入する
今度は[[#4. textlint ルールをインストールする|手順4]]以降の工程を別の[[textlint]]ルールに対して行うことでルールを追加してみよう。
#### [[textlint-rule-incremental-headers]]を導入する
ここでは[[textlint-rule-preset-ja-technical-writing]]に含まれない、[[Markdown]]の見出し(`#`)の書き方をチックする[[textlint-rule-incremental-headers]]を導入する。
とは言うものの行うことは[[#インストールから最初の動作確認まで]]の流れそのものである。
`textlint-builder`ディレクトリでルールをインストールする。
![[textlint-rule-incremental-headers#^command]]
続いて`textlintrc.json`を編集する。ここでは前節の設定を維持したまま追加しよう。
```json
{
"rules": {
"preset-ja-technical-writing": {
"no-exclamation-question-mark": false,
"max-kanji-continuous-len": {
"max": 8,
"allow": [
"世界三大難解哲学書",
"独立行政法人情報処理推進機構"
]
}
},
"incremental-headers": true
},
"filters": {}
}
```
`textlint-builder`ディレクトリ内でビルドコマンドを実行する。
```sh
npm run build
```
`obsidian-textlint-fork`ディレクトリに移ってビルドコマンドを実行する。
```sh
npm run build
```
生成された以下のファイルを保管庫内に作成した`obsidian-textlint`ディレクトリにペーストして上書きする。
- `dist`ディレクトリ
- `main.js`
>[!hint]
> `manifest.json`はプラグインの基本情報、`styles.css`はプラグインのスタイル情報を記述するファイルであるため、初回以外は変更する必要がない。
[[Obsidian]]を再起動することで[[textlint-rule-incremental-headers]]のルールが適用されるようになるはずだ。見出しの`#`記号の数を変えるなどして確認してみよう。
今回はルールが追加されたことを確認しやすいことを意図して[[textlint-rule-incremental-headers]]を追加したが、見出しの付け方は人によって異なることもある。
自分の書き方と合わないと感じた場合は`textlintrc.json`から`incremental-headers`の設定を`false`に変更して再ビルドしてみよう。もちろん記述自体を削除してもよい。
#### [[textlint-filter-rule-comments]]を導入する
[[textlint]]には特定の条件のときに他のルールを無効化するフィルタールールが用意されている。その代表例が[[textlint-filter-rule-comments]]だ。
>[!hint]
> インストールコマンドやオプションはリポジトリを確認のこと。
> - [textlint/textlint-filter-rule-comments: textlint filter rule that disables all rules between comments directive.](https://github.com/textlint/textlint-filter-rule-comments)
すでに基本的な導入方法はマスターされていると思うので省略するが、一点だけほかのプラグインとは異なるところがある。
それは`textlintrc.json`の編集箇所だ。フィルタールールは通常ルールとは分けられている点に注意する。
```json
{
"rules": {
"preset-ja-technical-writing": {
"no-exclamation-question-mark": false,
"max-kanji-continuous-len": {
"max": 8,
"allow": [
"世界三大難解哲学書",
"独立行政法人情報処理推進機構"
]
}
},
"incremental-headers": true
},
"filters": {
"comments": true
}
}
```
ビルドして保管庫に適用すると、以下のようなコメントによって特定の範囲内においては[[textlint]]ルールが無視されるようになる。
```text
この行はtextlintのルールが適用される。臨兵闘者皆陣列在前!
<!-- textlint-disable -->
この行はすべてのルールが無視される。子丑寅卯辰巳午未申酉戌亥!
コメントの前後には改行が必要であることに注意。
<!-- textlint-enable -->
```
## おわりに
以上が[[Obsidian textlint]]の設定の基本である。
あとはあなたが導入したい[[textlint]]ルールを導入・設定していき、自分だけの文書作成環境を[[Obsidian]]保管庫に整えていただきたい。
有志が作成した日本語関連のルールは[textlint-ja](https://github.com/textlint-ja)にまとめられているので一度すみずみまで眺めてみるのがよいだろう。インストールコマンドと`textlintrc.json`の設定方法は各リポジトリに記載されている。
ただし、[[textlint-rule-prh]]など一部の[[textlint]]ルールには一工夫しないと[[Obsidian textlint]]では導入できないものもある点には注意が必要だ。
[^1]: [\[Important\] Development Discontinuation Announcement · Issue #94 · hdykokd/obsidian-vertical-tabs-view](https://github.com/hdykokd/obsidian-vertical-tabs-view/issues/94)