构建自己的Xcode 8 Source Editor Extension

自WWDC 2016以来,我对Xcode 8中发布的新Xcode源代码编辑器扩展感到非常兴奋。你们中的某些人可能知道我曾经写过另一个名为VWInstantRun的Xcode插件,该插件是用一些运行时黑客制作的,又名老式/非官方方式。

因此,自然而然地,我希望将此插件移植到全新的Xcode源代码编辑器扩展中。 我在这个周末进行了尝试,但未能通过新方法实施InstantRun 。 基本上有两个主要限制来实现它:

  1. API唯一向我们展示的是字符串缓冲区对象中当前文件的文本。 根本无法访问某些与UI相关的组件。 不可能像VWInstantRun那样将结果直接输出到调试区域。
  2. 由于我们假设现在要在扩展内构建事物,因此这当然是一个沙箱。 这意味着在运行时无法在CLI中运行build命令。

好吧,因此我放弃了。 但是我并不是说新的Xcode扩展不值得一看。 相比之下,我认为这是一个很好的开始,它允许访问最重要的部分(源代码编辑器),该部分允许创建许多有用的功能,同时消除任何潜在的隐私和安全威胁。

让我们建立一个

我将在此处尝试提供一个简单的教程,向您展示如何轻松构建自己的Xcode扩展。 让我们通过从AppCode借鉴一些想法开始做这件事,例如快速删除/复制所选行。

I.打开Xcode 8。

(当前版本为Beta 1)

创建一个新的macOS项目并激活相关方案。

使用Xcode源代码编辑器扩展创建一个新目标。 (由Xcode提出的激活方案)

二。 配置。

在“ Info.plist”文件中打开“ NSExtension”对,“ XCSourceEditorCommandDefinitions”是一个包含几个“ item”的数组,一个“ item”代表自定义命令。 在每个“项目”中,有3对。

1.`XCSourceEditorCommandClassName`:用于实现`XCSourceEditorCommand`协议的类的名称。
2.`XCSourceEditorCommandIdentifier`:您选择用来标识唯一命令的标识符
3.`XCSourceEditorCommandName`:命令的名称,将显示在Xcode菜单上。

在这里,我们需要添加两个新命令:`delete_lines`和`duplicate_lines`。

三, 实施。

直接进入`SourceEditorCommand`,实现协议方法:

 公共功能表演(带有调用:XCSourceEditorCommandInvocation,completionHandler:(NSError?)-> Swift.Void) 

是的,只有一种方法可以实现。 根据描述,此方法将:

使用调用中的信息执行与命令关联的操作。 Xcode将向代码传递完成处理程序,该处理程序必须调用该完成处理程序才能完成命令的执行,成功时传递nil,失败时传递错误。

换句话说,您需要做的是基于给定信息的不同命令来操纵“文本缓冲区”。 您将在`invocation`实例中找到所需的全部内容。 完成后,调用完成处理程序,传递`nil`或`error`。

请直接从Github上的代码源中检查实现的详细信息,该文件已被很好地证明。

IV。 我们完了 ! 🎉🎉

现在运行您的项目,并使用Xcode-beta对其进行测试。 您会发现创建了另一个灰色的Xcode实例,这是您用来测试和调试的实例。

在菜单(灰色的Xcode菜单)中,您会找到在Info.plist中添加的命令。 尝试一下。

您还可以使用Xcode设置中的热键进行绑定。

然后去哪儿?

在Xcode 8 beta 1中,仍然存在许多错误(例如有时只是被禁用),但这绝对是一个好的开始。 今年还有WWDC视频介绍了此新功能,请随时查看。

如果您有任何问题或反馈,我已将该项目放在Github上,可以随时通过@wangshengjia在Twitter上提交问题或ping我。

享受〜🍻