サンプルを追加しました => XcodeSourceEditorExtension-Alignment
WWDC2016にてXcode Source Editor Extension、Xcode Editor Extensionが発表されました。
どうやらXcode用のApp Extensionが作れる、というもののようです。
Mac App Storeで配布もできるとのことでAlcatrazが不要になるかもしれませんね。
ここではXcode Source Editor Extensionを調べながら試してみます。
⚠️注意:情報が少ないので多分に推測を含んでいます。
スクリーンショットは削除しました
Xcode Source Editor Extensionとは?
名前の通りSource Editor部分を拡張するもののようです。
もっと広範に拡張したい場合はXcode Editor Extensionを作ることになるのかなと思っています。
図にするとこんな感じでしょうか。
+----------------------+
| | +------------------------+
| Xcode |<--->| Xcode Editor Extension |
| | +------------------------+
| +---------------+ |
| | | | +-------------------------------+
| | Source Editor |<------->| Xcode Source Editor Extension |
| | | | +-------------------------------+
| +---------------+ |
| |
+----------------------+
事前準備
macOS 10.11では事前に下記手順が必要です。
- Xcode-betaを起動してadditional system componentをインストール
-
sudo /usr/libexec/xpccachectl
を実行 - macOSを再起動
プロジェクト作成
まずはプロジェクトをCocoa Applicationテンプレートで作ります。(Emptyテンプレートを使うとダメなようです)
その後にFile > New > Target...
または +ボタン(Add a target)
から作成します。
Target(アプリとExtension)のSigningを設定します。
以上でExtensionのSchemaを選択して実行(Choose an app to run:)でXcode8を選択すれば
Editorメニューに項目が追加されます。
Running状態になる前に操作するとうまく動きません。実行した後、一呼吸置きましょう。
生成されたファイルを見てみる
ターゲットを作成すると、下記のSwiftファイルが生成されます。
- SourceEditorExtension.swift
- SourceEditorCommand.swift
import Foundation
import XcodeKit
class SourceEditorExtension: NSObject, SourceEditorExtension {
func extensionDidFinishLaunching() {
// If your extension needs to do any work at launch, implement this optional method.
}
var commandDefinitions: [[XCSourceEditorCommandDefinitionKey: AnyObject]] {
// If your extension needs to return a collection of command definitions that differs from those in its Info.plist, implement this optional property getter.
return []
}
}
import Foundation
import XcodeKit
class SourceEditorCommand: NSObject, XCSourceEditorCommand {
func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: (NSError?) -> Void ) -> Void {
// Implement your command here, invoking the completion handler when done. Pass it nil on success, and an NSError on failure.
completionHandler(nil)
}
}
さしあたり見るべきなのは4つだけで良さそうです。
-
extensionDidFinishLaunching
起動時に呼ばれる。
-
commandDefinitions
実行するコマンドの情報を定義する。
info.plistに書いてある情報が使われるようなので定義しなくてもよさそうです。 -
perform
コマンドが実行されると呼ばれる。
ここに処理を書けば良いようです。 -
XCSourceEditorCommandInvocation
これを操作する形でXcode Source Editorに干渉できるようです。
詳細は定義にジャンプして覗くしかありません。
サンプル
XcodeSourceEditorExtension-Alignment - GitHub
選択範囲の代入文を整列する拡張です。
XcodeのEditorメニューにAlignmentが追加されます。
使い方
Xcodeでコードを選択状態にしてから Alignment を選択してください。
// before:
var hoge = "hoge"
var foo = "foo"
var awesome = ""
// after:
var hoge = "hoge"
var foo = "foo"
var awesome = ""
メモ
Xcode-beta.app内に2つXcode Source Editor Extensionがありました。
名前 | キー | 説明 |
---|---|---|
XCDocumenterExtension.appex | ⌥⌘/ |
ドキュメントコメントを生成。中身はVVDocumenterのようです。 |
IDECacheDeleteAppExtension.appex | Derived Dataを消せる? Xcode Editor Extension のようです。 |
参考
Xcode
公式の紹介ページ、Editor Extensionsの項目にてMac App Storeで配信できると書いてあります。
Release Note
New in Xcode 8.0 beta - IDE > Source Editor Extensions
Known Issues in Xcode 8.0 beta - IDE > Source Editor Extensions
Using and Extending the Xcode Source Editor
WWDC2016の関連セッション。
24:37からDemo、実際に作って試すところが見れます。