插件

如果您想在不攻击源代码的情况下扩展Pygments,但是想使用lexer/formatter/style/filter查找函数 (lexers.get_lexer_by_name et al.), you can use setuptools entrypoints添加新的lexer、格式化程序或样式,就像它们在pygments核心中一样。

这意味着您可以将荧光笔模块与 pygmentize 脚本,它依赖于上述函数。

插件发现

在运行时,发现插件优先使用Python的标准库模块 importlib.metadata ,在Python3.8和更高版本中可用。在早期的Python版本中,Pygments尝试使用 importlib_metadata 后端口(如果可用)。如果不可用,则尝试在旧版本上进行回退 pkg_resources 模块。最后,如果 pkg_resources 不可用,则根本不会加载任何插件。请注意 pkg_resources 随一起分发的 setuptools ,因此在大多数Python环境中都可用。然而, pkg_resources 远远慢于 importlib.metadata 或其 importlib_metadata 后端口。因此,如果在版本早于3.8的Python下运行Pygments,建议安装 importlib-metadata 。Pygments定义了一个 plugins 额外打包,这样您就可以确保它的安装具有最好的插件支持(即 importlib-metadata 如果您运行的是早于3.8的版本,则还会安装),方法是指定 pygments[plugins] 作为要求,例如,使用 pip

$ python -m pip install --user pygments[plugins]

通过入口点定义插件

以下是Pygments了解的安装工具入口点列表:

pygments.lexers

这个入口点用于向Pygments核心添加新的lexer。入口点值的名称并不重要,Pygments从类定义中提取所需的元数据:

[pygments.lexers]
yourlexer = yourmodule:YourLexer

请注意,您必须定义 namealiasesfilename 属性,以便您可以从命令行使用荧光笔:

class YourLexer(...):
    name = 'Name Of Your Lexer'
    aliases = ['alias']
    filenames = ['*.ext']

pygments.formatters

您可以使用此入口点向Pygment添加新的格式化程序。入口点项的名称是格式化程序的名称。如果在名称前面加上斜线,则它将用作文件名模式:

[pygments.formatters]
yourformatter = yourmodule:YourFormatter
/.ext = yourmodule:YourFormatter

pygments.styles

To add a new style you can use this entrypoint. 入口点的名称是样式的名称:

[pygments.styles]
yourstyle = yourmodule:YourStyle

pygments.filters

使用此入口点注册新的筛选器。入口点的名称是筛选器的名称:

[pygments.filters]
yourfilter = yourmodule:YourFilter

如何使用入口点

此文档不解释如何使用这些入口点,因为它包含在 setuptools documentation . 该页面应该涵盖编写插件所需的所有内容。

延伸核心

如果您编写了一个开源的Pygments插件,请告知我们。我们很有可能将其添加到Pygments分布中。