- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
正在运行 pygments以下 C++ 文本的默认词法分析器:class foo{};
,结果如下:
(Token.Keyword, 'class')
(Token.Text, ' ')
(Token.Name.Class, 'foo')
(Token.Punctuation, '{')
(Token.Punctuation, '}')
(Token.Punctuation, ';')
请注意 token foo
的类型为 Token.Name.Class
。
如果我将类名更改为 foobar
我希望能够仅在触摸的标记上运行 default 词法分析器,在本例中为原始标记 foo
和 {
。
问:如何保存词法分析器状态,以便标记化 foobar{
将生成类型为 Token.Name.Class
的标记?
拥有此功能可以优化大型源文件的语法突出显示,例如在文件中间发生更改(用户正在键入文本)。似乎没有记录在案的执行此操作的方法,也没有关于如何使用默认 pygments lexers 执行此操作的信息。 .
是否有任何其他支持此行为的语法高亮系统?
编辑:
这里有一个关于性能的例子:http://tpcg.io/ESYjiF
最佳答案
根据我对源代码的理解,你想要的是不可能的。
我不会挖掘并尝试解释每一行相关的代码,但基本上,这就是发生的事情:
pygments.lexers.c_cpp.CLexer
, 它继承自 pygments.lexer.RegexLexer
.pygments.lex(lexer, code)
函数只是在 lexer
上调用 get_tokens
方法并处理错误。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
获取 token 并对其中一些进行再加工。最后,RegexLexer.get_tokens_unprocessed
循环定义的标记类型(类似于 (("function", ('pattern-to-find-c-function',)), ("class", ('function-to-find-c-class' ,)))
) 并针对每种类型(function
、class
、comment
...)在源代码中找到所有匹配项文本,然后处理下一个类型。
这种行为使您无法实现您想要的,因为它在标记类型上循环,而不是在文本上循环。
为了使我的观点更加明显,我在库中添加了 2 行代码,file: pygments/lexer.py
, line: 628
for rexmatch, action, new_state in statetokens:
print('looking for {}'.format(action))
m = rexmatch(text, pos)
print('found: {}'.format(m))
然后用这段代码运行它:
import pygments
import pygments.lexers
lexer = pygments.lexers.get_lexer_for_filename("foo.h")
sample="""
class foo{};
"""
print(list(lexer.get_tokens(sample)))
输出:
[...]
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'>
[...]
如您所见, token 类型是代码迭代的对象。
考虑到这一点以及(如 Tarun Lalwani 在评论中所说)单个新字符可以破坏整个源代码结构这一事实,您最好在每次更新时重新对整个文本进行词法分析。
关于Python pygments 词法分析器状态保存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50943417/
将 Pygments 与 Hugo 结合使用,我可以使用如下 block 进行语法突出显示: ```ruby def hello object puts "Hello, #{object}" en
我为 pygments 编写了一个新的词法分析器,并尝试使用它。因此我看这个页面 http://pygments.org/docs/lexerdevelopment/ 其中描述了安装过程。他们说要制作
我安装了 Phabricator 来处理 Python 项目。一切都很好,但文件 View 以纯文本形式显示它们。我想要 Pygmentize 实用程序提供的一些突出显示。 我已经安装了 Pygmen
我正在使用 Pygments 的词法分析器,一个 Python 插件。我想获取 C++ 代码的标记,特别是在声明新变量时,例如 int a=3,b=5,c=4; 这里a,b,c应该被赋予类型“声明的变
我一直在尝试为 python 制作一个带有语法高亮显示的简单文本板。但问题是当我打开引号字符串广告 pt 结束引号时,文本是引号不会变回来,这是它的样子: 这是我当前的代码: from tkinter
正在运行 pygments以下 C++ 文本的默认词法分析器:class foo{};,结果如下: (Token.Keyword, 'class') (Token.Text, ' ') (Token.
我只想将 pygments 用于基本的行编号,例如 krb.conf、Asterisk 的 extensions.conf 或 pam-configuration. 我通过 Jekyll 使用 pyg
我正在使用guess_lexer() Pygments 库的方法来识别片段中的源代码: 这就是我现在使用它的方式: from pygments.lexers import guess_lexer te
我正在尝试使用 IronPython.Hosting 和 Pygments 为我的博客创建 ASP.NET 语法荧光笔。问题是,如果没有黑客攻击,Pygments 至少不能在 IPy 2.0 上运行。
如果我通过 pygments 运行 python 源文件,它会输出 html 代码,其元素类属于 pygments 正在使用的某些 CSS 文件。样式属性是否可以包含在输出的 html 中,这样我就不
我已将 Pygments 安装到我的 virtualenv 中,并且它似乎已正确导入到我的项目中。 我正在使用 PyCharm,并且我没有从 IDE 中收到任何导入错误。 但是当我尝试在本地主机上运行
我一直在尝试向我的 Django 站点添加语法高亮显示。问题是我得到了 和 字符也被格式化。有没有办法保留这些字符?这是我正在使用的代码: from BeautifulSoup impo
是否可以在 wxPython 中使用 Pygments 来提供语法高亮显示? 最佳答案 积极的。虽然 pygments 最初是针对 CSS 输出的,但您可以定义一个 pygments 格式化程序来定义
在我写的一些 sphinx 文档中,我包含了来自辅助文件的代码示例,如下所示: .. literalinclude:: mymodule.py :pyobject: MyClass :li
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 5 年前。
我运行了以下代码 # Allows the use of display() for displaying from IPython.display import display DataFrames
我很失望地发现函数调用没有使用 Pygments 突出显示。 . See it online (我用所有可用的样式对其进行了测试) 内置函数被突出显示,但不是我的。 我看了the tokens lis
我有一种类似 Lisp 的语言,我想在 Sphinx 代码片段文档中使用 Pygments 突出显示。我的方法是扩展现有的 CommonLispLexer 以使用 NameHighlightFilte
我使用 Jupyter Notebooks 来实现和记录适用于我们生产数据库的更改。我用 Python 编程并将典型的 SQL 语句提交到服务器以获取结果并进行更改。 我喜欢将 sql 作为更改的详细
我正在使用 Sphinx 来记录 Web 服务。我想使用代码块指令显示格式化的 JSON Web 响应,这是 Spinx 通过 Pygments 完成的,但 JSON 在 Pygments 中没有语法
我是一名优秀的程序员,十分优秀!