Xcode插件開發入門 —— JTTMagicLine
一、準備工作
首先前往 kattrali/Xcode5-Plugin-Template 下載Xcode 5 Plugins開發的模板文件。最好git clone吧,方便日后更新。
將下載好的Git倉庫復制到 ~/Library/Developer/Xcode/Templates/Project Templates/Application Plug-in/Xcode5 Plugin.xctemplate ,如果沒有對應的子目錄就手動創建,另外最后要把Git倉庫命名為Xcode5 Plugin.xctemplate。
重啟Xcode 5,然后新建一個工程,就可以看到Xcode Plugins類型的工程了:

原來的GitHub介紹頁面中還包括了Usage, Notes, Plugin Debugging三部分。簡單說下:
- Usage: 就是模板工程中的作用——點擊Xcode菜單中的File -> Do Action,彈出一個Hello World的對話框。
- Notes:
- 在插件的Xcode工程中也有一個Info.plist文件,設置該文件中的XCPluginHasUI為YES,可以關閉插件的功能。
- 為了支持不同的Xcode,例如Xcode 5.0.2, Xcode 5.1.1等,需要設置Info.plist文件的DVTPlugInCompatibilityUUIDs選項,在其中加入不同的Xcode的UUID。查看Xcode UUID的方法:
defaults read /Applications/Xcode.app/Contents/Info DVTPlugInCompatibilityUUID
- Plugin Debugging: 由于Plugin是無法即時運行看結果的,所以可以通過NSLog(...)查看輸出是否正常,而log出來的結果記錄在/var/log/system.log文件中,可以使用控制臺程序或tail命令查看。
也可以參考這篇文章:Xcode5 Plugins 開發簡介
二、Xcode插件:VVDocumenter
VVDocumenter 是由 @onevcat 喵神開發的一個Xcode插件,其作用是在Xcode中輸入"http:///"后自動生成規范的文檔注釋,的確非常好用而且實用。
由于本人有著非常嚴重的代碼潔癖,并且希望代碼之間有著清晰的模塊關系,所以常常習慣用一整行的"http:////////////..."來分隔各個代碼模塊,從而保持美觀。例如:

單純的#pragma mark - 已經讓我欲求不滿了。
受到VVDocumenter的啟發,決心參考喵神的代碼自己寫一個輸入"mgl"后生成一整行"http:////////////..."的Xcode插件 —— JTTMagicLine。(這是一個有情懷的插件名)
由于JTTMagicLine的代碼和整體架構都是參考了喵神的VVDocumenter的代碼,所以本小節的標題直接給了VVDocumenter。
三、JTTMagicLine工作原理
在看了半遍VVDocumenter的源碼后,大概弄懂了其原理,然后仿照著弄了個JTTMagicLine。
接下來說下JTTMagicLine的工作原理(和VVDocumenter的工作原理大致相同):
- 在插件程序啟動后,開始監聽NSTextView中文字改變的消息,也就是監聽Xcode中編輯區中文字改變的消息。
- 當Xcode編輯區文字改變時,獲取鼠標當前光標所在行的文字,并和觸發替換事件的字符串(例如mgl)做正則匹配
- 如果匹配成功,那么新建一個鍵盤事件類來模擬各種鍵盤事件:
- Command + delete: 刪除該行
- Command + V: 粘貼要替換的字符串,這里是"http:///////////////..."
- return: 回車 + 換行,方便懶人開發者,例如我
- 還原paste board中的內容和各種參數等
四、代碼
已經開源到GitHub中,由于參考了喵神的代碼,所以代碼邏輯還是非常清晰的,有興趣就Download來看看吧:guesn10000/JTTMagicLine

代碼中已經寫了注釋,還是比較易懂的。
工程中有一個TODO.h,明顯還是有很多問題或功能沒有完善的,例如設置面板、Command + Z的問題等,我會繼續完善的。
五、Build and Use xcplugin
在編寫好代碼后,Build一下,可以在 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins 目錄下看到生成的xcplugin文件:

如果你嫌每次都要跳到那個目錄太麻煩或者記不住插件目錄的路徑的話,可以像我一樣弄個alias到.zshrc或.bash_profile中(具體看不同的shell吧):
alias cdxcplugins='cd ~/Library/Application\ Support/Developer/Shared/Xcode/Plu$
alias cdoxcplugins='cdxcplugins;open .'
好吧,重啟Xcode。
在Xcode的文字編輯區中輸入mgl,啦啦:

大功告成。
六、不足
其實最后一小節可以叫Issue,該插件在我寫這篇博文的時候用了半天來搞,還有很多功能沒有完善,我記住TODO.h中了:
#ifndef JTTMagicLine_TODO_h #define JTTMagicLine_TODO_h /*
1.增加設置面板,可以設置替換的字符串和觸發替換事件的字符串,關閉該插件的功能等
2.修復Command + Z無法恢復某行字符串的問題,參考VVDocumenter
3.增加對Xcode 6的支持
*/ #endif
我會繼續完善的,例如:先回頭深入看下正則表達式再去看喵神的源碼,然后再回來改進JTTMagicLine等。這個還是看心情吧,因為這個插件暫時性地滿足了我的需求。
來自:https://app.yinxiang.com/shard/s32/sh/86ab7ac1-7507-4c24-bf71-47e3c3f3c217/324316d417864a09dcce657b3b919b8a