Eclipse:从插件代码访问编辑器模板

假设我的编辑器首选项中定义了一个编辑器模板(插入一些任意代码片段)。

我想以编程方式访问该模板。 我该怎么做呢?

我知道TemplateStore,TemplatePreferencesPage和TemplatePersistentData这两个类存在,但是我无法将它们放在一起工作。

是否有任何示例代码允许我通过Java代码访问我的编辑器模板?

可能是这个JavaPlugin类 (在eclipse的org.eclipse.jdt.internal.ui包中)可能会为你提供第一个跟随的引导。

  /** * Returns the template store for the code generation templates. * * @return the template store for the code generation templates * @since 3.0 */ public TemplateStore getCodeTemplateStore() { if (fCodeTemplateStore == null) { IPreferenceStore store= getPreferenceStore(); boolean alreadyMigrated= store.getBoolean(CODE_TEMPLATES_MIGRATION_KEY); if (alreadyMigrated) fCodeTemplateStore= new ContributionTemplateStore(getCodeTemplateContextRegistry(), store, CODE_TEMPLATES_KEY); else { fCodeTemplateStore= new CompatibilityTemplateStore(getCodeTemplateContextRegistry(), store, CODE_TEMPLATES_KEY, getOldCodeTemplateStoreInstance()); store.setValue(CODE_TEMPLATES_MIGRATION_KEY, true); } try { fCodeTemplateStore.load(); } catch (IOException JavaDoc e) { log(e); } fCodeTemplateStore.startListeningForPreferenceChanges(); // compatibility / bug fixing code for duplicated templates // TODO remove for 3.0 CompatibilityTemplateStore.pruneDuplicates(fCodeTemplateStore, true); } return fCodeTemplateStore; } 

从那里,你可以找到一些使用该function的类:

NewASInterfaceWizard似乎需要访问这些代码模板:

 private String resolveTemplate(String templateName) { Template template = ASEditorPlugin.getDefault().getCodeTemplateStore().findTemplate(templateName); if (template == null) { showErrorBox("Could not resolve template (" + templateName +")."); return ""; } // Create the template context TemplateContext templeteContext = new TemplateContext(new ASContextType()) { public TemplateBuffer evaluate(Template template) throws BadLocationException, TemplateException { TemplateTranslator translator = new TemplateTranslator(); TemplateBuffer buffer = translator.translate(template); getContextType().resolve(buffer, this); return buffer; } public boolean canEvaluate(Template template) { return true; } }; try { return templeteContext.evaluate(template).getString(); } catch (BadLocationException e) { logger.error("Couldnt evaluate template",e); } catch (TemplateException e) { logger.error("Couldnt evaluate template",e); } return ""; } 

像这样使用:

  private static final String FILE_HEADER_TEMPLATE = "file_header"; // Header String header = resolveTemplate(FILE_HEADER_TEMPLATE); if (header.length() > 0) { content.append(header + "\n"); } 

这就是我做到的。

 /** * Get the Template Store of the JDT UI. * * @return the JDT template store */ private TemplateStore getTemplateStore() { if (templateStore == null) { System.out.println("templateStore is null - Creating a new one"); final ContributionContextTypeRegistry registry = new ContributionContextTypeRegistry(JavaUI.ID_CU_EDITOR); final IPreferenceStore store = PreferenceConstants.getPreferenceStore(); templateStore = new ContributionTemplateStore(registry, store, TEMPLATES_KEY); try { templateStore.load(); } catch (IOException e) { WSConsole.e(e); } templateStore.startListeningForPreferenceChanges(); } return templateStore; } 

上面的方法返回TemplateStore。 您可以使用商店添加,删除,查找模板。

 private void filterTemplates() { templateStore = getTemplateStore(); deleteTemplate(templateStore, "org.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); } } 

这是如何在TemplateStore上执行操作。 如果要查找模板的模式,名称,描述,可以通过从TemplateStore获取Template对象来实现。 如果要查找模板的ID,可以从TemplatePersistantData对象获取该ID。