intellij-plugin - IntelliJ 插件中具有标准 PsiElement 自动完成功能的文本字段

标签 intellij-plugin

我正在尝试为我的 IntelliJ 插件创建一个带有自动完成功能的简单文本字段。我认为这应该很简单,但到目前为止我已经陷入了死胡同......

例如。据我了解,这应该有效:

EditorTextField format = new TextFieldWithCompletion(currentEditor.getProject(),
                provider,
                "",
                true,
                true,
                true);

问题是提供者。我希望看到一个不是列表提供者的提供者。我只想显示与编辑器光标中当前行匹配的完成,所以我想要完整的完成对话框,而不仅仅是一个简短的选项列表。

我也看了TextFieldWithAutoCompletion但它似乎是为硬编码字符串值而不是自由格式完成而设计的。

我只想要标准的 Java/Kotlin 完成。不是自定义列表或类似的东西。我看到了一些关于替换文本字段文档的讨论,但我也无法让它工作。我有一个 PsiExpressionCodeFragment并且希望有一个完成提供者接受它,但我找不到它。

作为引用,我想做的是与断点对话框中的条件语句非常相似的事情。

另一种方法说明here是:

JavaCodeFragmentFactory jcff = JavaCodeFragmentFactory.getInstance(currentEditor.getProject());
PsiFile pf = PsiDocumentManager.getInstance(currentEditor.getProject()).getPsiFile(currentEditor.getDocument());
PsiElement psiElement = pf.findElementAt(currentEditor.getCaretModel().getOffset());
PsiExpressionCodeFragment fragment = jcff.createExpressionCodeFragment("", psiElement,null, false);
EditorTextField f = new EditorTextField(PsiDocumentManager.getInstance(currentEditor.getProject()).getDocument(fragment),
        currentEditor.getProject(),
        FileTypes.PLAIN_TEXT, false, true);

这会加载 UI,但无论我输入什么都不会弹出代码完成。

最佳答案

诀窍是创建一个包含 Document 实例的编辑器。 .并且这个文档引用了一种语言和一个 psi 元素上下文:

JPanel panel = new JPanel();

// Just detect an element under caret for context
PsiFile psiFile = PsiDocumentManager.getInstance(editor.getProject()).getPsiFile(editor.getDocument());
PsiElement element = psiFile.findElementAt(editor.getCaretModel().getOffset());

PsiExpressionCodeFragment code = JavaCodeFragmentFactory.getInstance(editor.getProject()).createExpressionCodeFragment("", element, null, true);
Document document = PsiDocumentManager.getInstance(editor.getProject()).getDocument(code);

EditorTextField myInput = new EditorTextField(document, editor.getProject(), JavaFileType.INSTANCE);
myInput.setPreferredWidth(300);

panel.add(myInput);

return panel;


这里的插入符号曾经位于 dsa5 ,所以 dsa5变量对于完成尚不可见。

enter image description here

关于intellij-plugin - IntelliJ 插件中具有标准 PsiElement 自动完成功能的文本字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59443789/

相关文章:

kotlin - 如何获取IntelliJ插件的当前项目目录

java - 以编程方式更新 intellij 插件中的 build.gradle

intellij-idea - IntelliJ IDEA 全局环境变量配置

java - 如何更改 JPanel 的大小以适应动态生成的 JBList?

java - 在intellij idea插件中读取PsiClass的注解

java - Intellij idea插件开发: plugin not enabled on right click on project

java - 如何设置 PsiFileNode 或其子节点的背景颜色

java - Intellij 构建错误 : Execution failed for task ':classes' @NotNull instrumentation failed

python - pycharm或其他产品有没有类似gitlens的插件?

java - 当抽象类具有 Final 字段时,lombok @Data 提示 "lombok needs a default constructor in the base class"