IntelliJ IDEA插件开发-代码补全插件入门开发

使用IntelliJ IDEA想必大家都有使用过代码自动补全功能,如输入ab,会自动触发补全,提供相应的补全建议列表。作为有追求的程序员,有没有想过这样的功能是如何实现的?本节将详细介绍如何实现一个类似的代码自动补全插件。

23d2ca156cdcee391806834781b2f474.jpeg

在IntelliJ IDEA插件开发中,CompletionContributor是一个关键的API,它允许开发者为特定语言的代码编辑器添加代码补全功能。本节将详细介绍如何使用CompletionContributor实现代码补全功能,并提供完整的示例代码和解释,理解如何使用该API来创建一个简单的代码补全插件。

一.环境准备

为了确保项目的兼容性,本章节使用以下版本:

  • IntelliJ IDEA: 2020.1.4

  • JDK: 1.8

  • Gradle: 6.1

如果不知道如何搭建IntelliJ IDEA插件开发环境,请阅读【IntelliJ IDEA插件开发-开发环境搭建】章节内容。

二.CompletionContributor介绍

CompletionContributor 是一个IntelliJ IDEA插件API的类,它允许开发者定义代码补全的行为。通过继承CompletionContributor,可以设置触发补全的条件和提供相应的补全建议。这些补全建议会在编辑器中显示,帮助开发者快速编写代码。

代码补全的两种主要类型:
  • Basic Completion:标准的代码补全,一般会在用户输入时自动显示选项。

  • Smart Completion:根据上下文提供更为智能的代码补全。

本篇将实现一个基本的代码补全功能。

三.新建项目

首先,在IntelliJ IDEA中创建一个新的插件项目,并进行基础设置。

  1. 创建插件项目:打开IntelliJ IDEA,选择Create New Project。

    8722b624f57e5a9207b1abe7f63a3a25.jpeg

  2. 填写项目基本信息:这里随意命名。

    4070ebe2d239299ca8e2213bed837bb0.jpeg

  3. 修改org.jetbrains.intellij插件版本:如果默认生成的build.gradle文件中Gradle版本和org.jetbrains.intellij插件版本不兼容导致Build窗口输出报错,打开build.gradle文件将org.jetbrains.intellij版本改为0.7.3即解决。Gradle版本和org.jetbrains.intellij插件兼容版本,请至gradle-intellij-plugin插件的releases页面查看。

    c9629137f2714edf39315ee92d4643da.png

四.编写插件代码

在这个步骤中,将编写CompletionContributor子类来定义补全的逻辑。

步骤 1:创建CompletionContributor子类

在src/main/java下创建MyCompletionContributor.java文件,并让它继承CompletionContributor。

d7c4c009dc80954346c6c22d572bb847.png

代码解读:
  1. CompletionType.BASIC:指定为基本补全类型。

  2. PlatformPatterns.psiElement():匹配所有的PsiElement(表示源代码中的元素),即允许插件在所有位置触发补全。

  3. addCompletions 方法:定义补全的内容。resultSet.addElement用于添加选项。在这里,我们简单地添加了两个字符串 "HelloWorld" 和 "HelloPlugin" 作为补全建议。

步骤 2:注册CompletionContributor

在plugin.xml中注册MyCompletionContributor类。

b25ec740f4fe7d970afab077278eaecb.png

language="JAVA"表示我们的补全功能将应用于Java语言。

五.测试插件

  1. 运行插件:在IntelliJ IDEA中选择 Run > Run 'Plugin'。

  2. 打开测试项目:在弹出的新窗口中打开或新建一个项目。

  3. 测试补全:在Java文件中输入任意字符,例如"H"或者"Hell",你会看到"HelloWorld"和"HelloPlugin" 出现在候选项列表中,通过上下键可选择,回车自动选中并替换

    fe23f786aad8ee0d953cf154acfd5581.jpeg


六.动态补全

目前实现了一个简单的代码补全,接下来进行一些改进,实现可根据上下文进行动态补全。大家都用过IntelliJ IDEA中的属性自动提示补全功能,如下图。

e7d5e1050f45249e141ecdbee2b66195.jpeg

接下来将实现一个类似的功能,根据定义的属性实现动态补全,代码调整如下:

c48e7773cc44facdee86c988fd364b25.png

如果你使用以上代码你会发现它编译报错,找不到PsiVariable和PsiTreeUtil,这是因为它需要用到IntelliJ Platform Plugin SDK进行编译,点击菜单栏的 File -> Project Structure -> Project Settings -> Project -> Project SDK ,选择IntelliJ Platform Plugin SDK版本。如果未设置过IntelliJ Platform Plugin SDK,请阅读【IntelliJ IDEA插件开发-开发环境搭建】章节内容。

bd8906e41dcb0f227b62266e5af1950b.jpeg

设置完IntelliJ Platform Plugin SDK后,此时编译不会报错了,但如果想跑起来需要在plugin.xml中添加对 com.intellij.modules.java 的依赖,这是因为PsiVariable是Java相关的类,同时还需要在build.gradle文件中增加Java插件依赖,确保项目在构建时包含Java插件所需的依赖项, build.gradle完整代码如下:

1eab45fd5bc02e10e02cfef95cbf5269.png

plugin.xml代码如下:

c38dc674f388ab686483b865f4a6c7eb.png

接下来运行插件:选择Run > Run 'Plugin',代码运行效果如下:

e4953a0bb1e54b78dc2be9ad4f8c4eb8.jpeg

如果你想实现右侧的文字“我是动态生成的”换成对应变量的数据类型,可以使用variable.getType().getPresentableText()替换,通过PsiVariable获取类型,具体代码如下:

46c78b2e5065aee0c1af11a8d3abec18.png

LookupElementBuilder 是IntelliJ IDEA插件开发API中的一个核心类,用于构建代码补全建议的展示。以下是 LookupElementBuilder 类中一些常用且实用的方法:

  1. create(String lookupString)

  • 这是静态方法,用于生成包含补全字符串的基础 LookupElementBuilder 对象。

  • 示例:LookupElementBuilder.create("myCompletionItem")

withTypeText(String typeText)

  • 在补全建议右侧显示类型信息或描述性文本,通常用来标注该项的类型或来源。

  • 示例:withTypeText("int") 会在补全项右侧显示“int”文本。

withIcon(Icon icon)

  • 为补全项添加图标。通常用于在补全项左侧添加图标,比如类、方法或变量的图标。

  • 示例:withIcon(AllIcons.Nodes.Method)。

withTailText(String tailText, boolean grayed)

  • 在补全项后添加附加文本,例如参数或其他信息。grayed 参数表示文本是否显示为灰色。

  • 示例:withTailText("(param1, param2)", true) 在补全项后以灰色显示 (param1, param2)。

bold()

  • 让补全项的显示文本加粗。适合用于推荐性较高或特别重要的选项。

  • 示例:bold()。

withInsertHandler(InsertHandler<? super LookupElement> handler)

  • 定义插入操作的处理逻辑,例如在选择补全项后添加括号、光标移动等操作。

  • 示例:withInsertHandler((context, item) -> { /* 插入处理逻辑 */ })。

withPresentableText(String presentableText)

  • 自定义补全项的显示文本,不改变实际插入的内容。适合用在用户看到的内容和实际插入内容不同的场景。

  • 示例:withPresentableText("displayedText")。

withAutoCompletionPolicy(AutoCompletionPolicy policy)

  • 控制自动补全策略。可以设置为 AutoCompletionPolicy.ALWAYS_AUTOCOMPLETE,使该项在自动补全时直接插入。

  • 示例:withAutoCompletionPolicy(AutoCompletionPolicy.ALWAYS_AUTOCOMPLETE)。

withPriority(double priority)

  • 设置补全项的优先级,优先级越高的项将显示在补全列表的顶部。

  • 示例:withPriority(10.0)。

withCaseSensitivity(boolean caseSensitive)

  • 设置补全项是否区分大小写。适用于特定语言或环境要求区分大小写的情况。

  • 示例:withCaseSensitivity(false)。

这些方法可以配合使用,使补全建议更符合用户预期并提升用户体验。

本节实现了一个基础的代码补全功能,并展示了如何使用CompletionContributor来扩展和定制补全行为。完成插件开发后,你可以进一步扩展补全功能,实现更复杂的逻辑,满足实际项目需求。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

❤React-React 组件基础(类组件)

❤React-React 组件基础 1、组件化开发介绍 组件化开发思想&#xff1a;分而治之 React的组件按照不同的方式可以分成类组件&#xff1a; 划分方式一&#xff08;按照组件的定义方式&#xff09; 函数组件(Functional Component )和类组件(Class Component)&#xff1b; …

Python →爬虫实践

爬取研究中心的书目 现在&#xff0c;想要把如下网站中的书目信息爬取出来。 案例一 耶鲁 Publications | Yale Law School 分析网页&#xff0c;如下图所示&#xff0c;需要爬取的页面&#xff0c;标签信息是“<p>”&#xff0c;所以用 itemssoup.find_all("p&…

机器学习: LightGBM模型(优化版)——高效且强大的树形模型

LightGBM&#xff08;Light Gradient Boosting Machine&#xff09;是一种基于梯度提升决策树&#xff08;GBDT&#xff09;的框架&#xff0c;由微软提出。它具有高效的训练速度、低内存占用、支持并行和GPU加速等特点&#xff0c;非常适合大规模数据的训练任务&#xff0c;尤…

《内存函数》

内存函数 1. memcpy函数 &#xff08;1&#xff09;介绍 这里通过memcpy的定义我们可以看这个函数包含三个参数&#xff0c;destination就是拷贝的目的地&#xff0c;source就是拷贝的源头&#xff0c;num就是拷贝的个数。 &#xff08;2&#xff09;使用 这里要包含头文件s…

不泄密的安全远程控制软件需要哪些技术

在数字化浪潮中&#xff0c;远程控制软件已不再是简单的辅助工具&#xff0c;而是成为企业运作和日常工作中不可或缺的一部分。随着远程办公模式的广泛采纳&#xff0c;这些软件提供了一种既安全又高效的途径来管理和访问远端系统。无论是在家办公、技术支持还是远程教育&#…

Pycharm打开终端时报错:Cannot open Local,Failed to start[powershell.exe]

问题如下&#xff1a; 解决办法&#xff1a; 修改设置中的shell path路径 英文版pycharm&#xff1a;file -> settings -> Tools -> Terminal -> Shell path 中文版pycharm&#xff1a;文件 -> 设置 -> 工具 -> 终端 -> Shell路径 将Shell路径不全 …

15分钟学 Go 第 51 天 :通用库与工具使用

第51天&#xff1a;通用库与工具使用 一、学习目标 类别工具/库用途命令行工具cobra构建命令行应用JSON处理gjson高效JSON解析HTTP客户端restyHTTP请求处理日期处理carbon时间日期操作配置管理viper配置文件处理 二、详细实现 让我们通过具体示例来学习这些库的使用&#x…

基于微信小程序的乡村研学游平台设计与实现,LW+源码+讲解

摘 要 信息数据从传统到当代&#xff0c;是一直在变革当中&#xff0c;突如其来的互联网让传统的信息管理看到了革命性的曙光&#xff0c;因为传统信息管理从时效性&#xff0c;还是安全性&#xff0c;还是可操作性等各个方面来讲&#xff0c;遇到了互联网时代才发现能补上自…

VLC-QT----Linux编译并运行示例

linux:ubuntu 16.04 qt:5.13.2 总体安装步骤 下载安装,编译 下载源码仓库,下载cmake,新建一个build文件夹,cd进去,执行代码 cmake .. -DCMAKE_BUILD_TYPEDebug 遇到报错,没有qt5Coreconfig,运行 sudo apt-get install qtdeclarative5-dev进行安装 遇到报错 Could not fi…

机器学习:XGBoost模型——高效且强大的树形模型

XGBoost&#xff08;Extreme Gradient Boosting&#xff0c;极端梯度提升树&#xff09;是一种强大的梯度提升算法&#xff0c;在现实中被广泛用于分类和回归任务。它通过集成多个简单的基学习器&#xff08;通常是决策树&#xff09;来构建一个强大的预测模型。 基本原理步骤…

爬虫开发工具与环境搭建——开发工具介绍

第二章&#xff1a;爬虫开发工具与环境搭建 第一节 开发工具介绍 爬虫开发需要一些合适的工具和框架来高效地抓取网页数据。在这节中&#xff0c;我们将介绍常用的开发工具&#xff0c;帮助开发者快速搭建爬虫开发环境。 1. Python与爬虫框架选择 Python因其简洁、易学的语法…

python高级之面向对象编程

一、面向过程与面向对象 面向过程和面向对象都是一种编程方式&#xff0c;只不过再设计上有区别。 1、面向过程pop&#xff1a; 举例&#xff1a;孩子上学 1. 妈妈起床 2. 妈妈洗漱 3. 妈妈做饭 4. 妈妈把孩子叫起来 5. 孩子起床 6. 孩子洗漱 7. 孩子吃饭 8. 妈妈给孩子送学校…

通过Docker实现openGauss的快速容器化安装

容器安装 本章节主要介绍通过 Docker 安装 openGauss&#xff0c;方便 DevOps 用户的安装、配置和环境设置。 支持的架构和操作系统版本 x86-64 CentOS 7.6 ARM64 openEuler 20.03 LTS 配置准备 使用 buildDockerImage.sh 脚本构建 docker 镜像&#xff0c;buildDockerIm…

康谋分享 | 确保AD/ADAS系统的安全:避免数据泛滥的关键

为确保AD/ADAS系统的安全性&#xff0c;各大车企通常需要收集、处理和分析来自于摄像头、激光雷达等传感器的数据&#xff0c;以找出提高系统安全性和性能的方法。然而在数据收集过程中&#xff0c;不可避免地会出现大量无价值数据&#xff0c;造成数据泛滥的情况&#xff0c;进…

电工电子原理笔记

这一篇手记会记录我硬件开发过程中遇到的一些底层电学原理&#xff0c;并且结合实际场景作为“例题”&#xff08;出于篇幅和保密考虑会进行部分简化&#xff09;。 叠加定理 基本介绍 在线性电路中&#xff0c;任一支路的电流&#xff08;或电压&#xff09;可以看成是电路…

【赵渝强老师】MySQL InnoDB的段、区和页

MySQL的InnoDB存储引擎的逻辑存储结构和Oracle大致相同&#xff0c;所有数据都被逻辑地存放在一个空间中&#xff0c;我们称之为表空间&#xff08;tablespace&#xff09;。表空间又由段&#xff08;segment&#xff09;、区&#xff08;extent&#xff09;、页&#xff08;pa…

Python 继承笔记

知识点&#xff1a; 1.has a 一个类中使用了另外一种自定义类的类型 student 使用computer book 2.类型 系统类型 str,int,float,list,tuple,dic,set 自定义类型 算是自定义的类&#xff0c;都可以将其当成一种类型 student是一种类型 sStudent() s是Student的类型 class Stud…

Vue3 -- 项目配置之husky【企业级项目配置保姆级教程4】

引言&#xff1a; eslint&#xff1a;代码规范校验prettier&#xff1a;代码格式化stylelint&#xff1a;CSS代码校验 上述三篇文章集成配置完成代码校验工具&#xff0c;当时需要每次手动的去执行命令才会格式化我们的代码。。如果有人没有格式化就提交了远程仓库&#xff0…

万字长文分析函数式编程

目录 一.认识函数式编程 一、函数式编程的定义 二、函数式编程的思想 三、函数式编程的特点 四、函数式编程的应用 二.Lambda表达式 三.Stream流 3.1 创建流对象 3.2 注意事项 3.3 Stream流的中间操作 filter map distinct sorted limit skip flatMap 3.4 St…

移植 AWTK 到 纯血鸿蒙 (HarmonyOS NEXT) 系统 (8) - 原生输入法

AWTK 在嵌入式平台使用内置的输入法&#xff0c;在移动设备上使用系统的原生输入法。在 AWTK-Android 和 AWTK-IOS 中&#xff0c;使用的是 SDL 封装之后的系统原生输入法。在 AWTK-HarmonyOS 中&#xff0c;要使用系统的原生输入法。需要实现 input_method 接口&#xff1a; 1…