Xcode插件开发入门 —— JTTMagicLine

jopen 10年前

一、准备工作


首先前往 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类型的工程了:

Alt text

原来的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

    </li>
  • Plugin Debugging: 由于Plugin是无法即时运行看结果的,所以可以通过NSLog(...)查看输出是否正常,而log出来的结果记录在/var/log/system.log文件中,可以使用控制台程序或tail命令查看。
  • </ul>

    也可以参考这篇文章:Xcode5 Plugins 开发简介

    二、Xcode插件:VVDocumenter


    VVDocumenter 是由 @onevcat 喵神开发的一个Xcode插件,其作用是在Xcode中输入"///"后自动生成规范的文档注释,的确非常好用而且实用。

    由于本人有着非常严重的代码洁癖,并且希望代码之间有着清晰的模块关系,所以常常习惯用一整行的"////////////..."来分隔各个代码模块,从而保持美观。例如:

    Alt text

    单纯的#pragma mark - 已经让我欲求不满了。

    受到VVDocumenter的启发,决心参考喵神的代码自己写一个输入"mgl"后生成一整行"////////////..."的Xcode插件 —— JTTMagicLine。(这是一个有情怀的插件名)

    由于JTTMagicLine的代码和整体架构都是参考了喵神的VVDocumenter的代码,所以本小节的标题直接给了VVDocumenter。

    三、JTTMagicLine工作原理


    在看了半遍VVDocumenter的源码后,大概弄懂了其原理,然后仿照着弄了个JTTMagicLine。
    接下来说下JTTMagicLine的工作原理(和VVDocumenter的工作原理大致相同):

    • 在插件程序启动后,开始监听NSTextView中文字改变的消息,也就是监听Xcode中编辑区中文字改变的消息。
    • 当Xcode编辑区文字改变时,获取鼠标当前光标所在行的文字,并和触发替换事件的字符串(例如mgl)做正则匹配
    • 如果匹配成功,那么新建一个键盘事件类来模拟各种键盘事件:
      • Command + delete: 删除该行
      • Command + V: 粘贴要替换的字符串,这里是"///////////////..."
      • return: 回车 + 换行,方便懒人开发者,例如我
      • 还原paste board中的内容和各种参数等
      </li> </ul>

      四、代码


      已经开源到GitHub中,由于参考了喵神的代码,所以代码逻辑还是非常清晰的,有兴趣就Download来看看吧:guesn10000/JTTMagicLine

      Alt text

      代码中已经写了注释,还是比较易懂的。

      工程中有一个TODO.h,明显还是有很多问题或功能没有完善的,例如设置面板、Command + Z的问题等,我会继续完善的。

      五、Build and Use xcplugin


      在编写好代码后,Build一下,可以在 ~/Library/Application Support/Developer/Shared/Xcode/Plug-ins 目录下看到生成的xcplugin文件:

      Alt text

      如果你嫌每次都要跳到那个目录太麻烦或者记不住插件目录的路径的话,可以像我一样弄个alias到.zshrc或.bash_profile中(具体看不同的shell吧):

      alias cdxcplugins='cd ~/Library/Application\ Support/Developer/Shared/Xcode/Plu$  alias cdoxcplugins='cdxcplugins;open .' 

      好吧,重启Xcode。
      在Xcode的文字编辑区中输入mgl,啦啦:

      Alt text

      大功告成。

      六、不足


      其实最后一小节可以叫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