一、Xcode Source Editor Extension 简介
在Xcode8的以前,开发者可以在Xccode运行时通过注入代码来实现插件的功能。插件可以在Alcatraz上面提交和分发。不过Xcode8禁止了该方式的插件安装,转而向开发者提供了Xcode Source Editor Extension(以下简称Extension)的方式来做插件。
Extension特性(安全性)
- 支持上架到AppStore
- 每个Extension运行在独立的进程,如果它崩溃了,不会引起Xcode的崩溃,且会有错误提示
Extension不足(功能性)
- 无UI交互
- 只能够在开发者调用相关命令的时候直接的修改代码,具体表现为
获取正在编辑的文本
获取选中的区域
替换正在编辑的文本
选中正在编辑的文本
在Editor菜单中生成一个子菜单,用于调用插件
绑定快捷键 - Extension不能在后台运行
虽然Extension有诸多不足,但是没有插件写代码是件痛苦的事情,所以在空闲的时候我也做了一些需要用到的Extension,帮助提高开发效率。
-
删除选中行的Xcode8插件:
创建mac工程
https://github.com/CatchZeng/DeleteLine
2.Add Target
Add Target 选择Xcode Source Editor Extension 输出信息3.工程结构
工程结构4.编写Extension代码(SourceEditorCommand.m)
- (void)performCommandWithInvocation:(XCSourceEditorCommandInvocation *)invocation completionHandler:(void (^)(NSError * _Nullable nilOrError))completionHandler { //有选中了才删除 if (invocation.buffer.selections.count != 0) { XCSourceTextRange* firstObject = invocation.buffer.selections.firstObject; //开始删除的位置 NSUInteger start = firstObject.start.line; //删除的行数 NSUInteger len = firstObject.end.line - start +1; //Index Set NSIndexSet* set = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(start,len)]; //移除指定代码 [invocation.buffer.lines removeObjectsAtIndexes:set]; } completionHandler(nil); } @end
5.修改Extension显示名称
修改Extension显示名称
修改Extension显示名称6.Run DeletePlugin
Run
随意选择一个工程打开7.测试Extension
测试Extension8.绑定快捷键
绑定快捷键下面解释一下Extension的Code部分
-
XCSourceEditorCommand 当插件触发后,在代理方法里面可拦截到消息(XCSourceEditorCommandInvocation)
-
XCSourceEditorCommandInvocation 存放着用来区分Extension的唯一标示(identifier) 和 数据(XCSourceTextBuffer)
XCSourceTextBuffer主要有两个属性需要了解
//当前的文本 @property (readonly, strong) NSMutableArray <NSString *> *lines; //选中的区域 @property (readonly, strong) NSMutableArray <XCSourceTextRange *> *selections;
Delete Extension的流程如下:
1.菜单或快捷键触发Delete Extension
2.XCSourceEditorCommand 拦截到消息
3.从XCSourceEditorCommandInvocation 中拿到 XCSourceTextBuffer
4.在XCSourceTextBuffer中分析需要删除的行
5.删除选中行
三、总结
最后,一起为Xcode8写插件吧...
-
网友评论