一、Xcode Source Editor Extension 简介
在Xcode8的以前,开发者可以在Xccode运行时通过注入代码来实现插件的功能。插件可以在Alcatraz上面提交和分发。不过Xcode8禁止了该方式的插件安装,转而向开发者提供了Xcode Source Editor Extension(以下简称Extension)的方式来做插件。
Extension特性(安全性)
- 支持上架到AppStore
- 每个Extension运行在独立的进程,如果它崩溃了,不会引起Xcode的崩溃,且会有错误提示
Extension不足(功能性)
- 无UI交互
- 只能够在开发者调用相关命令的时候直接的修改代码,具体表现为
获取正在编辑的文本
获取选中的区域
替换正在编辑的文本
选中正在编辑的文本
在Editor菜单中生成一个子菜单,用于调用插件
绑定快捷键 - Extension不能在后台运行
虽然Extension有诸多不足,但是没有插件写代码是件痛苦的事情,所以在空闲的时候我也做了一些需要用到的Extension,帮助提高开发效率。
-
删除选中行的Xcode8插件:
https://github.com/CatchZeng/DeleteLine
-
快速导入头文件的Xcode8插件:
https://github.com/CatchZeng/ImportSourceEditor
快速添加定义的#pragma mark 的Xcode8插件
https://github.com/CatchZeng/PragmaMarkSourceEditor
二、Xcode Source Editor Extension 实例
下面以删除选中行的Xcode8插件为例,详细介绍Extension的实现。
1.创建mac工程
2.Add Target
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显示名称
6.Run DeletePlugin
7.测试Extension
8.绑定快捷键
下面解释一下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写插件吧...