2016/07/12

Xcode 8のソースコードエクステンションで「突然の死」をつくってみた

Xcode 8からXcode Source Code Extensionという機能が追加されて、 公式の機能として自作アプリからXcodeのソースコードをいじることができるようになりました。

そこで、サンプルとして「突然の死」エクステンションをつくってみました、という関する内容で第68回 Cocoa勉強会関西で発表しましたが、諸事情でスクリーンショットが載せられませんので、スライドはアップロードしていません。

その代わりではありませんが、そのソースコードをGitHub上で公開しています。

(上のスクリーンショットはXcode 8 betaでの実行結果をXcode 7で開いているものです)

概要

使いかたは、AppExtensionを起動すると闇のXcode (アイコンが黒い) が起動するので、そこから別プロジェクトを開いてください。 文字列を選択した上で、メニュー→Editorあたりに拡張のメニューが生えているのでこれを実行させてください。

ソースコードを見ればわかりますが、1行以上選択したらエラーにしていたり、フォントによっては大きくずれる可能性があります。 また、上のスクリーンショットを見ればわかりますが、そもそも実用性はありません。

実行時の注意点

Qiitaの記事「Xcode Source Editor Extensionを試す」に書かれている次の2点には注意してください。 特に2点めは、Debug Navigatorタブが情報を表示されてからさらに数秒くらい待つくらいでちょうどよいくらいです。

  • macOS 10.11ではsudo /usr/libexec/xpccachectlをして再起動しておく必要がある
  • 拡張が実行状態になるまでにかなり時間がかかります。その前に黒いXcodeでプロジェクトを起動するとうまく動かなくなります (闇のXcodeを再起動させる必要あり)

Xcode Source Code Extension

Xcode Source Code Extensionのつくりかた自体は次のWWDC 2016のムービー内のデモを見れば大まかな流れはわかるでしょう。

基本的にはXCSourceEditorCommandperform(with:completionHandler:)を実装すればよいです。

XCSourceEditorCommandInvocationbuffer内から、

  • ソースコード文字列
  • 文字列の選択範囲
  • ファイル種類 (UTI)
  • タブ幅
  • インデント量

などを取ることができます。

ソースコード文字列は、

  • 行ごとの文字列の配列
  • ソースコード全体の文字列

の両方があって、片方をいじるともう一方も変わるようになっています。 これがMutableな配列や文字列になっているので、これをいじって最後にcompletionHander(nil)すればXcodeのソースコードが変更されます。

その他

エクステンションでの処理に時間がかかっても、「The command “突然の死” is still busy…」みたいな情報バーが出てきますが、別プロセスなのでその間もXcodeを操作することはできました。

おわりに

Xcode 8のソースコードエクステンションについて紹介しました。

現在のソースコードの文字列しか得られないので使い勝手はよくない印象ですが、 対応アプリをAppStoreに出すこともできるので、対応する価値はあるかもしれません。

関連リンク

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。