Notepad ++使FunctionList与.js一起使用

时间:2017-07-11 16:03:58

标签: notepad++

我在Win7上安装了Notepad ++,版本为7.3.3和7.4.2,两个版本我打开一个javascript文件,navitage到View> FunctionList

功能列表显示为空白。

我在sourcefourge上发现了另一个函数列表,插件版本2.1有点工作,但是,我必须更新语言规则并按"尝试!"每个JS代码文件的按钮,然后出现功能。

请问,是否有人知道如何安装Notepad ++并让FunctionList适用于.js?

我没有使用AppData,我将所有notepad ++文件安装到notepad ++目录中。

4 个答案:

答案 0 :(得分:5)

您希望此< parser> 用于javascript。它位于文件 functionlist.xml 中,位于NPP的安装目录中,或者您要修改的AppData中的某个位置。这不处理所有情况(函数头中的注释),但大多数情况下。

此外, langID 的javascript数量为 19 ,而不是 58 。您的问题看起来像 langID ,但在此问题解决后,您将检测到您需要适应的< parser&gt ;.

关联ID在这里,并且必须同时在文件 functionlist.xml 中:

<association id=  "javascript_function"   langID="58"                          />
<association id=  "javascript_function"   langID="19"                          />

解析器在这里,改编我:

<parser
    displayName="JavaScript"
    id         ="javascript_function"
    XcommentExpr="(?s:/\*.*?\*/)|(?m-s://.*?$)"


    bemerkung1="für Kommentar zwischen function header und {. [\n\s]*\{ am Ende gelöscht."
    bemerkung2="für new Function(...)  (?:new\s*)? eingefügt."
    bemerkung3="für function (a,b,c) ohne Funktionsname ein \s* eingefügt."
    bemerkung4="Kommentar im Funktionsheader wird nicht behandelt, z.B. function /*returns real*/ a(b) { } "
    bemerkung5="commentExpr überhaupt X-ed."
    bemerkung99="Es muss etwas falsch sein mit commentExpr durch nichts ersetzen."

    comment1="Comment between function header and function body {: removed [\n\s]*\{ "
    comment2="new Function(): inserted (?:new\s*)? "
    comment3="function (a,b,c) without function name: inserted \s*" 
    comment4="Comment within function header still not handled. e.g. function /*returns real*/ a(b) { } "
    comment5="commentExpr disabled: X-ed."
    comment99="There must be something wrong with replacing commentExpr by nothing."

>
<function
    mainExpr="((^|\s+|[;\}\.])([A-Za-z_]\w*\.)*[A-Za-z_]\w*\s*[=:]|^|[\s;\}]+)\s*(?:new\s*)?function(\s+[A-Za-z_]?\w*\s*\([^\)\(]*\)|s*\([^\)\(]*\))"
>
    <functionName>
        <nameExpr expr="[A-Za-z_]\w*\s*[=:]|[A-Za-z_]?\w*\s*\(" />
        <nameExpr expr="[A-Za-z_]?\w*" />
    </functionName>
    <className>
        <nameExpr expr="([A-Za-z_]\w*\.)*[A-Za-z_]\w*\." />
        <nameExpr expr="([A-Za-z_]\w*\.)*[A-Za-z_]\w*" />
    </className>
</function>
</parser>

答案 1 :(得分:1)

在7.5.7版中,我按照上面彼得的回答中概述的步骤进行操作,但在安装notepad ++的目录(对我而言C:\ Program Files(x86)\ Notepad ++)中编辑了functionList.xml,并删除了旧的functionList.xml在%APPDATA%\ Notepad ++中(另请参见https://github.com/notepad-plus-plus/notepad-plus-plus/issues/4697

答案 2 :(得分:0)

我在记事本7.6.6的最佳答案中没有获得成功,因此请在下面进行选择。

我想捕获class内部的功能(在ECMAScript 2015中引入;请参见MDN docs),因此它不能依靠function关键字来触发匹配。

我在下面介绍的解析器是一个讨厌的hack,不能在所有情况下都起作用,并且偶尔会产生错误匹配。但是,这已经为我完成了工作,而且我在网上其他任何地方都找不到更好的方法……我希望它能对某人有所帮助:)


    <parser
        displayName="JavaScript"
        id         ="javascript_function"
        commentExpr="(?s:/\*.*?\*/)|(?m-s://.*?$)"
    >
        <function
            mainExpr="((^|\s+|[;\}\.])([A-Za-z_$][\w$]*\.)*[A-Za-z_$][\w$]*\s*[=:]|^|[\s;\}]+)\s*((function)|[$\t]*)(?(?![\s]*(for|if|while))(\s+[A-Za-z_$][\w$]*)?|(failtomatch))\s*\([^\)\(]*\)[\n\s]*\{"
        >
            <functionName>
                <nameExpr expr="[A-Za-z_$][\w$]*\s*[=:]|[A-Za-z_$][\w$]*\s*\(" />
                <nameExpr expr="[A-Za-z_$][\w$]*" />
            </functionName>
            <className>
                <nameExpr expr="([A-Za-z_$][\w$]*\.)*[A-Za-z_$][\w$]*\." />
                <nameExpr expr="([A-Za-z_$][\w$]*\.)*[A-Za-z_$][\w$]*" />
            </className>
        </function>
    </parser>

我对mainExpr正则表达式所做的更改具有以下效果

  • (function)|[$\t]*)不仅仅是检查关键字function是否出现在函数名称之前,还允许使用零个或多个结束线或制表符来表示函数的开始。
  • (?(?![\s]*(for|if|while))(\s+[A-Za-z_$][\w$]*)?|(failtomatch))然后,只要出现在(...arguments)前面的字符不是forifwhile,我们就可以假定这是函数名称。否则,通过尝试匹配字符串"failtomatch"(可能不是您函数的实际名称),导致整个匹配失败(同样如果您的函数名称以forif开头)或while也将被丢弃。)
  • 希望发布此内容可以使某人更好地解决此问题-我尽我所能,对正则表达式:P
  • 的了解有限

答案 3 :(得分:0)

最后!我设法使函数列表同时使用“原型”语法和ECMAScript 6“类”语法进行对象声明。为此,我使用了this thread for prototype syntaxtypescript detection for EC6 class Syntax

结果在那里:

<parser
    displayName="JavaScript"
    id         ="javascript_function"
    commentExpr="(?s:/\*.*?\*/)|(?m-s://.*?$)"
>


    <!-- <classRange>, ES6 "class" Syntax inspired of typescript : https://github.com/chai2010/notepadplus-typescript/blob/master/functionList.xml   -->
    <classRange
        mainExpr="^\s*(export\s+)?(class|interface)\s+\w+\s*((extends|implements)\s+(\w|\s|,|\.|[^{])*)?\{"
        openSymbole = "\{"
        closeSymbole = "\}"
        displayMode="node">
        <className>
            <nameExpr expr="(export\s+)?(class|interface)\s+\w+"/>
            <nameExpr expr="(class|interface)\s+\w+"/>
            <nameExpr expr="\s+\w+"/>
            <nameExpr expr="\w+"/>
        </className>
        <!-- Indent only support tab/2space/4space!!! -->
        <!-- tab/2space is best choice!  -->
        <!-- regexp: ^(\t|[ ]{2,4})  -->
        <function
            mainExpr="(^(\t|[ ]{2,4})((static)\s+)+\w+\s*(\(|\=|:|\?))|(^(\t|[ ]{2,4})\w+\s*(\(|:|\=|\?))">
            <functionName>
                <funcNameExpr expr="(^(\t|[ ]{2,4})((static)\s+)+\w+\s*(\(|\=|:|\?))|(\w+\s*(\(|:|\=|\?))"/>
                <funcNameExpr expr="(\s+\w+\s*(\(|\=|:|\?))|(\w+\s*(\(|:|\=|\?))"/>
                <funcNameExpr expr="(\s+\w+\s*(\(|\=|:|\?))|(\w+)"/>
                <funcNameExpr expr="(\s+\w+)|(\w+)"/>
                <funcNameExpr expr="\w+"/>
            </functionName>
        </function>
    </classRange>


    <!-- <classRange>, "prototype" syntax imported from :https://community.notepad-plus-plus.org/topic/8647/configure-function-list-to-show-javascript-class-functions-created-with-prototype -->
    <classRange 
        mainExpr="^[\t ]*([_A-Za-z]?[\w_]*)(\.prototype)+[\s]+(=)+[\s]*\{" openSymbole = "\{" closeSymbole = "\}" displayMode="node"
    >
        <className>
            <nameExpr expr="[_A-Za-z]+[\w_]*"/>
        </className>
        <function mainExpr="^[\t ]*([_A-Za-z]?[\w_])+[\s]*+:+[\s]*+function+[\s]*\("> 
            <functionName>
                <funcNameExpr expr="^[\t ]*([_A-Za-z]?[\w_]*)"/>
            </functionName>
            </function>
    </classRange>


    <!-- Orgiginal notepad++ functionlist -->
    <function
        mainExpr="((^|\s+|[;\}\.])([A-Za-z_$][\w$]*\.)*[A-Za-z_$][\w$]*\s*[=:]|^|[\s;\}]+)\s*function(\s+[A-Za-z_$][\w$]*)?\s*\([^\)\(]*\)[\n\s]*\{"
    >
        <functionName>
            <nameExpr expr="[A-Za-z_$][\w$]*\s*[=:]|[A-Za-z_$][\w$]*\s*\(" />
            <nameExpr expr="[A-Za-z_$][\w$]*" />
        </functionName>
        <className>
            <nameExpr expr="([A-Za-z_$][\w$]*\.)*[A-Za-z_$][\w$]*\." />
            <nameExpr expr="([A-Za-z_$][\w$]*\.)*[A-Za-z_$][\w$]*" />
        </className>
    </function>

</parser>

使用notepad ++ v7.8.1测试 要编辑的功能列表在这里:C:\ Users [YourSessionUser] \ AppData \ Roaming \ Notepad ++ \ functionList.xml