はじめに
戦争や飢え、貧困など、クリスマスイブの今日でさえ、世界中では悲しい出来事がたくさん起きています。そのうちの一つがtypo, つまり誤植です。
コードレビューでtypoが見つかるとめちゃくちゃ恥ずかしい
typoの無い平和な世界を実現したい
ということで、typoチェックをしてくれるXcode Source Editor Extensionを作りました。
Xcode Source Editor Extension
大雑把にいうと、昔あった"Alcatraz"みたいなやつです。Xcodeが便利になります。
作り方は
- Xcode Source Editor Extensionの世界(完全版)
- Xcode Source Editor Extension を使った Xcode プラグインの作り方
- Xcode Source Editor Extension で複数のコマンドを定義する
などを参考にさせていただきました。
NoMoreTypo
NoMoreTypoは、XcodeでソースのtypoチェックをしてくれるExtensionです。
命名部分とString部分がチェック可能で、typoが見つかると単語候補とともに該当する行の下に表示されます。
typoが見つからなかった場合は、ソースの先頭にこんな感じでコメントアウトがつきます。
実装
まず、上のサイトではちょっとわからなかったところを交えつつ実装の話をします。
プロジェクト名
実装ではExtensionのみを作るのではなく、macOSアプリにExtensionを載せるような形になります。なのでApplicationとExtensionで別の名前をつけないといけません。
awesome-xcode-extensionsを参考に、こんな風に命名しました。
Project: NoMoreTypoForXcode
Extension: NoMoreTypo
ApplicationをNoMoreTypoにして、ExtensionをNoMoreTypo Extensionなどの命名にしているものもありました。でもNavigationにはExtensionの方の名前で表示されるので、そちらをメインにすることにします。
正規表現を用いた文字列の切り出し
まずはじめに、命名部分を取り出します。
(?<=(^|\\s)(let|var|func|class|enum|struct)\\s)[a-zA-Z0-9_]+
この正規表現では、変数名/関数名/クラス名などを取得できます。命名に使えるのは英数字とアンダースコアのみなので、[a-zA-Z0-9_]+でカバーしています。
次に、取り出した命名部分を単語ごとに分けます。
[a-zA-Z][a-z]+
この正規表現では、
- キャメル記法
- hogeFuga
- HogeFuga
- スネーク記法
- hoge_fuga
以上2つの記法を単語ごとに切り出すことができます。大文字スネーク記法のようなもの(HOGE_FUGA)は単語ごとに切り出せません。
正規表現はこちらのiOSエンジニアの正規表現入門を参考にさせていただきました。
タイポチェック
NSSpellChecker
という便利なクラスを使ってタイポチェックを行います。なんと単語の候補まで教えてくれます。
iOSにも同じような機能でUITextChecker
というものがあります。スゴイ!
Xcode Source Editor Extensionの配布方法
そのままgithubにあげます。READMEに後述のインストール手順を書いておきましょう。
使い方
-
NoMoreTypoを
git clone
- ApplicationとExtension両方のSigningを自分のDeveloper IDに変更
-
Product -> Archive
-
エクスポートしたNoMoreTypoForXcodeをアプリケーションフォルダに移動
-
NoMoreTypoForXcodeを起動
-
Enable Extensionをクリック
-
システム環境設定の機能拡張パネルが開くので、Xcode Source ExtensionのタブでNoMoreTypoにチェックが入っていることを確認
-
Xcodeを再起動
-
Editor -> NoMoreTypo
- Check typo in name -> 命名部分のtypoをチェック
- Check typo in String -> ""で囲まれた文字列内のtypoをチェック
今後の展望
- ""の中で\(変数)や\nなどを使っている場合、変数名やエスケープ文字まで取り出してしまうので、正規表現を改善する
- アプリ名などの造語が引っかかってしまわないように、typo判定しないリストをつける
- ソースコードに直接書き込むのではなく、もっといい感じにだす
- 「コンソールに書き込めといいよね」とアドバイスをいただいたので調べてます
まとめ
NoMoreTypoでtypoなき平和なコーディングライフを
Xcodeにこんな機能があったらなあと思うものはExtensionで意外と作れる