源码库: program-in-chinese/stone-editor-eclipsejava
参考:git
续前文重拾《 两周自制脚本语言 》- 中文关键字与原生函数, 开始想在VS Code下实现, 经过添加TextMate语法文件也基本达到了上面的效果, 但看着vscode的Java语法须要上千行JSON代码: java.tmLanguage.json, TypeScript的更夸张有五千行, 不可思议如何维护, 因而考察Eclipse下的实现方式.github
正好看到Eclipse 4.7版本以后改进了对新语言的插件开发的支持(Eclipse Project Oxygen (4.7) M3 News), 不用从头建一个定制编辑器, 而是对一个"通用文本编辑器"进行扩展, 来实现高亮, 悬浮提示, 辅助补全等等功能. 看了示例代码以Java为主, 应该比写JSON好维护一些.json
刚实现了开头的图示中的高亮功能, 直接上源码.eclipse
下面定义了语法高亮的几个规则, 包括数字, 注释(StoneReconciler):编辑器
public class StoneReconciler extends PresentationReconciler { Token 深红 = 字号(SWT.COLOR_DARK_RED); Token 深绿 = 字号(SWT.COLOR_DARK_GREEN); Token 蓝色 = 字号(SWT.COLOR_BLUE); public StoneReconciler() { SingleLineRule 单引号 = new SingleLineRule("'", "'", 深红); SingleLineRule 双引号 = new SingleLineRule("\"", "\"", 深红); NumberRule 数字 = new NumberRule(蓝色); PatternRule 模式规则 = new PatternRule("//", null, 深绿, (char) 0, true); 石头语言用词规则 用词规则 = new 石头语言用词规则(); RuleBasedScanner 扫描器 = new RuleBasedScanner(); 扫描器.setRules(new IRule[] {单引号, 双引号, 用词规则, 模式规则, 数字}); DefaultDamagerRepairer 修理器 = new DefaultDamagerRepairer(扫描器); this.setDamager(修理器, IDocument.DEFAULT_CONTENT_TYPE); this.setRepairer(修理器, IDocument.DEFAULT_CONTENT_TYPE); } private Token 字号(int 色号) { return new Token(new TextAttribute(Display.getCurrent().getSystemColor(色号))); } }
关键词高亮规则:ide
public class 石头语言用词规则 extends WordRule { private static final ArrayList<String> 关键字 = new ArrayList<>(Arrays.asList("每当", "若是", "不然", "类别", "定义")); private static final Color 深紫红 = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_MAGENTA); public 石头语言用词规则() { super(new 探测器()); for (String 词 : 关键字) { addWord(词, new Token(new TextAttribute(深紫红, null, SWT.BOLD))); } } }
新建的默认插件对XML进行校验, 所以石头语言的语法会致使文件开头报校验错误"Content is not allowed in prolog". 将ValidatorDocumentSetupParticipant
中对XML解析的部分删去后再也不报错. 可是, 老文件的错误不能自动消除, 应该与内容刷新或者自动校验有关. 以后对校验部分定制时进一步研究.函数