Eclipse plugin Eclipse自定义文本编辑器更新语法高亮显示

Eclipse plugin Eclipse自定义文本编辑器更新语法高亮显示,eclipse-plugin,Eclipse Plugin,我正在编写一个Eclipse插件(Indigo/Juno),其中包含一个用于自定义文本格式的文本编辑器。我在这里学习教程: 到目前为止,我一切正常。Eclipse将使用我的编辑器编辑文件。我有分区,破坏,修复,语法突出所有工作 我添加了一个带有颜色选择器的首选项页面来控制语法高亮显示。它的工作原理基本正确。如果我更新颜色,编辑器将在下次打开或重新打开文件时使用它们 如何让编辑器选项卡在不打开新选项卡的情况下自我更新?内置的JDT Java编辑器可以做到这一点,但到目前为止,我还无法解释它是如何做

我正在编写一个Eclipse插件(Indigo/Juno),其中包含一个用于自定义文本格式的文本编辑器。我在这里学习教程:

到目前为止,我一切正常。Eclipse将使用我的编辑器编辑文件。我有分区,破坏,修复,语法突出所有工作

我添加了一个带有颜色选择器的首选项页面来控制语法高亮显示。它的工作原理基本正确。如果我更新颜色,编辑器将在下次打开或重新打开文件时使用它们

如何让编辑器选项卡在不打开新选项卡的情况下自我更新?内置的JDT Java编辑器可以做到这一点,但到目前为止,我还无法解释它是如何做到的(它是一个非常大和复杂的编辑器)

我想我需要创建一个首选项侦听器()。我已经这样做了,并且可以在设置断点时验证是否调用了侦听器代码

缺少的部分是侦听器和重新初始化编辑器之间的连接。我尝试过重建分区逻辑、颜色逻辑、损坏器/修复器等,但似乎没有任何效果。它要么什么也看不见,要么最坏的情况是会破坏显示,直到我将当前文本从视图中滚动出来重新绘制它。。。用旧的颜色


有什么想法吗?

我认为需要调用
SourceViewer.invalidatePresentation()

对您来说可能已经晚了,但是如果您愿意,您可以使用LiClipse来实现这一点()——它的目标之一是很容易地实现一个编辑器,其中包括语法高亮显示、基本代码完成、大纲等等

添加新语言不需要java技能(主要是在适当的位置创建一个新的.liclipse文件,这是一个YAML文件,并创建一些基本规则来说明如何对语言进行分区——即:通常只是将代码与注释从字符串中分离出来——并指定分区中的关键字,这将为您提供适当的语法高亮显示)


如果您下载它,在plugins\com.brainwy.liclipse.editor\languages上有许多示例,并且有一些关于如何执行的基本文档。

对于任何像我这样遇到此问题的人: 我的解决方案是在编辑器的构造函数中添加以下行

Activator.getActivator().getPreferenceStore().addPropertyChangeListener(新IPropertyChangeListener()){
@凌驾
公共作废propertyChange(PropertyChangeEvent事件){
getSourceViewer().invalidateTextPresentation();
HandleReferenceStoreChanged(事件);
}
});
然后创建一个扩展IToken的自定义类。在构造函数中,我传递首选项字段的字符串,然后在“getObject”方法中,我创建下面的TextAttribute:snippets

公共类MyToken扩展Token实现IToken{
公共MyToken(对象数据){
超级(数据);
}
@凌驾
公共对象getData(){
String dataString=(String)super.getData();
返回getAttributeFromColorName(数据字符串);
}
私有文本属性getAttributeFromColorName(字符串首选项字段){
颜色=新颜色(Display.getCurrent(),StringConverter.asRGB(Activator.getActivator().getPreferenceStore().getString(preferenceField));
返回新的TextAttribute(颜色);
}
}

当我生成规则时,我将所有标记作为自定义类,这允许我动态更改语法颜色。

我还添加了一个示例,用于在首选项更改为时更新颜色


这是使用通用编辑器(目前实现客户编辑器的最佳方法)但是,应该可以根据任何Eclipse编辑器实现调整此选项。

这是其中的一部分,但答案不完整。首先,我必须删除并重新安装损坏者和修复者,因为他们知道如何格式化文本。然后我必须使演示文稿无效,以强制更新视图。@Snowman你能用h更完整的描述?(我也在尝试在我的插件中使用它)@Eyal我已经离开了那个工作地点,不再能够访问那个代码。不过我会尝试从记忆中挖掘出来,我意识到我没有回答这个问题。projectionViewer.InvalidateExtPresentation();试试看{editor.getDocumentProvider().resetDocument((editor.getEditorInput());}catch(CoreException e){e.printStackTrace();}