Notepad++中文网下载 - Notepad++官网

Notepad++中文网下载 - Notepad++官网

Notepad++ 函数列表自定义说明

功能列表面板用于显示当前文件中所有的函数(或方法),用户双击面板中的函数名称,即可在编辑器中快速定位到该函数。你可以按照以下说明自定义函数列表,以增强现有语言的支持,或为当前未支持的语言添加函数列表功能。
函数列表通过正则表达式搜索引擎解析当前活动文件,查找并在面板中显示所有匹配的函数(或方法)。它设计得尽可能通用,允许用户修改搜索规则,或为任意编程语言添加新的解析器。
要让函数列表适配你的目标语言,需修改或添加该语言对应的XML文件。不同语言的XML文件可在 %APPDATA%\notepad++\functionList 目录中找到;若使用绿色版(zip压缩包)Notepad++,则该文件位于安装目录下的 functionList 文件夹中。同一文件夹下的 overrideMap.xml 文件,用于将语言名称映射到其对应的函数列表规则XML文件,具体可参考手册中“函数列表配置文件”章节。(对于纯文本文件,可在 functionList\normal.xml 中设置函数列表定义。)

一、如何自定义函数列表

自定义函数列表,需编辑目标语言对应的XML文件。以下详细说明该XML文件中各元素的结构和要求。
函数列表的XML文件需采用 UTF-8 无 BOM 编码(详见“配置文件编码”相关说明)。

1. 解析器基础设置

<parser> 节点支持以下三个属性:
  • id:该解析器的唯一标识,不可重复。

  • displayName:保留属性,暂未启用,供未来扩展使用。

  • comment(可选):可在该属性中填写正则表达式,用于识别文件中的注释区域。被识别的注释区域会被搜索忽略,避免误识别注释中的函数。

2. 解析器类型

解析器分为三种类型,可根据目标语言的函数定义特点选择:
  • 函数解析器:适用于仅包含独立函数、无类定义的语言(如C语言),仅包含一个 <function> 节点。

  • 类解析器:适用于函数仅定义在类内部、无类外函数的语言(如Java),仅包含一个 <classRange> 节点。

  • 混合解析器:适用于类内、类外均有函数定义的语言(如C++),同时包含 <function> 和 <classRange> 两个节点。

3. 解析器正则表达式说明

函数列表的正则表达式遵循“搜索:正则表达式”文档中的语法,但有以下例外和补充说明:
  • 不支持正则表达式的后向查找操作。

  • 仅用于搜索函数名称,不支持正则替换或修改;若需删除匹配结果的开头或结尾内容,可使用 \K 重置匹配,或使用前瞻操作。

  • 可使用 (?x) 修饰符,允许在正则表达式中添加额外空白和 # 前缀注释(详见“正则表达式搜索修饰符”文档)。

  • 解析器默认开启“.”匹配换行(相当于正则中的 (?s));若需让“.”不匹配换行,需在正则表达式中添加 (?-s)。

  • 可使用Notepad++的“搜索”对话框(搜索模式设为“正则表达式”)调试正则表达式。若使用其他工具调试,需注意不同正则实现存在细微差异,建议选择与Notepad++使用相同Boost库版本的工具,确保结果一致(最新版Notepad++使用的Boost库版本可参考“搜索:正则表达式”章节)。

二、各类解析器详细配置

1. 函数解析器

<function> 节点支持以下属性和子元素:
  • mainExpr(属性):用于匹配包含函数所有关键信息的完整字符串的正则表达式。

  • displayMode(属性):保留属性,暂未启用。

  • functionName(元素):定义一个或多个正则表达式,从 mainExpr 匹配的结果中提取函数名称。

  • nameExpr(元素):用于匹配函数名称,以 mainExpr 的匹配结果作为输入,其 expr 属性用于填写匹配函数名称的正则表达式。

注意:若一个 functionName 中包含多个 nameExpr 元素,将按顺序串联工作——前一个 nameExpr 的结果作为后一个的输入,而非并行匹配。
  • className(元素):定义一个或多个正则表达式,从 mainExpr 的匹配结果中提取类名(即使是函数解析器,也可设置该元素)。

  • nameExpr(元素):用于提取类名,以 mainExpr 的匹配结果作为输入,其 expr 属性用于填写匹配类名的正则表达式。

functionName 和 className 均为可选元素。若两者都缺失,mainExpr 匹配到的字符串将直接作为函数名,类名将不被使用。

2. 类解析器

<classRange> 节点支持以下属性和子元素:
  • mainExpr(属性):用于搜索类定义的核心正则表达式,匹配包含类所有关键信息的完整字符串。

  • displayMode(属性):保留属性,暂未启用。

  • openSymbole & closeSymbole(属性,可选):用于定义类的边界符号。解析器会从 mainExpr 匹配结果的最后一个字符开始,查找 openSymbole,再通过匹配对应的 closeSymbole 确定类的结束位置,支持多层嵌套(例如:{{{}{}}}{})。

  • className(元素):包含一个或多个 nameExpr 节点,用于从 mainExpr 的匹配结果中提取类名。

  • function(元素):用于查找类内部的函数,通过其 mainExpr 属性和 functionName 节点中的表达式实现匹配。

注意:此类 function 节点与函数解析器中的 function 节点相似,但内容略有不同,具体差异如下:
  • mainExpr(属性):用于匹配类内函数完整信息的正则表达式。

  • functionName(元素):用于封装和提取类内函数名称的容器。

  • functionNameExpr(元素):用于匹配类内函数名称的核心元素(区别于函数解析器的 nameExpr 元素),其 expr 属性用于填写匹配类内函数名称的正则表达式。

重要提示:空类(无任何函数的类)不会在功能列表面板中显示。若 <classRange> 节点中未定义 <function> 元素,或定义的 <function> 无法匹配类内任何函数,该类都不会显示在面板中。函数列表中,类仅作为函数的容器,无内部函数时不会单独显示。

3. 混合解析器

混合解析器同时包含类解析器(<classRange> 节点)和函数解析器(<function> 节点)。解析时会先应用类解析器查找所有类区域,再在类区域之外的内容中应用函数解析器,匹配独立函数。

三、解析器验证与使用

1. 手动验证解析器

完成解析器定义后,将XML文件以“语言名称.xml”为文件名,保存到 functionList 文件夹中(可参考 overrideMap.xml 查看所有支持语言的命名规范)。然后加载一个使用该语言的文件,检查面板是否能正确显示所有预期的函数,且函数与类的对应关系正确。

2. 自定义内置语言或UDL的函数列表

若不喜欢Notepad++自带的默认函数列表解析器,可自行编写解析规则,以唯一文件名保存(如 my_语言名.xml)。注意:直接编辑现有语言的XML文件,下次Notepad++更新时可能会覆盖你的修改。
可通过 functionList 目录下的 overrideMap.xml 文件,覆盖默认的解析器映射,指向你的自定义XML文件;也可通过该文件为新的用户自定义语言(UDL)添加解析器映射,具体操作详见手册“函数列表配置文件”章节。

3. 验证函数列表定义文件

开发函数列表定义文件时,若需验证XML语法正确性,可查阅Notepad++社区的“验证配置文件XML”常见问题,获取相关操作说明。

四、贡献解析器规则到Notepad++代码库

若你为Notepad++内置语言添加或更新了解析器定义文件,可通过在Notepad++ GitHub页面创建“拉取请求(PR)”,将文件贡献到代码库中(拉取请求是GitHub中请求将自定义代码合并到项目的机制)。
重要说明:
  • 仅当你希望自定义解析器规则随Notepad++安装包分发、供所有用户使用时,才需要创建拉取请求;仅个人使用无需操作。

  • 为自己的UDL创建的函数列表,无需创建拉取请求(用户自定义语言及其函数列表不会随Notepad++分发)。

  • 仅编辑现有解析器规则供个人使用,无需创建拉取请求。

  • 拉取请求仅适用于:更新现有语言的解析器规则、为内置语言添加新的解析器规则;不符合以上条件无需继续操作。

若确认需要提交拉取请求,请先完成单元测试,再提交请求,具体步骤如下。

1. 单元测试(必做)

为避免代码库出现回归问题,提交拉取请求前必须运行单元测试。该流程适合熟悉开发环境(分叉仓库、运行单元测试、创建拉取请求等)或愿意学习相关操作的用户;未完成单元测试的拉取请求大概率会被拒绝。
运行单元测试的步骤:
  1. 创建或同步你分叉的Notepad++仓库。

  2. 将 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\installer\functionList\ 下的所有XML文件,复制到 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\bin\functionList\ 中。

  3. 将 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\installer\filesForTesting\ 下的所有XML文件,复制到 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\bin\functionList\ 中。

  4. 将你修改后的解析器XML文件,复制到 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\bin\functionList\ 中。

  5. 打开PowerShell,进入 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\Test\FunctionList\ 目录,运行 .\unitTestLauncher.ps1。

  6. 当显示“All tests are passed.”(所有测试均通过)时,即可提交拉取请求。

2. 单元测试文件缺失的处理

若为新语言创建解析器,或增强现有解析器但对应的单元测试文件不存在,需按以下步骤操作:
  1. 在 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\Test\FunctionList\ 中,添加一个以小写语言名命名的目录。

  2. 在该目录中添加测试文件,命名为 unitTest。

  3. 打开cmd,进入 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\Test\FunctionList\ 目录,执行命令:..\..\bin\notepad++.exe -export=functionList -l[langName] .\[langName]\unitTest(将[langName]替换为目标语言名)。

  4. 会生成名为 unitTest.result.json 的文件,将其重命名为 unitTest.expected.result。

  5. 运行单元测试(参考上方步骤),确保解析器规则不会导致回归问题。

3. 单元测试文件已存在的处理

若改进现有解析器且单元测试文件已存在,可修改现有测试文件或添加新测试文件,具体如下:

(1)修改现有单元测试文件

  1. 运行单元测试,确保当前解析器规则无回归问题。

  2. 根据你的增强内容,修改 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\Test\FunctionList\[langName]\unitTest 文件(通常只需添加内容,无需删除现有内容)。

  3. 打开cmd,进入 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\Test\FunctionList\ 目录,执行命令:..\..\bin\notepad++.exe -export=functionList -l[langName] .\[langName]\unitTest。

  4. 生成 unitTest.result.json 文件后,删除原有的 unitTest.expected.result,再将 unitTest.result.json 重命名为 unitTest.expected.result。

(2)添加新的单元测试文件

  1. 运行单元测试,确保当前解析器规则无回归问题。

  2. 在 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\Test\FunctionList\[langName]\ 中,添加一个与测试类别相关的目录(名称可自定义)。

  3. 将测试文件命名为 unitTest,复制到该新目录中。

  4. 打开cmd,进入 [YOUR_SOURCES_DIR]\notepad-plus-plus\PowerEditor\Test\FunctionList\ 目录,执行命令:..\..\bin\notepad++.exe -export=functionList -l[langName] .\[langName]\[yourTestDir2]\unitTest(将[yourTestDir2]替换为新目录名)。

  5. 在新目录中会生成 unitTest.result.json 文件,将其重命名为 unitTest.expected.result。

4. 创建并提交拉取请求

根据Notepad++的贡献规则,“所有拉取请求需关联到GitHub上的某个问题”,具体步骤如下:
  1. 创建一个GitHub问题,说明需要改进(已有解析器)或添加(无解析器)目标语言的函数列表,并注明你已准备好解析器规则,将提交拉取请求。

  2. 通过GitHub界面,从你的分叉仓库创建拉取请求,合并到主仓库。

  3. 等待开发者反馈,并根据反馈调整解析器规则,直至拉取请求被接受或拒绝。


«    2026年4月    »
12345
6789101112
13141516171819
20212223242526
27282930
搜索
控制面板
您好,欢迎到访网站!
  查看权限
网站分类

Powered By Z-BlogPHP 1.7.5

Copyright Your WebSite.Some Rights Reserved.