Xcode Source Editor Extensionを試す

**サンプルを追加しました => [XcodeSourceEditorExtension-Alignment](https://github.com/tid-kijyun/XcodeSourceEditorExtension-Alignment/tree/master)**

![what's_new_dev_.png](https://qiita-image-store.s3.amazonaws.com/0/45742/9b0b997f-5c59-05c2-dade-145bb88ccf5e.png "what's_new_dev_.png")
WWDC2016にてXcode Source Editor Extension、Xcode Editor Extensionが発表されました。

どうやらXcode用のApp Extensionが作れる、というもののようです。
Mac App Storeで配布もできるとのことで[Alcatraz](http://alcatraz.io/)が不要になるかもしれませんね。

ここでは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


```SourceEditorExtension.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 []
    }
}
```

```SourceEditorCommand.swift
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](https://github.com/tid-kijyun/XcodeSourceEditorExtension-Alignment/tree/master) - 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](https://developer.apple.com/xcode/)
公式の紹介ページ、Editor Extensionsの項目にてMac App Storeで配信できると書いてあります。

#### [Release Note](http://adcdownload.apple.com/WWDC_2016/Xcode_8_beta/Release_Notes_for_Xcode_8_beta.pdf)
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](https://developer.apple.com/videos/play/wwdc2016/414/)
WWDC2016の関連セッション。
24:37からDemo、実際に作って試すところが見れます。