美文网首页
Xcode Source Editor Extension

Xcode Source Editor Extension

作者: talon23333 | 来源:发表于2022-08-21 14:38 被阅读0次

用了一段时间Tools for Xcode,感觉生成代码功能挺好用的,很好奇它是如何实现的。搜索一番,最后找到了Source Editor Extension

此文只是大致梳理了Source Editor Extension的使用流程及遇到的问题,详细内容可查看苹果官方文档XcodeKit,另外本文最后实现了一个自定义生成Getter的demo。

创建一个源代码编辑器扩展

您可以使用 XcodeKit 在 Xcode 中构建源代码编辑器的扩展。源代码编辑器扩展可以读取和修改源文件的内容,以及读取和修改编辑器中的当前选择的文本。

在 Xcode 中创建一个新的 macOS 项目

要创建源代码编辑器扩展,首先在 Xcode 中创建一个新的 macOS 项目。将一个新的 Xcode Source Editor Extension 目标添加到您的项目中,如下图所示,并在出现提示时将其激活。

添加extension完成后,会自动生成SourceEditorCommand类,该类实现了XCSourceEditorCommand协议,协议中定义了performCommandWithInvocation:completionHandler:方法,当用户点击菜单中添加的命令时,都会调用此方法。

添加可自定义的行为

添加命令

在添加的extension目录下找到info文件,并在XCSourceEditorCommandDefinitions下添加item

实现命令功能

SourceEditorCommand文件中,通过填写方法的主体,将可自定义的行为添加到您的源代码编辑器扩展。以下示例显示了一个反转源代码编辑器中的行顺序的命令:performCommandWithInvocation:completionHandler:

class SourceEditorCommand: NSObject, XCSourceEditorCommand {
    func perform(with invocation: XCSourceEditorCommandInvocation, completionHandler: @escaping (Error?) -> Void ) -> Void {
        // Retrieve the contents of the current source editor.
        let lines = invocation.buffer.lines
        // Reverse the order of the lines in a copy.
        let updatedText = Array(lines.reversed())
        lines.removeAllObjects()
        lines.addObjects(from: updatedText)
        // Signal to Xcode that the command has completed.
        completionHandler(nil)
    }
}

测试您的源代码编辑器扩展

源代码编辑器扩展在单独的 Xcode 中运行,以帮助防止正在进行的扩展中的错误干扰您的开发环境。

测试源代码编辑器扩展

选择扩展方案后,通过运行extension来测试您正在开发的源代码编辑器扩展。将出现一个对话框,要求您选择要运行的应用程序。

选择 Xcode,您的源代码编辑器扩展在 Xcode 的第二个实例中初始化。您可以根据应用程序图标的背景颜色来区分 Xcode 的两个实例。运行源代码编辑器扩展的 Xcode 实例具有黑色背景,而不是第一个实例的浅蓝色背景。


要测试您的扩展定义的命令,请在 Xcode 的测试实例中打开一个源文件。扩展程序定义的所有命令都出现在Editor中,嵌套在扩展程序的名称下,如下图:

选择一个命令后,SourceEditorCommand类中的performCommandWithInvocation:completionHandler:方法将会被调用。通过参数XCSourceEditorCommandInvocation中的commandIdentifier来区分不用的命令。

当您测试您的源代码编辑器扩展时,Xcode的原始实例会继续运行。您可以使用它来调试或查看您正在测试的扩展的控制台输出。

踩坑

1.运行黑色Xcode后,Editor下没有出现定义的命令

首先确认info文件中的命令配置无误后,可尝试把XcodeKit.framework删除后重新导入。


然后再确认下设置扩展中,您的应用程序是否选中Xcode Source Editor

实战——实现自定义Getter生成工具

使用流程

选中属性后,点击Editor下配置的Getter生成命令(可配置快捷键),便可自动生成对应的Getter方法,生成的Getter方法模版可自定义。

自定义Getter介绍

将对应类的Getter模版拷贝到上方的输入框中,点击添加按钮即可添加。当类已添加时,会覆盖模版。

实现大致流程

  • 获取到选中的行,然后遍历处理每一行
  • 尝试获取行中属性的类名属性名,获取失败则continue
  • 根据获取的类名找到对应的Getter方法模版
  • 替换模版中的类名属性名

源码已上传Github,OwnTools

最后

参考文章

相关文章

网友评论

      本文标题:Xcode Source Editor Extension

      本文链接:https://www.haomeiwen.com/subject/ouuvgrtx.html