我在Win7上安装了Notepad ++,版本为7.3.3和7.4.2,两个版本我打开一个javascript文件,navitage到View> FunctionList
功能列表显示为空白。
我在sourcefourge上发现了另一个函数列表,插件版本2.1有点工作,但是,我必须更新语言规则并按"尝试!"每个JS代码文件的按钮,然后出现功能。
请问,是否有人知道如何安装Notepad ++并让FunctionList适用于.js?
我没有使用AppData,我将所有notepad ++文件安装到notepad ++目录中。
答案 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)
前面的字符不是for
,if
或while
,我们就可以假定这是函数名称。否则,通过尝试匹配字符串"failtomatch"
(可能不是您函数的实际名称),导致整个匹配失败(同样如果您的函数名称以for
,if
开头)或while
也将被丢弃。)答案 3 :(得分:0)
最后!我设法使函数列表同时使用“原型”语法和ECMAScript 6“类”语法进行对象声明。为此,我使用了this thread for prototype syntax 和typescript 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