为 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]*(?&lt;!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{" displayMode="$className->$functionName">
            <functionName>
                <funcNameExpr expr="(sub[\s]+)?\K[\w]+"/>
            </functionName>
        </function>
    </classRange>
    <!--
    <function mainExpr="^[\s]*(?&lt;!#)[\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="(?&lt;=^package).*?(?=\npackage|\Z)">
                <className>
                    <nameExpr expr="\s\K[^;]+"/>
                </className>
                <function mainExpr="^[\s]*(?&lt;!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{">
                    <functionName>
                        <funcNameExpr expr="(sub[\s]+)?\K[\w]+"/>
                    </functionName>
                </function>
            </classRange>
            <function mainExpr="^[\s]*(?&lt;!#)[\s]*sub[\s]+[\w]+[\s]*\(?[^\)\(]*?\)?[\n\s]*\{">
                <functionName>
                    <nameExpr expr="(?:sub[\s]+)?\K[\w]+"/>
                </functionName>
            </function>
        </parser>

funcNameExpr 或取消注释对我不起作用。什么有效 - 用括号注释掉三个正则表达式行:

#\(
#[^()]*
#\)

由于 Perl 不考虑函数名正确后的括号,所以我没有这样的。括号可以在函数的每次调用处,但不能在函数所在的位置。