通过 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'显示在提案中。这是一个黑客,但我完成了我的事情。
所以我写了一个插件,通过使用扩展 "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'显示在提案中。这是一个黑客,但我完成了我的事情。