Pull Request のレビューなどで typo を指摘することがあるだろうが、typo の指摘をしてもマイナスをゼロにするレビューコメントが一つ増えるだけであまり嬉しくない。
こういった無用なレビューを避けるために手元のエディタでスペルチェッカーが動かしている場合も多いと思う。最近なら多くのチームメンバーが VSCode を使っていて、レポジトリに .vscode を追加するだけで推奨拡張機能を皆のエディタに入れられるようになったので大変便利*1。
Code Spell Checker - Visual Studio Marketplace
しかしこういったスペルチェッカーは造語や辞書に登録されていない単語を検知してしまうので、我々にとって誤検知であることが多い。 Code Spell Checker は設定ファイルに allowlist を記述でき、typo 判定してほしくないキーワードを登録できる。 「よし、これで導入だ」といきたいところだが、せっかくならキーワードの登録も同時に行ってしまいたい。その時に試したやり方を残しておく。
cspell を使う
Code Spell Checker は内部で cspell というライブラリを使っていて、npm でコマンドラインツールとしても配布されている。元々この拡張のために作ったツールをコマンドラインでも使えるように提供しているらしい。
使い方は素朴でディレクトリを指定したりファイル名を直接指定すれば 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 でチェックするようにしても効果的だと思う。