7

我喜欢 Eclipse 让我使用 Tab 键在方法调用中的参数之间跳转。我希望我的插件提供类似的功能。准确地说,我正在向编辑器中注入一些文本,我想突出显示特定的语法并让程序员使用 Tab 键跳转到下一个匹配项。

这是一个例子。假设我动态创建了以下代码段:

String a = "bogus string";
int i = a.[?]

我将把它注入到编辑器中,我希望它[?]被突出显示并准备好进行修改(用户可以键入length())。此外,如果有更多[?]片段,我希望用户使用 Tab 移动到下一个。

经过一番研究,我发现可以使用模板来完成。但是,我在网上找不到任何相关示例。有人有这方面的经验吗?

更新:

我发现了两个可能有用的链接,尽管我仍然无法提出解决方案。

链接一

链接二

4

3 回答 3

8

示例处理程序代码:

AbstractTextEditor activeEditor = 
        (AbstractTextEditor) HandlerUtil.getActiveEditor(event);

ISourceViewer sourceViewer = 
        (ISourceViewer) activeEditor.getAdapter(ITextOperationTarget.class);

Point range = sourceViewer.getSelectedRange();

// You can generate template dynamically here!
Template template = new Template("sample", 
        "sample description", 
        "no-context", 
        "private void ${name}(){\r\n" + 
        "\tSystem.out.println(\"${name}\")\r\n"
        + "}\r\n", true);

IRegion region = new Region(range.x, range.y);
TemplateContextType contextType = new TemplateContextType("test");
TemplateContext ctx =
    new DocumentTemplateContext(contextType, 
        sourceViewer.getDocument(), 
        range.x, 
        range.y);

TemplateProposal proposal 
    = new TemplateProposal(template, ctx, region, null);

proposal.apply(sourceViewer, (char) 0, 0, 0);

结果:

在此处输入图像描述

我建议你使用org.eclipse.jdt.ui.javaCompletionProposalComputer扩展。它允许您以更合法的方式贡献模板。

ISourceViewer在我的代码中,由于无法合法获得,因此存在黑客攻击。我知道ISourceViewerITextTargetOperation本身,但它不是 API(非法铸造)。并且模板旨在供TemplateCompletionProcessoror使用TemplateCompletionProposalComputer

于 2012-11-02T04:12:36.137 回答
1

我不完全确定你想要什么,但你可以用模板做你想做的事。

例如,打开一个 java 编辑器,将光标放在一个方法中,arraya然后键入 ctlr-space,然后从弹出菜单中选择 arrayadd。您将获得一个突出显示字符串的模板,按制表符跳转到下一个变量。模板源码可见,

首选项 -> java -> 编辑器 -> 模板

${array_type}[] ${result:newName(array)} = new ${array_type}[${array}.length + 1];
System.arraycopy(${array}, 0, ${result}, 0, ${array}.length);
${result}[${array}.length]= ${var};

以 $ 开头的所有内容都是您可以填写的变量,您可以在填写模板时在变量之间切换。

于 2012-10-27T02:55:48.173 回答
0

我的回答是基于 jeeeyul 的回答。不同之处在于,我不仅想要模板本身,还想要导入以使其自动解析和添加。这可以通过以下方式完成,使用 JDT 的东西:

AbstractTextEditor activeEditor = 
            (AbstractTextEditor) HandlerUtil.getActiveEditor(event);
    if (activeEditor == null) {
        return null;
    }
    ITypeRoot element = EditorUtility.getEditorInputJavaElement(activeEditor, true);
    if (element == null) {
        return null;
    }
    ICompilationUnit unit = element.getAdapter(ICompilationUnit.class);
    if (unit == null) {
        return null;
    }
    ISourceViewer sourceViewer = (ISourceViewer) activeEditor.getAdapter(ITextOperationTarget.class);
    Point range = sourceViewer.getSelectedRange();
    // You can generate template dynamically here!
    Template template = new Template("new List", "Add new list creation", JavaContextType.ID_STATEMENTS,
            "List<${type}> ${name:newName(java.util.List)} = new ArrayList<${type}>();${:import(java.util.List, java.util.ArrayList)}",
            true);
    IRegion region = new Region(range.x, range.y);
    JavaContextType contextType = new JavaContextType();
    contextType.setId(JavaContextType.ID_STATEMENTS); //Set context type, for which we apply this template
    contextType.addResolver(new ImportsResolver("import","import")); //Add imports resolver if we want imports to be added automatically for some template
    CompilationUnitContext ctx = new JavaContext(contextType, sourceViewer.getDocument(), range.x,
            range.y, unit);
    TemplateProposal proposal = new TemplateProposal(template, ctx, region, null);
    proposal.apply(sourceViewer, (char) 0, 0, 0);
于 2018-03-09T11:31:59.987 回答