如何在RSyntaxTextArea中修改已有语言的高亮关键词(无需重写解析)
解决RSyntaxTextArea修改现有语言高亮关键词的简便方案
嘿,我之前也碰到过一模一样的需求——不想从头写个新的TokenMaker,只想在现有语言(比如C++)的基础上调整高亮关键词/函数列表,还不想用反射这种取巧手段。下面给你分享个完全合规的简单办法:
核心思路
直接继承目标语言的TokenMaker类(比如CPlusPlusTokenMaker),然后做两件事:
- 重写
getWordsToHighlight()时,先拿父类的默认关键词映射,再在这个基础上修改(加新关键词、改已有条目、删不需要的内容都可以) - 重写
getTokenList()时,直接返回父类的结果,完全复用原有语言的Token解析逻辑,不用自己从零实现复杂的语法规则
完整代码示例
import org.fife.ui.rsyntaxtextarea.Token; import org.fife.ui.rsyntaxtextarea.TokenMap; import org.fife.ui.rsyntaxtextarea.modes.CPlusPlusTokenMaker; public class CustomCPlusPlusTokenMaker extends CPlusPlusTokenMaker { @Override public TokenMap getWordsToHighlight() { // 先获取C++语言默认的关键词映射表 TokenMap tokenMap = super.getWordsToHighlight(); // 添加你的自定义保留字,比如你代码里的"foo" tokenMap.put("foo", Token.RESERVED_WORD); // 还可以修改已有条目,比如把某个函数改成保留字(示例) // tokenMap.put("printf", Token.RESERVED_WORD); // 要是想删掉某个默认关键词也很简单 // tokenMap.remove("some_unwanted_keyword"); return tokenMap; } @Override public Token getTokenList() { // 直接复用父类已经实现好的Token解析规则,不用自己写 return super.getTokenList(); } }
为什么这个方法靠谱?
- 现有语言的
TokenMaker(比如CPlusPlusTokenMaker)已经把getTokenList()实现得很完整了,包含了该语言所有的语法解析逻辑,我们直接复用就省掉了从头写语法规则的麻烦 - 通过
super.getWordsToHighlight()拿到默认映射后再修改,既保留了原有语言的全部高亮规则,又能轻松加入自定义内容 - 完全符合RSyntaxTextArea的扩展规范,没有用任何hack手段,稳定性拉满
怎么用这个自定义TokenMaker?
把它注册到你的文本编辑器就行:
RSyntaxTextArea textArea = new RSyntaxTextArea(); // 给自定义语法起个名字 String customStyle = "text/custom-c++"; textArea.setSyntaxEditingStyle(customStyle); // 注册自定义TokenMaker类 SyntaxConstants.registerSyntaxStyle(customStyle, CustomCPlusPlusTokenMaker.class); // 要是想调整高亮样式也可以在这里改 // SyntaxScheme scheme = textArea.getSyntaxScheme(); // scheme.getStyle(Token.RESERVED_WORD).foreground = new Color(0xAA0000);
这样你的编辑器就会用修改后的C++高亮规则,同时保留原有语言的所有其他语法解析功能啦!
内容的提问来源于stack exchange,提问作者BullyWiiPlaza
相关产品推荐
相关产品推荐

