写在前面
比如我们要开发一个变量名称补全功能的插件,此时就需要在用户输入时获取当前的最新输入内容,本文就来看下如何来做。
1:开发
首先我们需要创建一个CompletionContributor的子类,还需要一个CompletionProvider的子类来真正获取和处理用户的输入,源码如下:
public class ListenUserInput extends CompletionContributor {
public ListenUserInput() {
CompletionProvider<CompletionParameters> provider = new DefaultCompletionProvider();
/**
* 设置监听哪些类型的变量
*
* PsiLocalVariable 方法内的局部变量
* PsiMethod 方法名称
* PsiField 类字段
* PsiParameter 方法参数
* 实际情况按需设置即可
*/
extend(CompletionType.BASIC, psiElement(PsiIdentifier.class).withParent(PsiLocalVariable.class), provider);
extend(CompletionType.BASIC, psiElement(PsiIdentifier.class).withParent(PsiMethod.class), provider);
extend(CompletionType.BASIC, psiElement(PsiIdentifier.class).withParent(PsiField.class), provider);
extend(CompletionType.BASIC, psiElement(PsiIdentifier.class).withParent(PsiParameter.class), provider);
}
static class DefaultCompletionProvider extends CompletionProvider<CompletionParameters> {
public DefaultCompletionProvider() {
}
/**
* 在该方法中可以获取到当前用户录入的内容,并执行操作
* @param parameters
* @param context
* @param result
*/
@Override
protected void addCompletions(@NotNull CompletionParameters parameters, @NotNull ProcessingContext context, @NotNull CompletionResultSet result) {
PrefixMatcher prefixMatcher = result.getPrefixMatcher();
String prefix = prefixMatcher.getPrefix();
System.out.println("输入了:" + prefix);
}
}
}
接着类ListenUserInput还需要注册到plugin.xml中的completion.contributor扩展中:
<extensions defaultExtensionNs="com.intellij">
<!-- Add your extensions here -->
<completion.contributor language="JAVA"
order="first"
implementationClass="tt.ListenUserInput"/>
</extensions>
这就完了。
2:测试
运行:
测试: