Rax*_*van 10 python syntax-highlighting pygments python-3.x
在以下c ++文本上运行pygments默认lexer :,class foo{};
结果如下:
(Token.Keyword, 'class')
(Token.Text, ' ')
(Token.Name.Class, 'foo')
(Token.Punctuation, '{')
(Token.Punctuation, '}')
(Token.Punctuation, ';')
Run Code Online (Sandbox Code Playgroud)
请注意,toke foo
具有类型Token.Name.Class
.
如果我将类名更改为foobar
我希望能够仅在触摸的标记上运行默认词法分析器,在这种情况下是原始标记foo
和{
.
问:如何保存词法分析器状态,以便标记化foobar{
将为类型提供令牌Token.Name.Class
?
具有此功能将优化语法突出显示,例如,在文件中间正在进行更改(用户正在键入文本)的大型源文件.似乎没有记录的方法这样做,也没有关于如何使用默认pygments词法分析器的信息.
是否有任何其他语法突出显示系统支持此行为?
编辑:
关于性能,这里有一个例子:http://tpcg.io/ESYjiF
从我对源代码的理解,你想要的是不可能的.
我不会挖掘并尝试解释每一个相关的代码行,但基本上,这是发生的事情:
pygments.lexers.c_cpp.CLexer
继承自pygments.lexer.RegexLexer
.pygments.lex(lexer, code)
函数只是调用get_tokens
方法lexer
并处理错误.lexer.get_tokens
基本上解析unicode字符串中的源代码并调用 self.get_tokens_unprocessed
get_tokens_unprocessed
在您的情况下由每个Lexer定义相关方法pygments.lexers.c_cpp.CFamilyLexer.get_tokens_unprocessed
.CFamilyLexer.get_tokens_unprocessed
基本上从RegexLexer.get_tokens_unprocessed
其中获取令牌并重新处理其中一些.最后,RegexLexer.get_tokens_unprocessed
上定义的标记类型环(像(("function", ('pattern-to-find-c-function',)), ("class", ('function-to-find-c-class',)))
),并为每种类型(function
,class
,comment
...)找到原文中的所有比赛,然后再处理下一个类型.
此行为使您想要的不可能,因为它在令牌类型上循环,而不是在文本上循环.
为了使我的观点更加明显,我在lib中添加了两行代码,文件:pygments/lexer.py
,行:628
for rexmatch, action, new_state in statetokens:
print('looking for {}'.format(action))
m = rexmatch(text, pos)
print('found: {}'.format(m))
Run Code Online (Sandbox Code Playgroud)
并使用以下代码运行它:
import pygments
import pygments.lexers
lexer = pygments.lexers.get_lexer_for_filename("foo.h")
sample="""
class foo{};
"""
print(list(lexer.get_tokens(sample)))
Run Code Online (Sandbox Code Playgroud)
输出:
[...]
looking for Token.Keyword.Reserved
found: None
looking for Token.Name.Builtin
found: None
looking for <function bygroups.<locals>.callback at 0x7fb1f29b52f0>
found: None
looking for Token.Name
found: <_sre.SRE_Match object; span=(6, 9), match='foo'>
[...]
Run Code Online (Sandbox Code Playgroud)
如您所见,令牌类型是代码迭代的内容.
考虑到这一点(正如Tarun Lalwani在评论中所说),一个新角色可以破坏整个源代码结构这一事实,你不可能做得比在每次更新时重新整理整个文本更好.
归档时间: |
|
查看次数: |
365 次 |
最近记录: |