为 Perl 配置 Notepad++ "Function List"
Configuring Notepad++ "Function List" for Perl
我正在尝试在 notepad++ (v 6.7.5) 上使用 类(或包,用 perl 的说法)为 Perl 工作的 "Fucntion List" 功能。默认只支持包外的常规子程序。
下面是函数列表配置文件中的 XML 片段(位于我的 windows 机器上的 C:\Users\user\AppData\Roaming\Notepad++\functionList.xml )。我自己在默认 "function" 节点之上添加了 "classRange" 节点。
编辑:下面是更正后的 XML,感谢用户 stribizhev
更新:我注释掉了 "normal" 函数部分,因为它导致我的所有方法在函数列表中出现两次。
<parser id="perl_function" displayName="Perl">
<classRange mainExpr="^package.*?(?=\npackage|\Z)">
<className>
<nameExpr expr="\s\K[^;]+"/>
</className>
<function mainExpr="^[\s]*(?<!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{" displayMode="$className->$functionName">
<functionName>
<funcNameExpr expr="(sub[\s]+)?\K[\w]+"/>
</functionName>
</function>
</classRange>
<!--
<function mainExpr="^[\s]*(?<!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{" displayMode="$className->$functionName">
<functionName>
<nameExpr expr="(sub[\s]+)?\K[\w]+"/>
</functionName>
</function>
-->
</parser>
这方面的文档是 here。
很可能,您应该使用 funcNameExpr
而不是 nameExpr
:
示例:
<functionName>
<funcNameExpr expr="(sub[\s]+)?\K[\w]+"/>
</functionName>
我在 Notepad++ 6.8.1 中尝试了您的 XML,虽然它确实适用于带有 'packages' 的 Perl,但我没有包的纯脚本现在无法生成子程序。我取消注释您注释掉的行并解决了该问题,但确实表现出您提到的行为 - 在 'packages'.
中加倍了潜艇
我发现下面的效果很好,甚至忽略了 POD 中的 subs(可能作为示例用法存在),因此它们没有添加到列表中:
<parser id="perl_function" displayName="Perl" commentExpr="(#.*?$|(__END__.*\Z))">
<classRange mainExpr="(?<=^package).*?(?=\npackage|\Z)">
<className>
<nameExpr expr="\s\K[^;]+"/>
</className>
<function mainExpr="^[\s]*(?<!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{">
<functionName>
<funcNameExpr expr="(sub[\s]+)?\K[\w]+"/>
</functionName>
</function>
</classRange>
<function mainExpr="^[\s]*(?<!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{">
<functionName>
<nameExpr expr="(?:sub[\s]+)?\K[\w]+"/>
</functionName>
</function>
</parser>
funcNameExpr 或取消注释对我不起作用。什么有效 - 用括号注释掉三个正则表达式行:
#\(
#[^()]*
#\)
由于 Perl 不考虑函数名正确后的括号,所以我没有这样的。括号可以在函数的每次调用处,但不能在函数所在的位置。
我正在尝试在 notepad++ (v 6.7.5) 上使用 类(或包,用 perl 的说法)为 Perl 工作的 "Fucntion List" 功能。默认只支持包外的常规子程序。
下面是函数列表配置文件中的 XML 片段(位于我的 windows 机器上的 C:\Users\user\AppData\Roaming\Notepad++\functionList.xml )。我自己在默认 "function" 节点之上添加了 "classRange" 节点。
编辑:下面是更正后的 XML,感谢用户 stribizhev
更新:我注释掉了 "normal" 函数部分,因为它导致我的所有方法在函数列表中出现两次。
<parser id="perl_function" displayName="Perl">
<classRange mainExpr="^package.*?(?=\npackage|\Z)">
<className>
<nameExpr expr="\s\K[^;]+"/>
</className>
<function mainExpr="^[\s]*(?<!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{" displayMode="$className->$functionName">
<functionName>
<funcNameExpr expr="(sub[\s]+)?\K[\w]+"/>
</functionName>
</function>
</classRange>
<!--
<function mainExpr="^[\s]*(?<!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{" displayMode="$className->$functionName">
<functionName>
<nameExpr expr="(sub[\s]+)?\K[\w]+"/>
</functionName>
</function>
-->
</parser>
这方面的文档是 here。
很可能,您应该使用 funcNameExpr
而不是 nameExpr
:
示例:
<functionName>
<funcNameExpr expr="(sub[\s]+)?\K[\w]+"/>
</functionName>
我在 Notepad++ 6.8.1 中尝试了您的 XML,虽然它确实适用于带有 'packages' 的 Perl,但我没有包的纯脚本现在无法生成子程序。我取消注释您注释掉的行并解决了该问题,但确实表现出您提到的行为 - 在 'packages'.
中加倍了潜艇我发现下面的效果很好,甚至忽略了 POD 中的 subs(可能作为示例用法存在),因此它们没有添加到列表中:
<parser id="perl_function" displayName="Perl" commentExpr="(#.*?$|(__END__.*\Z))">
<classRange mainExpr="(?<=^package).*?(?=\npackage|\Z)">
<className>
<nameExpr expr="\s\K[^;]+"/>
</className>
<function mainExpr="^[\s]*(?<!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{">
<functionName>
<funcNameExpr expr="(sub[\s]+)?\K[\w]+"/>
</functionName>
</function>
</classRange>
<function mainExpr="^[\s]*(?<!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{">
<functionName>
<nameExpr expr="(?:sub[\s]+)?\K[\w]+"/>
</functionName>
</function>
</parser>
funcNameExpr 或取消注释对我不起作用。什么有效 - 用括号注释掉三个正则表达式行:
#\(
#[^()]*
#\)
由于 Perl 不考虑函数名正确后的括号,所以我没有这样的。括号可以在函数的每次调用处,但不能在函数所在的位置。