为Perl配置Notepad ++"函数列表"

bea*_*asy 5 regex xml perl notepad++

我正在努力获得notepad ++(v 6.7.5)上的"Fucntion List"功能,这个功能适用于带有类的Perl(或perl用语中的包).默认情况下,仅支持包外的常规子例程.

下面是功能列表配置文件中的XML代码段(位于我的Windows机器上的C:\ Users\user\AppData\Roaming\Notepad ++\functionList.xml).我自己在默认的"function"节点上添加了"classRange"节点.

编辑:由于用户stribizhev,下面是更正的XML

更新:我已经注释掉了"普通"功能部分,因为它导致我的所有方法在功能列表中出现两次.

<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>
Run Code Online (Sandbox Code Playgroud)

这方面的文档就在这里.

小智 5

我在Notepad ++ 6.8.1中尝试了您的XML,尽管它确实适用于带有“程序包”的Perl,但是没有程序包的普通脚本现在无法生成子程序。我对您注释掉的行未加注释,它解决了该问题,但确实表现出您提到的行为-将“程序包”中的子程序加倍。

我发现以下方法很好地工作,甚至忽略了POD中的潜艇(可能在此处用作示例用法),因此没有将它们添加到列表中:

        <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>
Run Code Online (Sandbox Code Playgroud)


Wik*_*żew 3

最有可能的是,您应该使用funcNameExpr而不是nameExpr

例子:

<functionName>
    <funcNameExpr expr="(sub[\s]+)?\K[\w]+"/>
</functionName>
Run Code Online (Sandbox Code Playgroud)