Xcode 8-将Alcatraz的插件转换为Source Editor Extension

数组XCSourceEditorCommandDefinitions将保存选项的详细信息。 复制/粘贴项目0并将其修改为上面的plist。

XCSourceEditorCommandIdentifier,它是一个标识符,将在SourceEditorCommand中使用该标识符来识别按下了哪个按钮。

XCSourceEditorCommandName是将显示在“编辑器”菜单中的文本。

现在,如果您运行该项目,您将注意到带有灰色图标的Xcode新实例已启动。 这意味着它是包含我们扩展名的Xcode。打开一个项目,然后单击any。 m或。 迅速的文件。 然后转到编辑器,您会注意到一个选项Manage Logs和另外两个选项Enable LogsDisable Logs 。 尝试单击它们,当然什么也不会发生。

PS。 ( 编辑器->管理日志->禁用日志)中的“ 管理日志”选项出现,因为它是目标的名称。 因此,如果您需要更改该选项,只需更改目标名称。

回到SourceEditorCommand.m

好的,我们现在可以开始开发了! 我们只需要用// NSLog替换NSLog(,// print(替换print() 。那应该很容易吧?

不幸的是,这个问题并不是那么容易,它有点复杂,但是最后也不是那么困难。 因此,让我们看看我们需要做什么:

  1. 识别当前文件是.swift还是.m文件
  2. 确定按下了哪个按钮(“ 启用日志”或“ 禁用日志”
  3. 使用NSArray获取当前文件的行
  4. 遍历各行,查找包含日志的行
  5. 用注释掉的日志替换特定行。

这是我们项目的代码:

不用担心 我们将讨论每个步骤。

识别当前文件的类型

因此,识别当前文件的类型非常容易。 只需检查invocation.buffer.contentUTI中的字符串值以获取public.objective-c-sourcepublic.swift-source。 由于在我们的项目中, 正则表达式和用于注释日志的字符串对于Swift和Objective-C而言是不同的,因此我们需要检查文件的类型并设置适当的变量。

识别按下了哪个按钮

还记得我们为Info.plist上的每个按钮设置键XCSourceEditorCommandIdentifier的值的时候吗?第2行中,我们使用invocation.commandIdentifier来检查单击了哪个按钮。

循环浏览当前文件的各行

第5行上,我们遍历invocation.buffer.lines ,这是一个保存当前文件行的数组。 您可以作为NSString访问该行。

第8行,我们检查当前行是否已被注释掉。 如果是真的,我们将其跳过。

第13行,我们检查当前行是否包含NSLog(print(。如果包含字符串,则它将继续进行进一步的检查。否则,它将跳过当前行。

第16行,我们调用了我创建的函数。 此函数正在检查字符串是否包含有效的日志消息,如果该字符串为true,则返回修改后的字符串(注释掉的日志)。

第19行,我们获得当前行的索引。

第22行,我们将当前行替换为修改后的行。

就是这样! 无需描述commentLogFromLineunCommentLogFromLine方法 因为您可能不需要它们。 他们只是在解析一个字符串。

这很简单

我认为创建该扩展非常简单。 关键是要获得我们熟悉的NSString中的行。 一旦获得NSString,就可以发挥想象力。

Xcode源代码编辑器扩展VS Alcatraz

在对两者进行试验之后,我现在可以比较它们并分享我的想法。

尽管Apple仅提供WWDC 16的视频作为文档,但我发现Source Editor Extension非常易于使用。 实施任何项目都需要相同的过程(确定源文件是Objective-C还是Swift,确定按下了哪个按钮,获取数组中的行,修改行并替换)。 Source Editor Extension的缺点是它仅用于替换文本,并且一次只能编辑一个源文件。

另一方面,恶魔岛(插件)要复杂一些,我记得花了一些时间来熟悉。 对于LogDisabler,我使用NSTaskUNIX的 sed命令查找并替换了日志。 我知道,使用sed替换项目中的文本听起来有些可怕,因为很多事情都会出错。 Alcatraz插件的不利之处在于,它不会像Source Editor Extension那样提供对源文件的访问,有时您必须深入了解这一点。

将LogDisabler实现与Source Editor Extension和Alcatraz插件进行比较:

源代码编辑器扩展:

轻松访问源文件的缓冲区。 没有任何已知问题的更好的“注释掉”算法(可以用几条命令在一行中注释掉log命令)。 一次仅编辑一个源文件。

恶魔岛的插件

您必须“低级”替换文本,这可能会使您的项目混乱,但是一旦有了可靠的解决方案,您就可以替换项目下的所有日志命令。 字符串操作虽然不错,但不如Source Editor Extension出色。

您可以在此处找到带有Source Editor Extension的LogDisabler构建