官方文档 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);
}
上方是封装的一个小方法,最主要的还是 e.getRequiredData(CommonDataKeys.EDITOR)
e:AnActionEvent 我们知道是什么参数,接上一篇创建的AnAction,在重写的 actionPerformed方法中传过来的一个参数事件
class TranslateAction : AnAction(){
override fun actionPerformed(e: AnActionEvent) {
//Todo...
}
}
而 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;
}
通过看代码可以发现,他上面还有一个getData的方法,再和 getRequiredData 一对比,可以看出来,getRequiredData是调用了getData()后判断是不是null,注释上说了 这个是通过一个key来获取到一个非空的值,而且还附带了示例,我们先不关心 getData中的 getDataContext()
看例子上写了获取编辑器对象的方法
boolean enabled = e.getData(CommonDataKeys.EDITOR) != null;
可以看到有个 CommonDataKeys.EDITOR ,这说明编辑器的key就是这个,我们先忽略这个,接着往下进行我们的目的,通过这个key我们可以拿到一个 Editor的对象
既然都拿到了 编辑器对象,那么找到它选择的文本就很轻松了,接下来看Editor的方法,找下关键词 Select

看到了一个 SelectionModel的方法,然后看上方注释(用百度翻译一下🤦)
/**
*返回编辑器的选择模型,可用于在
*文档并检索有关选择的信息。
*
*要查询或更改特定插入符号的选择,应使用{@link-CaretModel}接口。
*
*@返回选择模型实例。
*@请参阅#getCaretModel()
*/
可以用在文档并检索有关的选择信息,这句话一出,不就有谱了嘛,然后我们在看它返回的这个 SelectionModel接口,然后就开始找呗,看看哪个是我们要的

然后这不就找到了咩,接下来我们就调用这个方法,看看能不能获取到选择的内容
e.getRequiredData(CommonDataKeys.EDITOR).selectionModel.selectedText;

让它打印出来,开始调试 (忽略报错…emmmm…)

拿到了编辑器选择的内容后,我们可以开始下一步操作了,用消息框和通知显示
这个弹出框
Messages.showMessageDialog(
e.project,
e.getRequiredData(CommonDataKeys.EDITOR).selectionModel.selectedText ,
"选中的内容",
Messages.getInformationIcon()
);
// Messages.getInformationIcon() 获取一个 info通知的图标,其他类型的图标也在这个类里

但是我发现个问题哈,如果选中的是整个标签。。。弹出的内容就是空白的了,得试下如果 queue标签里面有内容看看弹出的啥

下图是 在queue标签里面加了文字的效果

好家伙,又摸索出一个坑。。。。。
首先我们要先在Plugin.xml中注册一个通知Group
<extensions defaultExtensionNs="com.intellij">
<notificationGroup id="ts.notice" displayType="BALLOON"/>
extensions>
然后开始写代码
NotificationGroupManager.getInstance()
.getNotificationGroup("ts.notice")
.createNotification("弹出的内容", NotificationType.ERROR(弹出一个错误类型的通知,其他类型的可以看这个 type里面的))
.notify(project);
最后面的notify中要填一个 Project ,这个类型大概是在哪个项目(idea)中弹出吧,可以使用
//AnActionEvent
e.project
然后我们看下显示的效果
NotificationGroupManager.getInstance()
.getNotificationGroup("ts.notice")
.createNotification(e.getRequiredData(CommonDataKeys.EDITOR).selectionModel.selectedText.toString(), NotificationType.ERROR)
.notify(e.project);

这个通知和上面消息框一样。。。如果弹出的内容是标签的话,也是不显示
还有一种写法是,不过这种被打上了弃用标签
@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);
完事,总结一下就是 获取编辑器对象,获取Project,获取编辑器选中文本, 消息框怎么用,通知怎么用
e.getRequiredData(CommonDataKeys.EDITOR).selectionModel.selectedText;
Messages.showMessageDialog(
e.project,
e.getRequiredData(CommonDataKeys.EDITOR).selectionModel.selectedText ,
"选中的内容",
Messages.getInformationIcon()
);
// Messages.getInformationIcon() 获取一个 info通知的图标,其他类型的图标也在这个类里
<extensions defaultExtensionNs="com.intellij">
<notificationGroup id="ts.notice" displayType="BALLOON"/>
extensions>
NotificationGroupManager.getInstance()
.getNotificationGroup("ts.notice")
.createNotification("弹出的内容", NotificationType.ERROR(弹出一个错误类型的通知,其他类型的可以看这个 type里面的))
.notify(project);
插件主要是写来自己用,所以都是写自己会用到的功能😂 (烂代码最后的挣扎,我自己用的…能用就行,功能出来就行)