Typosでスペルミスを減らす
スペルミス(typo)を減らすために、スペルチェッカー「Typos」を導入してみました. ここでは、設定について調べたことを残 しておきます.
スペルチェッカーは Visual Studio Codeの拡張機能である「Code Spell Checker」を利用していました.ただ、誤検出や、過剰検出などのノイズが多いとも感じていました. スペルチェックの範囲を限定したり、単語を登録しておくことによってノイズを減らすことはもちろんできますが、もう少し手抜きがしたいところです.
そこで、別のスペルチェッカーを試してみようと、調べたら Typos が目立ったので、試しに導入してみました. よくCIで回して運用する方法が解説されていましたが、普通に個人の開発で利用するようにしました. 主に、Visual Studio Codeの拡張機能「Typos spell checker」と、コマンドラインツールによるチェックで使用しています.
インストール
私は cargo
でインストールしました.
cargo install typos-cli
後は typos
コマンドで実行できます.標準で現在のディレクトリ以下のファイルをチェックします.
typos
- 実際にチェックされるファイルは
--files
オプションで確認できます. - スペルミスを修正する機能もあります.その場合は
-w
または--write-changes
オプションを 付けます. - 出力フォーマットは
--format
で指定できます.標準はlong
ですが、brief
で短く、json
でJSON形式で出力できます.
設定ファイル
.typos.toml
, typos.toml
, _typos.toml
、また Cargo.toml
, pyproject.toml
にも含めることができるようです.
詳しくはドキュメントに書かれています.
ignore
個人的にちょっとわかりづらかった部分なので、調べた限りの情報を整理しておきます.
まず、標準で ignore 関連は有効になっています.オプションに --dump-config -
を指定して実行すると、設定情報が出力されます.
何も指定していない状態だと次のような設定になります(一部のみ抜粋):
[files]
extend-exclude = []
ignore-hidden = true
ignore-files = true
ignore-dot = true
ignore-vcs = true
ignore-global = true
ignore-parent = true
[default]
binary = false
check-filename = true
check-file = true
unicode = true
ignore-hex = true
identifier-leading-digits = false
locale = "en"
extend-ignore-identifiers-re = []
extend-ignore-words-re = []
extend-ignore-re = []
...
たとえば、ignore-files
はドキュメントを確認すると Respect ignore files.
とあってちょっと曖昧だと感じました.
なので、実際にソースコードを直接見てどうなっているのか調べてみました.
ignore-files
が有効になっているとignore-dot
,ignore-vcs
,ignore-global
,ignore-parent
が有効になります.ignore-vcs
が有効になると.gitignore
を参照します.ですから、標準で.gitignore
に指定されているディレクトリやファイルは除外されます.また、$GIT_DIR/info/exclude
も参照されます.ignore-dot
はすべてのドットファイルが無視されるわけではなく.ignore
ファイルという.gitignore
と同じ記法のファイルが参照されます.ignore-global
はgitのグローバル設定を参照します.これはcore.excludesfile
の値です.ignore-parent
は親ディレクトリにある.gitignore
を参照します.
全部をしっかりと動作確認したわけではないので、誤りがあったら指摘してもらえると助かります.
enable/disable
Typosは標準でソースコード内でチェッカーの挙動を制御するものは用意されていないので、必要であれば追加する必要があります.
よくある enable/disable
や disable-line
はドキュメント に書かれているのでそれを使います.
あと disable-next-line
も欲しかったのでこれも追加してみます.extend-ignore-re
で設定します.
extend-ignore-re = [
# spellchecker: disable-line, disable-next-line, disable, enable
"(?Rm)^.*(#|//|/\\*)\\s*spellchecker:\\s*disable-line$",
"(?m)^\\s*(?:#|//|/\\*)\\s*spellchecker:\\s*disable-next-line.*$\\r?\\n.*$",
"(?s)(#|//|/\\*|<!--)\\s*spellchecker:\\s*disable.*?\\n\\s*(#|//|/\\*|<!--)\\s*spellchecker:\\s*enable"
]
ドキュメントに書かれているものを少し改善して、4種類のコメントに対応しています:
# spellchecker: disable
// spellchecker: disable
/* spellchecker: disable */
<!-- spellchecker: disable -->
また、この記法は Code Spell Checker(内部でcspellを使用)にも準拠しています.
ハッシュ値
実際に使用していて気になったのがハッシュ値に対する誤検出です.issueでもいくつか報告(#484)されていますが根本的な解決はまだされていないようです.対応としては、正規表現を使ってある一定以上の文字数を無視するぐらいしかできず、この方法もその文字数以上はすべてチェックされなくなるのでよろしくありません.いまのところどうしようもないので無視しています.
実際の運用について
なかなか私の中でも確立した方法が見つかっていません. Typosでもやはり誤検知はするので、該当箇所はスペルチェッカーを無効にしたりしないとノイズとして残り続けます. とはいえ、スペルチェッカー関連でコードを汚染するのもよろしくないですし、難しい問題です. まあ、ほどほどにしてスペルチェックの結果に対してチェック済みかどうか記録できる仕組みとかあると管理しやすいかもしれません.
以上です.