IntelliJ IDE 插件开发 | (六)内部模式的使用

系列文章

  • IntelliJ IDE 插件开发 |(一)快速入门
  • IntelliJ IDE 插件开发 |(二)UI 界面与数据持久化
  • IntelliJ IDE 插件开发 |(三)消息通知与事件监听
  • IntelliJ IDE 插件开发 |(四)来查收你的 IDEA 使用报告吧
  • IntelliJ IDE 插件开发 |(五)VFS 与编辑器
  • IntelliJ IDE 插件开发 |(六)内部模式的使用

前言

前几篇文章主要介绍了 IntelliJ IDE 插件开发的基础知识和实战内容,作为后续内容的过渡,本文会讲解前几篇文章中提到过的内部模式的使用。内部模式通过菜单形式提供了一系列实用工具,能够帮助初学 IntelliJ IDE 插件的同学极大提升开发效率,由于内部模式提供的工具过多,本文则会挑选几个比较实用的工具进行介绍。

启用内部模式

首先在帮助菜单中找到Edit Custom Properties...

image-20240205104923509

然后加入如下配置:

idea.is.internal=true

保存后重启 IDEA,就可以在 Tools 菜单中发现多了一个 Internal Actions:

image-20240205105443548

下面介绍的工具都是基于 Internal Actions 下的,按照实用性,顺序会有所差异。

UI Debugger

在 Internal Actions 下找到 UI Debugger 菜单,点击后会出现以下弹框:

image-20240205134500788

可以发现这里有 Playback 和 Actions 两个标签页,其中 Playback 用于执行给定的脚本,例如以下脚本会自动执行 CTRL + F 显示搜索框,然后先开启大写,最后输入 HELLO:

%[control F]
%type 20:16;72:16;69:16;76:16;76:16;79:16

第一行用于执行 CTRL + F,第二行中的所有的数字都对应键盘编码(不是ASCII码),例如 20代表开启大写,72代表字符 h,所有的输入用 ; 进行分割,: 前表示字符编码,: 后表示控制字符的编码。所有支持的命令和语法规则可以参考源码,由于这个功能在插件开发中用处不大,这里就不展开介绍了。

效果如下:

动画

上面关于 Playback 的使用了解即可,这里主要讲解一下 Actions 的使用,通过前面的文章我们可以知道,在 IntelliJ IDE 中各种操作(不管是点击菜单项还是通过快捷键)都有相对应的 Action,而 Actions 这个菜单就是用于帮助我们查看每个操作所对应的 Action 类名和 id(如果存在),而知道了 Action 的 id,我们就可以调用相应的操作,这样就实现了对 IDEA 自带功能的使用(也可以直接根据 Action 的类名去找相应的文件去看实现方式),下面以一个具体的例子去介绍使用方式:

例如我们想实现一个根据 Kotlin 类定位到对应的 class 文件并打开的功能,我们首先通过 UI Debugger 去查看 IDEA 定位文件并打开对应的 Action:

动画

这里可以看到该操作对应的 ActionId 为 SelectInProjectView,然后我们只需要实现根据 Kotlin 文件名找到同名的 class 文件的逻辑即可,最终实现方式如下:

class FindClassAction: AnAction() {override fun actionPerformed(e: AnActionEvent) {val project = e.project ?: returnval file = e.getData(CommonDataKeys.VIRTUAL_FILE_ARRAY)?.get(0) ?: returnval kotlinSuffix = ".kt"val classSuffix = ".class"if (!file.name.endsWith(kotlinSuffix)) {Utils.info("请选择 Kotlin 文件")return}// 查找 class 文件路径val className = file.name.replace(kotlinSuffix, classSuffix)val fileList = findFiles(project.basePath.toString(), className, setOf(".idea"))if (fileList.isEmpty()) {Utils.info("未找到对应类文件")return}val classFile = fileList[0]LocalFileSystem.getInstance().findFileByIoFile(classFile)?.let {// 打开文件FileEditorManager.getInstance(project).openFile(it, true)// 定位文件ActionManager.getInstance().getAction("SelectInProjectView").actionPerformed(e)}}// 在指定路径递归查询某个文件, 同时排除指定的路径private fun findFiles(rootDir: String, targetFileName: String, excludedDirs: Set<String> = emptySet()): List<File> { val result = mutableListOf<File>()fun searchFiles(directory: File) {val files = directory.listFiles() ?: returnfor (file in files) {if (file.isDirectory) {if (file.name !in excludedDirs) {searchFiles(file)}} else {if (file.name == targetFileName && file.path.contains("classes")) {result.add(file)}}}}searchFiles(File(rootDir))return result}
}

假如我们想知道格式化代码的实现方式,也是先去获取对应的 action:

动画

这里可以看到对应的 Action 类路径是 com.intellij.codeInsight.actions.ReformatCodeAction,这样我们就可以去找对应的源代码,查看其实现方式:

image-20240205150729549

通过这种方式,我们就可以在对 IDEA 自带功能有某些定制化需求的时候,通过继承原有类,然后重写某些逻辑去实现我们的需求。

UI Inspector

通过 UI -> UI Inspector 可以找到该菜单,不过我们在实际使用的时候并不需要从菜单里点击,只需要选择 IDEA 界面中某个 UI 组件,然后使用 CTRL + ALT + 点击鼠标左键即可显示该组件的 UI 信息,如下所示:

动画

这里查看的是 debug 按钮所对应的布局信息,具体如下:

image-20240205152021642

可以发现这里也有 Action ID 和 Action Class 属性,因此上面想查找定位按钮的 Action ID 也可以通过这种方式进行查看:

image-20240205152549992

可以看到这里的 id 和我们通过 UI Debugger 获取的内容一样,当然除了 Action 相关的信息,根据查看的组件类型不同,所对应的属性也会有区别(例如设置页面和这里的按钮属性就有些不同),具体的不同可以查看官网。

LaF Defaults

通过 UI -> LaF Defaults 可以找到该菜单,点击后会出现以下弹框:

image-20240205154635942

这里展示了 IDEA 中所有的颜色和外观设置(例如各种间距),我们可以点击对应的 Value 值进行修改,同时修改的设置会立即生效,因此如果有开发主题类插件需求的时候,我们就可以很方便地先通过该工具获取实时的预览效果,例如我们去修改按钮的圆角大小为 0:

image-20240205155316347

修改完就可以发现按钮的圆角消失了:

image-20240205155349887

或者是修改按钮的背景色:

image-20240205155719598

点击 OK 后会出现以下效果:

image-20240205155754512

Kotlin UI DSL

image-20240205155852946

在前几篇文章中我们有简单地使用 Kotlin UI DSL 去实现一些 UI 界面,如果是初学者对相关的使用方式不熟悉,就可以通过该菜单去查看一些组件地使用用例,点击View source就可以查看相应的源码:

image-20240205160104843

总结

本文主要讲解了内部模式中几个比较实用的工具,希望能给大家提供一些帮助,如果你发现了一些插件开发中的小技巧,也欢迎一起交流讨论~~~

题外话

从下篇文章开始会逐步介绍 PSI、自定义语言以及一些常用插件的开发思路和实现方式,敬请期待,同时也祝各位新年快乐,在新的一年里,事业有成,身体健康,家庭幸福,万事如意!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/670628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

PCB正片和负片的区别与使用

PCB正片和负片的区别与使用 简单解释详细解释 简单解释 简单的来说&#xff0c;正片在电路板的表面&#xff08;指定是顶层和底层&#xff09;上保留我们绘图工具所画的线&#xff08;图案&#xff09;。 而负片则是将我们绘制的线&#xff08;图案&#xff09;进行腐蚀掉&am…

leetcode1079:游戏玩法分析——求留存率

求留存率 题目描述题解 题目描述 表&#xff1a;Activity --------------------- | Column Name | Type | --------------------- | player_id | int | | device_id | int | | event_date | date | | games_played | int | --------------------- &#xff08;player_id&…

JIT逆优化引发的Java服务瞬时抖动 问题排查解决方案

目录 一、背景 二、前期排查&#xff08;失败&#xff09; 三、使用神器JFR 四、学习JIT&思考解决方案 五、最终的解决方案 五、总结 一、背景 我们有一个QPS较高、机器数较多的Java服务&#xff1b;该服务的TP9999一般为几十ms&#xff0c;但偶尔会突然飙升至数秒&a…

OnlyOffice:释放无限创意,打造高效协作新体验

Onlyoffice &#x1f496;前言一、&#x1f4ab;开发者版本介绍二、&#x1f4ab;开发者版本特点三、&#x1f4ab;最新版重磅来袭&#xff0c;8.0版本介绍1.显示协作者头像2.插件 UI 界面更新 四、✨Windows部署ONLYOFFICE1.安装Erlang2.安装RabbitMQ3.安装Redis4.安装Postgre…

CSS:两列布局

两列布局是指一列宽度固定&#xff0c;另一列自适应。效果如下&#xff1a; HTML: <div class"container clearfix"><div class"left"></div><div class"right"></div> </div>公共 CSS&#xff1a; .con…

Elasticsearch:BM25 及 使用 Elasticsearch 和 LangChain 的自查询检索器

本工作簿演示了 Elasticsearch 的自查询检索器将非结构化查询转换为结构化查询的示例&#xff0c;我们将其用于 BM25 示例。 在这个例子中&#xff1a; 我们将摄取 LangChain 之外的电影样本数据集自定义 ElasticsearchStore 中的检索策略以仅使用 BM25使用自查询检索将问题转…

【Vue】指令之列表循环、表单元素绑定

Vue指令[3] 列表循环、表单元素绑定v-for指令v-model指令 列表循环、表单元素绑定 v-for指令 作用&#xff1a;根据数据生成列表结构 数组经常和v-for结合使用数组长度的更新会同步到页面上面&#xff0c;是响应式的 语法&#xff1a;(item,index) in 数据&#xff0c;其中…

2023 OpenHarmony 年度运营报告

汇聚 70 家企业 6700名贡献者力量&#xff0c; OpenHarmony 已成为下一代智能终端操作系统根社区&#xff1b; 我们在成长,OpenHarmony 项目群成员单位增至 35 家&#xff1b; 2023 年持续迭代更新 6 个版本及 OpenHarmony4.0 重点特性简介……

Stable Diffusion 模型下载:RealCartoon3D - V14

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十下载地址模型介绍 RealCartoon3D 是一个动漫卡通混合现实风格的模型,具有真实卡通的 3D 效果,当前更新到 V14 版本。 RealCartoon3D 是我上传的第一个模型。我仍在学习这些东西,但…

计算机毕业设计 基于SpringBoot的线上教育培训办公系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

C语言数组练习以及场景练习题

写了那么久的知识点梳理&#xff0c;今天来写点自己觉得不错的练习题来分享&#xff0c;顺便来巩固自己的知识点&#xff0c;和加强题型的解决方法的记忆。今天给大家带来的有数组的找数字题目&#xff0c;以及场景找凶手的题目&#xff0c;下面让我们来看看今天的第一道题目。…

进程间通信:有名管道

如果读端关闭&#xff0c;写端继续向管道内写数据将会导致管道破裂&#xff0c;内核将会发送信号SIGPIPE到进程中&#xff0c;该信号的默认处理方式为结束进程&#xff1b; 如果写端关闭&#xff0c;读端继续从管道中读取数据将会读不到任何数据&#xff1b; 管道文件的大小固定…

Linux基础-磁盘

1.磁盘分区 1.分区有固定大小 2.直接写在这块盘的磁盘分区表中&#xff08;DPT&#xff09;&#xff0c;和上面装什么操作系统没有任何关系 2.每一个磁盘分区都要先有一个磁盘分区类型 GPT&#xff08;首选&#xff09; MBR 3.磁盘专业术语叫做块设备&#xff08;Block Dev…

洗地机哪个质量好?2024洗地机选购推荐

地面清洁作为大扫除的重要部分&#xff0c;看似简单&#xff0c;却也让很多人头疼。地板上的奶渍、厨房的油渍酱渍……遇到顽固污渍&#xff0c;普通的清洁工具很难去除&#xff0c;即便用湿抹布勉强去除&#xff0c;也会残留不少水渍&#xff0c;只能反复擦拭&#xff0c;费时…

行业科普应用分享 | 用于安全和安保的仪器仪表

【前言】 物联网带来了对安全和安保的新要求。利用物联网&#xff0c;运营商可以从复杂和分布式的装置中获益。此外&#xff0c;自主系统在现代工业的运作中正变得越来越重要。 从制造业到农业&#xff0c;这些远程操作需要仪器提供持续监测&#xff0c;以提供安全和保障。这…

MySQL学习记录——사 表结构的操作

文章目录 1、创建表2、查看表结构3、改变表结构4、删除表5、总结 1、创建表 CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 例子 create table users ( id int, name varchar(20) c…

计算机设计大赛 深度学习+opencv+python实现昆虫识别 -图像识别 昆虫识别

文章目录 0 前言1 课题背景2 具体实现3 数据收集和处理3 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数&#xff1a;2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 4 MobileNetV2网络5 损失函数softmax 交叉熵5.1 softmax函数5.2 交叉熵损失函数 6 优化器SGD7 学…

第5节、S曲线加减速转动【51单片机+L298N步进电机系列教程】

↑↑↑点击上方【目录】&#xff0c;查看本系列全部文章 摘要&#xff1a;本节介绍步进电机S曲线相关内容&#xff0c;总共分四个小节讨论步进电机S曲线相关内容 5-1、S曲线加减速简介   根据上节内容&#xff0c;步进电机每一段的速度可以任意设置&#xff0c;但是每一段的…

Backtrader 文档学习-Indicators- TA-Lib

Backtrader 文档学习-Indicators- TA-Lib 1.概述 即使BT提供的内置指标数量已经很多&#xff0c;开发指标主要是定义输入、输出并以自然方式编写公式&#xff0c;还是希望使用TA-LIB。原因: 指标X在指标库中&#xff0c;而不在BT中TA-LIB众所周知的&#xff0c;人们信任口碑…

XUbuntu22.04之两款实用画笔工具(二百一十)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…