IntelliJ 插件中具有标准 PsiElement 自动完成功能的文本字段
Text Field with Standard PsiElement Auto Completion in 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
变量在完成时还不可见。
我正在尝试为我的 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
变量在完成时还不可见。