Sublime Highlighter插件添加java支持
Highlighter给复制富文本编码添加了很好的支持,最近使用时发现针对Java语言会出现找不到Lexer
的错误。
Traceback (most recent call last):
File "D:\software\Sublime Text Build 3176 x64\sublime_plugin.py", line 1066, in run_
return self.run(edit, **args)
File "D:\software\Sublime Text Build 3176 x64\Data\Packages\SublimeHighlight\SublimeHighlight.py", line 131, in run
pygmented = self.highlight(output_type, full)
File "D:\software\Sublime Text Build 3176 x64\Data\Packages\SublimeHighlight\SublimeHighlight.py", line 119, in highlight
return pygments.highlight(self.code, self.get_lexer(),
File "D:\software\Sublime Text Build 3176 x64\Data\Packages\SublimeHighlight\SublimeHighlight.py", line 102, in get_lexer
lexer = pygments.lexers.guess_lexer(code)
File "D:\software\Sublime Text Build 3176 x64\Data\Packages\pygments\all\pygments\lexers\__init__.py", line 252, in guess_lexer
raise ClassNotFound('no lexer matching the text found')
pygments.util.ClassNotFound: no lexer matching the text found
发现原作者在查找高亮语法时,通过guess_lexer_from_syntax
和pygments.lexers.guess_lexer
,在markdown文本中,
无法正确的找到Java
的语法支持,是pygments是有Java
语法支持的。通过打印scope_name
,确认markdown文本中是有
source.java
的语法高亮。添加get_lexer_from_scope
,通过source.java
查找语法高亮。
+ def get_lexer_from_scope(self):
+ view = self.view
+ pt = view.sel()[0].a
+ scope_name = view.scope_name(pt)
+ for sn in scope_name.split(' '):
+ if 'source.' in sn:
+ sourcename = sn[7:]
+ print("get lexer from scope: %r" % sourcename)
+ return pygments.lexers.get_lexer_by_name(sourcename)
+ return
def get_lexer(self, code=None):
# ...
if not lexer:
lexer = self.guess_lexer_from_syntax()
+ if not lexer:
+ lexer = self.get_lexer_from_scope()
+ print("try get_lexer_from_scope %r" % lexer)
if not lexer:
lexer = pygments.lexers.guess_lexer(code)
# ...