• IntelliJ Plugin开发 (二) 获取编辑器上选中的文本以及使用通知和消息框显示


    官方文档 IDE Plugin SDK Doc

    JDK版本: 17
    IDEA版本: IU-2022.2.1
    Gradle版本:7.5
    编程语言:Java和kotlin


    关联文章

    一、创建一个编辑器上的右键菜单


    接上一篇创建博文,我们已经创建好了一个名为在Web中搜索的菜单,现在我们需要点击它后,获取到编辑器选中的内容,并进行展示

    博文最下面贴了这篇博文的代码,直接拉到下面复制粘贴就完了

    此文内容再于体现 消息弹窗以及通知的使用方法

    获取编辑器上选中的内容

    要获取到选中的内容,首先我们需要先获取到编辑器对象

    fun getEditor(e: AnActionEvent): Editor {
         return e.getRequiredData(CommonDataKeys.EDITOR);
    }
    
    • 1
    • 2
    • 3

    上方是封装的一个小方法,最主要的还是 e.getRequiredData(CommonDataKeys.EDITOR)
    e:AnActionEvent 我们知道是什么参数,接上一篇创建的AnAction,在重写的 actionPerformed方法中传过来的一个参数事件

    class TranslateAction : AnAction(){
        override fun actionPerformed(e: AnActionEvent) {
            //Todo...
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5

    getRequiredData(CommonDataKeys.EDITOR)我们是第一次见到,这种情况下,我们先点进去这个方法,看看它的注释和结构然后再进行下一步

    
      public @Nullable <T> T getData(@NotNull DataKey<T> key) {
        return getDataContext().getData(key);
      }
    
      /**
       * Returns not null data by a data key. This method assumes that data has been checked for {@code null} in {@code AnAction#update} method.
       * 

    * Example of proper usage: * *
       *
       * public class MyAction extends AnAction {
       *   public void update(AnActionEvent e) {
       *     // perform action if and only if EDITOR != null
       *     boolean enabled = e.getData(CommonDataKeys.EDITOR) != null;
       *     e.getPresentation().setEnabled(enabled);
       *   }
       *
       *   public void actionPerformed(AnActionEvent e) {
       *     // if we're here then EDITOR != null
       *     Document doc = e.getRequiredData(CommonDataKeys.EDITOR).getDocument();
       *     doSomething(doc);
       *   }
       * }
       *
       * 
    */
    public @NotNull <T> T getRequiredData(@NotNull DataKey<T> key) { T data = getData(key); assert data != null; return data; }
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    通过看代码可以发现,他上面还有一个getData的方法,再和 getRequiredData 一对比,可以看出来,getRequiredData是调用了getData()后判断是不是null,注释上说了 这个是通过一个key来获取到一个非空的值,而且还附带了示例,我们先不关心 getData中的 getDataContext()

    看例子上写了获取编辑器对象的方法

    boolean enabled = e.getData(CommonDataKeys.EDITOR) != null;
    
    • 1

    可以看到有个 CommonDataKeys.EDITOR ,这说明编辑器的key就是这个,我们先忽略这个,接着往下进行我们的目的,通过这个key我们可以拿到一个 Editor的对象

    既然都拿到了 编辑器对象,那么找到它选择的文本就很轻松了,接下来看Editor的方法,找下关键词 Select

    在这里插入图片描述
    看到了一个 SelectionModel的方法,然后看上方注释(用百度翻译一下🤦‍)

    /**
    *返回编辑器的选择模型,可用于在
    *文档并检索有关选择的信息。
    *

    *要查询或更改特定插入符号的选择,应使用{@link-CaretModel}接口。 * *@返回选择模型实例。 *@请参阅#getCaretModel() */

    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    可以用在文档并检索有关的选择信息,这句话一出,不就有谱了嘛,然后我们在看它返回的这个 SelectionModel接口,然后就开始找呗,看看哪个是我们要的
    在这里插入图片描述
    然后这不就找到了咩,接下来我们就调用这个方法,看看能不能获取到选择的内容

    e.getRequiredData(CommonDataKeys.EDITOR).selectionModel.selectedText;
    
    • 1

    在这里插入图片描述
    让它打印出来,开始调试 (忽略报错…emmmm…)
    在这里插入图片描述
    拿到了编辑器选择的内容后,我们可以开始下一步操作了,用消息框和通知显示

    使用消息框进行弹出内容

    这个弹出框

    Messages.showMessageDialog(
    	e.project,
    	e.getRequiredData(CommonDataKeys.EDITOR).selectionModel.selectedText , 
    	"选中的内容",
     	Messages.getInformationIcon()
    );
    // Messages.getInformationIcon() 获取一个 info通知的图标,其他类型的图标也在这个类里
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    在这里插入图片描述
    但是我发现个问题哈,如果选中的是整个标签。。。弹出的内容就是空白的了,得试下如果 queue标签里面有内容看看弹出的啥
    在这里插入图片描述
    下图是 在queue标签里面加了文字的效果
    在这里插入图片描述
    好家伙,又摸索出一个坑。。。。。

    使用通知接口弹出内容

    首先我们要先在Plugin.xml中注册一个通知Group

    <extensions defaultExtensionNs="com.intellij">
        <notificationGroup id="ts.notice" displayType="BALLOON"/>    
    extensions>
    
    • 1
    • 2
    • 3

    然后开始写代码

    NotificationGroupManager.getInstance()
                                    .getNotificationGroup("ts.notice")
                                    .createNotification("弹出的内容", NotificationType.ERROR(弹出一个错误类型的通知,其他类型的可以看这个 type里面的))
                                    .notify(project);
    
    • 1
    • 2
    • 3
    • 4

    最后面的notify中要填一个 Project ,这个类型大概是在哪个项目(idea)中弹出吧,可以使用

    //AnActionEvent 
    e.project
    
    • 1
    • 2

    然后我们看下显示的效果

     NotificationGroupManager.getInstance()
                .getNotificationGroup("ts.notice")
                .createNotification(e.getRequiredData(CommonDataKeys.EDITOR).selectionModel.selectedText.toString(), NotificationType.ERROR)
            .notify(e.project);
    
    • 1
    • 2
    • 3
    • 4

    在这里插入图片描述
    这个通知和上面消息框一样。。。如果弹出的内容是标签的话,也是不显示

    还有一种写法是,不过这种被打上了弃用标签
    @Deprecated(“Use com.intellij.notification.impl.NotificationGroupEP and com.intellij.notification.NotificationGroupManager”)
    👇👇👇

    var notify: NotificationGroup =
                    NotificationGroup(id, NotificationDisplayType.BALLOON, true);
                notify.createNotification(con, NotificationType.ERROR).notify(p);
    
    • 1
    • 2
    • 3

    完事,总结一下就是 获取编辑器对象,获取Project,获取编辑器选中文本, 消息框怎么用,通知怎么用

    获取选中文本

    e.getRequiredData(CommonDataKeys.EDITOR).selectionModel.selectedText;
    
    • 1

    消息框

    Messages.showMessageDialog(
    	e.project,
    	e.getRequiredData(CommonDataKeys.EDITOR).selectionModel.selectedText , 
    	"选中的内容",
     	Messages.getInformationIcon()
    );
    // Messages.getInformationIcon() 获取一个 info通知的图标,其他类型的图标也在这个类里
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    通知

    <extensions defaultExtensionNs="com.intellij">
        <notificationGroup id="ts.notice" displayType="BALLOON"/>    
    extensions>
    
    • 1
    • 2
    • 3
    NotificationGroupManager.getInstance()
                                    .getNotificationGroup("ts.notice")
                                    .createNotification("弹出的内容", NotificationType.ERROR(弹出一个错误类型的通知,其他类型的可以看这个 type里面的))
                                    .notify(project);
    
    • 1
    • 2
    • 3
    • 4

    最后挂上代码示例的仓库地址

    插件主要是写来自己用,所以都是写自己会用到的功能😂 (烂代码最后的挣扎,我自己用的…能用就行,功能出来就行)

    仓库地址

  • 相关阅读:
    Vmware Workstation安装说明
    2023腾讯云标准型S5云服务器简单测评,比较值!
    【嵌入式基础】内存(Cache,RAM,ROM,Flash)
    qt中控件的使用函数
    MongoDB的日志目录被删除了,导致无法启动:(code=exited, status=1/FAILURE)
    基于PHP+MySQL音乐网站的设计与实现
    kaptcha验证码组件用法
    无胁科技-TVD每日漏洞情报-2022-11-11
    SpringBoot2.0(Spring读取配置文件常用方法,打war包在Tomcat中启动)
    Ubuntu14.04 gtest+gcov+lcov/gcovr简单使用
  • 原文地址:https://blog.csdn.net/qq_32447361/article/details/126838799