通过 Java 编辑器的插件向 Eclipse 提供模板,但应根据上下文而有所不同

Contributing a template to Eclipse via a Plugin to the Java Editor, but should vary based on the context

所以我写了一个插件,通过使用扩展 "org.eclipse.ui.editors.templates" 为 eclipse 中的 java 编辑器贡献一个模板。这只是添加模板。那不是我想要的。我想用新模板替换现有模板,这也是基于条件的。

例如,如果文件名为 "john.java",如果我在该文件中键入 "sysout",我希望显示我的模板而不是默认模板。有什么办法可以做到这一点吗?

好的。我终于找到了解决方法。 JDT 插件没有为我尝试做的事情提供扩展点。所以我得到了 TemplateStore 并修改它以满足我的需要。

@Override
public void sessionStarted() {
    filterTemplates();
}

private void filterTemplates() {
    templateStore = getTemplateStore();
    file = getFileThatsVisibleInTheEditor();

    if (//file name is john.java) {
        deleteTemplate(templateStore, "org.eclipse.jdt.ui.templates.sysout");
    } else {
        deleteTemplate(templateStore, "com.eclipse.jdt.ui.templates.sysout");
    }

    try {
        templateStore.save();
    } catch (IOException e) {
    }
}

private void deleteTemplate(TemplateStore templateStore, String id) {
    TemplatePersistenceData templateData = templateStore.getTemplateData(id);
    if (templateData != null) {
        templateStore.delete(templateData);
    }
}

@Override
public void sessionEnded() {
    getTemplateStore().restoreDeleted();
}

private TemplateStore getTemplateStore() {
    if (templateStore == null) {
        final ContributionContextTypeRegistry registry = new ContributionContextTypeRegistry(JavaUI.ID_CU_EDITOR);
        final IPreferenceStore store = PreferenceConstants.getPreferenceStore();
        templateStore = new ContributionTemplateStore(registry, store, "org.eclipse.jdt.ui.text.custom_templates");
        try {
            templateStore.load();
        } catch (IOException e) {
        }
        templateStore.startListeningForPreferenceChanges();
    }
    return templateStore;
}

这整个写在扩展 IJavaCompletionProposalComputer 的 class 中。所以每次你按下 Ctrl+Space,这段代码就会被执行,你的模板风格也会被执行。

在上面的代码中,我将正常的 java sysout 替换为我的插件根据条件贡献的那个,这样在任何时候都只有一个版本的 'sysout'显示在提案中。这是一个黑客,但我完成了我的事情。