为 CLion 开发插件
当您在 CLion 中缺少某些功能时,可以考虑编写自己的插件。 本文旨在帮助您掌握 IntelliJ 平台插件开发的基础知识,并指导您完成实现 CLion 插件的第一步。
任何 CLion 插件都是 IntelliJ 平台 的扩展,因此通常是一个特定的 Java 项目。 IntelliJ 插件开发支持两种工作流:使用 gradle-intellij-plugin 和 Gradle 作为构建系统(推荐方式),或使用 DevKit 和 IntelliJ IDEA 自带的构建系统。
作为插件开发的 IDE,请使用 IntelliJ IDEA 社区版或专业版。
除了 IntelliJ IDEA 本身,您还需要一个目标 CLion 发行版。 使用基于 Gradle 的方法时,可以通过构建脚本自动下载。 如果使用 DevKit,请确保手动安装 CLion。
平台开放 API
CLion 没有提供具有稳定性保证和详细描述的公共 API,但您可以使用 平台开放 API 的所有功能。 探索平台 API 的有效方法是从官方 代码库 获取并检查 IntelliJ IDEA 社区版的源代码。
IntelliJ 平台的 API 可能会在版本之间发生变化,从而影响插件功能。 这些更改列在 IntelliJ 平台和插件中的不兼容更改 中。 请注意,CLion 内部 SDK 可能会随时更改,且不会提前通知。
如果需要有关 CLion 插件 API 使用的帮助,请随时在 社区论坛 上提问。
扩展
IntelliJ 平台为插件提供了 扩展和扩展点 ,以添加新功能或自定义现有功能。 插件应在 """ plugin.xml """ 文件中声明其实现了一个或多个扩展 <extenstions> 或扩展点 <extensionPoints>。 要获取可用扩展和扩展点的列表,请探索社区版源代码中 此 目录下的 *Extention/*ExtentionPoints 文件。
一些常见的扩展点如下:
插件依赖
您的插件可能依赖于其他插件的类。 在这种情况下,插件可以是捆绑的、第三方的,甚至是您自己的。 有关表达依赖关系的更多信息,请参阅 插件依赖。
您的插件应指定其将兼容的产品或产品(所有基于 IntelliJ 的 IDE,仅 CLion 或某些子集)。 您可以通过在 """ plugin.xml """ 中使用 <depends> 标签声明模块依赖关系来实现(请参阅 与 IntelliJ 产品的插件兼容性)。
某些模块在所有基于 IntelliJ 的产品中都可用,而以下模块专门在 CLion 中可用:
com.intellij.modules.cidr.lang- C/C++ 语言支持(此模块在 Android Studio 中也可用);com.intellij.modules.cidr.debugger- 原生调试器支持(也在 Android Studio 中);com.intellij.modules.clion- 核心 CLion 功能。
Plugin.xml 文件
""" plugin.xml """ 文件是一个 关键插件描述符 ,包含插件元数据:名称、描述、作者、变更日志以及实现功能的列表。
name, id, description 和 vendor 的值是确保您的插件正确注册到插件数据库所必需的。 每个 depends 参数(如上所述)是插件所依赖模块的 ID; depends 参数的列表隐式定义了兼容的产品。
开始使用 CLion 插件
接下来,我们将重点介绍基于 Gradle 的方法,这是所有新插件项目的推荐方法。 仍然支持现有插件的 DevKit 工作流在 Using DevKIt 中进行了描述。
首先, 安装 IntelliJ IDEA Community 或 Ultimate。 在开始之前,请检查您的 IntelliJ IDEA 实例中是否启用了两个捆绑插件, Gradle 和 DevKit (转到 并按名称搜索插件)。
基于 Gradle 的工作流
让我们以一个将 问候 添加到 IDE 主菜单并为 CLion 定制的插件为例。
创建一个新的 Gradle 项目,并在 附加库和框架 的列表中选择 IntelliJ 平台插件。

按照创建 new Gradle project 的过程进行操作。 建议选择 使用默认的 gradle 包装器 选项——这样,IntelliJ IDEA 将自动配置运行 Gradle 任务所需的一切。

当模板插件项目准备好后,从 调用 Gradle 工具窗口,并注意 runIde 任务。 此任务启动插件的目标 IDE(默认情况下配置为 IntelliJ IDEA):

查看 gradle-intellij-plugin 提供的任务的完整 list。
现在让我们修改默认项目:
添加一个名为 HelloAction 的新 Java 类:
import com.intellij.openapi.actionSystem.*; import com.intellij.openapi.project.Project; import com.intellij.openapi.ui.Messages; public class HelloAction extends AnAction { public HelloAction() { super("Hello"); } public void actionPerformed(AnActionEvent event) { Project project = event.getProject(); Messages.showMessageDialog(project, "Hello world!", "Greeting", Messages.getInformationIcon()); } }将以下示例代码放入 """ plugin.xml """ :
<idea-plugin> <id>org.helloplugin</id> <name>Hello Action Project</name> <version>0.0.1</version> <vendor email="dummy" url="dummy">dummy</vendor> <depends>com.intellij.modules.lang</depends> <extensions defaultExtensionNs="com.intellij"> </extensions> <actions> <group id="MyPlugin.SampleMenu" text="Greeting" description="Greeting menu"> <add-to-group group-id="MainMenu" anchor="last"/> <action id="Myplugin.Textboxes" class="HelloAction" text="Hello" description="Says hello"/> </group> </actions> </idea-plugin>更改 构建.gradle 脚本中的
intellij条目(有关更多信息,请参阅 Setup DSL):intellij { version 'LATEST-EAP-SNAPSHOT' type 'CL' }CLion 随 2019.2 EAP 一起发布到兼容 Maven 的 artifacts repository。 因此,目前您可以使用
LATEST-EAP-SNAPSHOT或191-EAP-SNAPSHOT作为版本说明符。
现在我们可以运行 runIde 任务,并在 CLion 主菜单中看到 问候。

后续步骤
上述示例非常基础,仅使用了通用的 IntelliJ 功能,而没有涉及 CLion 的特定功能。 要深入了解,请探索 SDK 文档中的 Plugin Structure 部分和 CLion Plugin Development, IntelliJ SDK docs FAQs 和 社区论坛。
如果您有兴趣开发用于自定义语言支持的插件,请参阅平台 SDK 文档中的 dedicated section ,并查看 Antlr's plugin development notes。 PSI Viewer 插件可以帮助您熟悉程序结构接口(PSI)。
另请参阅有关 testing 插件的指导文档。 关于发布插件的主题在 Publishing plugins with Gradle 和 Publishing DSL 中进行了讨论。