cspell でレポジトリの typo 判定一覧を出力する

Pull Request のレビューなどで typo を指摘することがあるだろうが、typo の指摘をしてもマイナスをゼロにするレビューコメントが一つ増えるだけであまり嬉しくない。

こういった無用なレビューを避けるために手元のエディタでスペルチェッカーが動かしている場合も多いと思う。最近なら多くのチームメンバーが VSCode を使っていて、レポジトリに .vscode を追加するだけで推奨拡張機能を皆のエディタに入れられるようになったので大変便利*1

Code Spell Checker - Visual Studio Marketplace

しかしこういったスペルチェッカーは造語や辞書に登録されていない単語を検知してしまうので、我々にとって誤検知であることが多い。 Code Spell Checker は設定ファイルに allowlist を記述でき、typo 判定してほしくないキーワードを登録できる。 「よし、これで導入だ」といきたいところだが、せっかくならキーワードの登録も同時に行ってしまいたい。その時に試したやり方を残しておく。

cspell を使う

Code Spell Checker は内部で cspell というライブラリを使っていて、npm でコマンドラインツールとしても配布されている。元々この拡張のために作ったツールをコマンドラインでも使えるように提供しているらしい。

www.npmjs.com

使い方は素朴でディレクトリを指定したりファイル名を直接指定すれば OK 。今回は一度単語リストが出せれば良いので npx 経由で使ってみた。

$ npx cspell <filename>

あとはお好みに合せてファイル名を指定すれば完了。 git レポジトリだったら git ls-files とかで拡張子を指定しつつファイル一覧を取得すると楽だと思う。例えば Perl だったらこんな感じになる。

#!/bin/sh

files=$(git ls-files '*.pm' '*.pl' '*.t')
exec npx --quiet cspell --wordsOnly --unique --no-summary $files

単語の一覧だけ出したいので --wordsOnly--no-summary, --unique を指定した。このままだと npx の出力も出てしまうので、 --quiet を付けると良い。

「よしよし、これで」と思ったが、普段触っているレポジトリで試してみると結構な数の語が検出されてしまい、全部 allowlist に載せるのは厳しい。もちろん typo がたくさんあるわけではなくて、 subtest などのライブラリ特有のキーワードが typo 判定されてしまったため。頻出するキーワードが typo 判定されてたらイライラしてコードの質が下がることになりかねないと思う()。

そこで作戦を変えて、頻出語順に出力し上位20件程度をリストに加えるやり方にした。

#!/bin/sh

files=$(git ls-files '*.pm' '*.pl' '*.t')
exec npx --quiet cspell --wordsOnly --no-summary $files | sort | uniq -c | sort -nr

--unique を指定するのは止め、昔ながらの UNIX コマンドの組み合わせで頻出語を出すようにした。これで allowlist に登録すると良いキーワードを判別しやすく、理由を持って追加できるようになった。

実例

試しにインターン課題のサンプルアプリケーション go-Intern-Bookmark でリストを出してみる。

~/repos/src/github.com/hatena/go-Intern-Bookmark
$ ./spellcheck.sh
  43 hatena
  13 graphql
  12 sqlx
   7 stretchr
   7 signup
   6 signin
   6 csrf
   4 tmpl
   4 jmoiron
   4 bcrypt
   4 Tmpl
   3 nosurf
   3 graphiql
   3 Signup
   3 Signin
   3 Queryx
   3 Graphql
   2 entrys
   2 attatch
   1 unmatching
   1 justinas
   1 fmsec
   1 dimfeld
   1 UUID
   1 CSRF

コード量が少ないためかおびただしい件数が検出されることはなかった。 GraphQL みたいな技術用語を検出するのは結構予想通りだが Hatena はなるほどという気持ちになった。 Go だとレポジトリ名がモジュール名に含められるので、だいたいこうなってしまいそう。

まとめ

cspell でレポジトリの typo 判定一覧を出す方法を書いた。 cspell 意外に便利そうで、 README にあるように Git の commit-hook や CI でチェックするようにしても効果的だと思う。

参考

*1:ただ僕はIntelliJEmacsを使っている