天天看點

Xcode Source Editor Extension

其實官方還是宣揚了一些優點的,其中最顯著的莫過于可以上架 mac app store,但這點優點實在是無法彌補他的弱雞。他能做的事情幾句話就可以說完,開發一個這樣的插件是極其的簡單。簡單說吧,一個插件能做下面的事情:

擷取 xcode 正在編輯的文本

擷取所有的選中區域

替換 xcode 正在編輯的文本

選中 xcode 正在編輯的文本

在 xcode 的 editor 菜單裡面給你的插件生成一個子菜單,用于調用插件

可以在 xcode 的 key binding 裡面給插件配置設定一個快捷鍵

沒了,這就是他全部能做的事情,下面我通過一個選中文字轉換成 base64 編碼的例子來簡單介紹一下。

Xcode Source Editor Extension

你需要在一個現有的或者建立的 macos 項目裡面建立一個 xcode source editor extension target,然後理論上這個時候已經可以有插件的效果了,但是今天我試了很多次就是不行,其實沒有什麼特别的原因,就是因為 xcode 目前的階段極其不穩定,我沒寫錯任何東西。

有幾個核心的觀念要介紹一下,首先,實作了 xcsourceeditorextension 接口的類,用于管理插件的生命周期或者對 command 進行動态配置,說的很牛逼其實一共兩個方法。

分别是在插件成功加載後調用和動态配置 command,但是 command 也可以靜态的配置在插件的 plist 上面,我的例子裡面其實就是這麼一個結構:

沒什麼好解釋的,指定了實作類的名稱和菜單的名稱。

xcsourceeditorcommand 是另外一個核心概念,其實就是當插件被觸發之後,你有機會在代理方法裡面攔截到這個消息(xcsourceeditorcommandinvocation),做出處理之後将内容傳回給 xcode,僅此而已。

xcsourceeditorcommandinvocation 裡面會存放一些 meta 資料,其中最重要的是 identifier 和 buffer,identifier 就是用來做區分的,buffer 則是整個插件中最最重要的概念,但是他其實也很簡單。

xcsourcetextbuffer 最重要的環節有兩個,

在菜單或快捷鍵觸發插件

xcsourceeditorcommand 攔截了消息

從 invocation 中拿到 buffer

在 buffer 中根據目前行,擷取到你要的資料

把資料替換後塞回去

 是以這個 base64 的例子,最後就隻有這麼幾行代碼(隻處理一行文本的情況下)

最後把插件編譯運作到 xcode 8 beta 上面,會出現一個被調試的 xcode,是黑色的:

Xcode Source Editor Extension

然後随便選個項目跑起來,菜單裡面就有了插件了

Xcode Source Editor Extension

我說的輕巧,其實作實中(目前 beta1),出現菜單的機率非常的低,這讓我非常惱火。

當然這個插件開發模式的确能拿來做一些事情,比如代碼的格式化,或者是編解碼,總之都集中在 文本的處理體驗上面。但他的局限性也是非常的明顯,例如:

沒有 ui 相關的接口,純粹隻能做文本處理

沒辦法直接綁定快捷鍵,還得到 xcode 的設定裡面去設定

就目前而言,調試的成功率實在是太低了,很郁悶

隻能通過菜單或快捷鍵調用

隻能處理編輯區域

這些和第三方的 xcode 插件比起來要差的很遠,不過這還算是一個不錯的開端,希望在日後可以把更多的接口開放出來,讓 xcode 這個本來就讓人惱火的東西變得更好用。

繼續閱讀