IntelliJ IDE 插件开发 | (九)实现 Unicode 字符折叠预览

系列文章

本系列文章已收录到专栏,交流群号:689220994,也可点击链接加入。

前言

在上一篇文章中我们介绍了如何实现 i18n 的方式,其中提到官方建议我们在编写语言文件时将 ASCII 码范围外的字符都使用 Unicode 编码进行表示,这样就导致我们无法直观地看到原始文本,因此本文就来介绍如何实现对 Unicode 字符折叠预览的功能,最终实现效果如下,另外本文所涉及到的完整代码也已上传到GitHub。

动画

实现方式

在正式实现之前先说一下整体的实现思路:

  1. 引入com.intellij.properties插件用于处理properties格式的语言文件。
  2. 继承om.intellij.lang.folding.FoldingBuilderEx类,重写其中的方式实现折叠字符及预览文本。
  3. 将实现类注册到plugin.xml中。

实现步骤

首先是引入com.intellij.properties插件并进行配置:

  • build.gradle.kts
// 配置开发过程中运行的 IDEA 沙盒信息
intellij {// IDEA 的版本version.set("2023.2.5")// 这里 IU 是指付费版, 也可以选择 IC 对应社区版type.set("IU")// 用到的插件plugins.set(listOf("com.intellij.properties"))
}
  • plugin.xml
<depends>com.intellij.properties</depends>

经过上述配置后,我们就可以很方便地去处理properties文件了。

如果对这里的配置有疑问,建议先看一下本专栏中讲解 PSI 的部分,在 IntelliJ 插件开发中如果想去处理某种语言文件,除了 XML 这种内置的语言,其他都是需要引入相应的插件。

然后是继承FoldingBuilderEx类,并实现其中的方法:

class UnicodeFoldBuilder: FoldingBuilderEx() {override fun buildFoldRegions(root: PsiElement, document: Document, quick: Boolean) =// 对 properties 文件中的键值对进行遍历(root as? PropertiesFile)?.properties?.filter {// 只保留键值非空并且包含 Unicode 字符的键值对it.value != null && it.key != null && containsUnicodeEscapeSequence(it.value!!)}?.map {// 获取折叠区域,这里只截取键值对中的值部分val startOffset = it.psiElement.startOffset + it.key!!.length + 1val endOffset = startOffset + it.value!!.lengthFoldingDescriptor(it.psiElement.node, TextRange(startOffset, endOffset))}?.toTypedArray() ?: emptyArray()/*** 用于判断字符串中是否包含 Unicode 编码过的字符*/private fun containsUnicodeEscapeSequence(str: String) =Regex("\\\\u[0-9a-fA-F]{4}").containsMatchIn(str)/*** 将 Unicode 编码的字符进行反编码* 这里只对键值对中的值进行反编码,通过截取原始文本中 = 后的内容*/override fun getPlaceholderText(node: ASTNode) = decodeUnicode(node.text.substring(node.text.indexOf("=") + 1))/*** 用于将字符串转为 Unicode 编码*/private fun decodeUnicode(input: String) = input.replace("\\\\u([0-9a-fA-F]{4})".toRegex()){it.groupValues[1].toInt(16).toChar().toString()}/*** 默认将符合条件的文本进行折叠*/override fun isCollapsedByDefault(node: ASTNode) = true}

这里直接参照代码和相应的注释不难理解,其中buildFoldRegionsgetPlaceholderTextisCollapsedByDefault三个是我们重写的方法,buildFoldRegions方法用于收集所有的折叠块区域,getPlaceholderText用于设置折叠块的预览文本,isCollapsedByDefault用于设置默认对符合条件的文本进行折叠。

最后在plugin.xml中进行配置:

<lang.foldingBuilderlanguage="Properties"implementationClass="cn.butterfly.unicode.fold.UnicodeFoldBuilder"/>

经过以上配置后,就已经实现了 Unicode 字符折叠预览的功能,不过对于刚编写的内容,还是没办法实现对 Unicode 字符进行折叠,因此这里再增加一个 Action 实现手动对 Unicode 字符进行折叠:

class UnicodeAction: AnAction() {override fun actionPerformed(e: AnActionEvent) {ActionManager.getInstance().getAction("CollapseRegion").actionPerformed(e)}}

其实平台默认也已经为我们提供了相应的功能,在编辑器中也可以通过右键菜单中的选择来手动对代码块进行折叠和展开:

image-20240413210823687

总结

本文介绍了如何通过 IntelliJ 提供的接口来实现对 Unicode 字符折叠预览的功能,整体实现方式也比较简单,下一篇文章将会介绍如何开发主题。

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

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

相关文章

阿里云服务器可以干嘛 阿里云服务器应用场景有哪些

阿里云服务器可以干嘛&#xff1f;能干啥你还不知道么&#xff01;简单来讲可用来搭建网站、个人博客、企业官网、论坛、电子商务、AI、LLM大语言模型、测试环境等&#xff0c;阿里云百科aliyunbaike.com整理阿里云服务器的用途&#xff1a; 阿里云服务器活动 aliyunbaike.com…

MySQL单行函数

文章目录 数值函数基本函数角度与弧度互换函数三角函数指数与对数进制间的转换 字符串函数日期和时间函数获取日期、时间日期与时间戳的转换获取月份、星期、星期数、天数等函数日期的操作函数时间和秒钟转换的函数计算日期和时间的函数日期的格式化与解析 流程控制函数加密与解…

NetSuite 销售订单页面选择客户后停滞问题研究

随着用户环境中定制内容的增加&#xff0c;用户会发现Sales Order中选择Customer时的页面停滞时间会变长。这让用户感到很疑惑。 我们初步研究了一下这个问题&#xff0c;两个变量比较显著&#xff1a; •Form的页签数量•脚本的挂载数量 试验数据 1. 多页签&#xff0c;无…

点云语义分割:使用Cylinder3D训练SemanticKITTI数据集

点云语义分割:使用Cylinder3D训练SemanticKITTI数据集 一、环境二、数据准备3、训练4、测试5、可视化 一、环境 系统&#xff1a;Ubuntu18 Pytorch&#xff1a;1.5.0 GPU&#xff1a;Tesla V100 cuda&#xff1a;10.2 代码: Cylinder3D 二、数据准备 下载semanticKITTI数据集…

数据结构课程设计(八)---排序算法比较 [排序]

1.8.1 题目内容 1.8.1-A [问题描述] 利用随机函数产生10个样本&#xff0c;每个样本有50000个随机整数&#xff08;并使第一个样本是正序&#xff0c;第二个样本是逆序&#xff09;&#xff0c;利用直接插入排序、希尔排序&#xff0c;冒泡排序、快速排序、选择排序、堆排序&a…

wife_wife-攻防世界

题目 注册发现可以注册管理员,但是好像有条件 抓包试试 没思路了 看看其他师傅的wp&#xff0c;用到 js 原型链污染攻击 Nodejs原型链污染攻击基础知识 | Savants Blog (lxscloud.top) 网站后端是Node.js搭建的 原型链污染 简单来讲&#xff0c;通过 newUser.__proto__ …

是的,本科毕业八年,我考研了

今天&#xff0c;是一篇纯分享文。 是的&#xff0c;本科毕业八年&#xff0c;我考研了。 停更10个月&#xff0c;历时296天&#xff0c;我考研上岸了。 小伙伴们&#xff0c;好久不见。 一 发今年第一篇文章的时候刚处理完后续事宜&#xff0c;就简单说了句&#xff0c;后台…

将Visio绘图导出PDF文件,使其自适应大小,并去掉导入Latex的边框显示

问题描述 将Visio绘图导成pdf文件&#xff0c;首先在Visio绘图如下&#xff1a; 如果直接导出或者另存为pdf文件&#xff0c;则会发现pdf文件是整个页面大小&#xff0c;而不是图片大小。而且在导入latex等排版工具现实时&#xff0c;会显示边框。 问题解决 1.调整Visio中的页…

【央国企专场】——国家电网

国家电网目录 一、电网介绍1、核心业务2、电网组成 二、公司待遇三、公司招聘1、招聘平台2、考试安排2.3 考试内容 一、电网介绍 1、核心业务 国家电网公司&#xff08;State Grid Corporation of China&#xff0c;简称SGCC&#xff09;是中国最大的国有企业之一&#xff0c…

4. Django 探究FBV视图

4. 探究FBV视图 视图(Views)是Django的MTV架构模式的V部分, 主要负责处理用户请求和生成相应的响应内容, 然后在页面或其他类型文档中显示. 也可以理解为视图是MVC架构里面的C部分(控制器), 主要处理功能和业务上的逻辑. 我们习惯使用视图函数处理HTTP请求, 即在视图里定义def…

C++教学PPT:基础算法之分治算法

公众号&#xff1a;编程驿站 综合练习&#xff1a; 分治算法很有哲学蕴味&#xff1a;老祖宗所言 合久必分&#xff0c;分久必合&#xff0c;分开地目的是为了更好的合并。分治算法的求解流程&#xff1a;分解问题&#xff1a;将一个需要解决的、看起很复…

TSINGSEE青犀AI智能分析网关V4叉车载货出入库检测算法介绍及应用

随着物流行业的快速发展&#xff0c;叉车作为物流运输的重要设备&#xff0c;其安全性和效率性越来越受到人们的关注。然而&#xff0c;在实际操作中&#xff0c;由于人为因素和操作环境的复杂性&#xff0c;叉车事故时有发生&#xff0c;给企业和个人带来了巨大的损失。为了提…