繁体   English   中英

如何让vim的taglist插件显示javascript的有用信息?

[英]How can I make vim's taglist plugin show useful information for javascript?

我最近放弃了鼠标驱动的,特定于平台的GUI编辑器,并完全致力于vim。 迄今为止的体验非常棒,但是当涉及到Javascript时我就陷入了困境。

广受欢迎的taglist实用程序(使用Exuberant Ctags)除了Javascript外,一切都很棒。 使用该语言过于自由的形式和结构,taglist只能在我打开时获取一些函数 - 只有以下格式定义的那些:

function FUNCNAME (arg1, arg2) {

但没有定义的变量或函数对象:

var myFunc = function (arg1, arg2) {

所以我google了一下,找到了ctags的以下定义集,我把它放在〜/ .ctags文件中:

--langdef=js
--langmap=js:.js
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/,object/
--regex-js=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/,function/
--regex-js=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*([^])])/\1/,function/
--regex-js=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/,array/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/,string/
--regex-js=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/,string/

之后,从命令行运行ctags非常棒。 它找到了我需要它找到的每个功能和对象。

问题是taglist.vim插件没有看到这些新结果。 当我在vim中打开我的javascript文件并点击:TlistToggle时,我得到了与之前相同的少量功能。 我点击'u'更新列表,没有任何效果。

深入taglist.vim,我发现了这个:

" java language
let s:tlist_def_java_settings = 'java;p:package;c:class;i:interface;' .
                               \ 'f:field;m:method'

" javascript language
let s:tlist_def_javascript_settings = 'javascript;f:function'

...这意味着我们只是从jta的ctags实用程序中查看一种特定类型的输出。 不幸的是,我对taglist或vim一般都不够精明(尚未)发现我可以做出哪些改变以使所有那些精彩的ctags命令行结果显示在vim中。

帮助赞赏!

得到它了! 我潜入taglist.vim代码一段时间了,这就是我发现的:

taglist.vim强制ctags使用vim正在使用的相同文件类型。 因此,即使我通过谷歌找到的〜/ .ctags片段将我急需的定义分配给新的“js”语言并将其应用于以.js结尾的文件,taglist也强制ctags使用“JavaScript”文件类型vim正在使用 - 它已经内置于ctags中。

解决方案是将〜/ .ctags文件从我上面发布的文件更改为:

--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Object\(/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\{/\1/o,object/
--regex-JavaScript=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/f,function/
--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*new[ \t]+Array\(/\1/a,array/
--regex-JavaScript=/([A-Za-z0-9._$]+)[ \t]*[:=][ \t]*\[/\1/a,array/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^""]'[^'']*/\1/s,string/
--regex-JavaScript=/([^= ]+)[ \t]*=[ \t]*[^'']"[^""]*/\1/s,string/

它直接改变了预先存在的JavaScript语言定义,而不是在ctags中创建新的语言定义。 现在,当taglib强制使用vim的已注册文件类型时,将使用新定义。 之前发布的〜/ .ctags行中也缺少了Al在他的回答中提到的“亲切”字母,所以这些也包括在我的更新版本中。

从那里,将以下内容放入〜/ .vimrc中以激活新类型:

let g:tlist_javascript_settings = 'javascript;s:string;a:array;o:object;f:function'

总而言之,新的正则表达式线并不完美 - 它们肯定需要进行一些调整以避免大量的误报,并且分离常量等可能会很好。 但现在,至少,我有能力做到这一点:)。

编辑:添加了有关如何在不编辑插件的情况下激活类型的说明,并大大改进了主要的ctags函数正则表达式,以避免一些误报。

编辑2:为ctags正则表达式添加了更多数组和对象定义。

我在谷歌搜索上遇到了这篇文章,尽管你的发现非常好,但我认为我们可以改进它们。 这是对您的解决方案进行一些黑客攻击的结果:

.ctags

--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = \[/\1/a,array/
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = \{/\1/o,object/
--regex-JavaScript=/^var[ \t]+([a-zA-Z0-9_$]+) = (^{^[)+/\1/r,var/
--regex-JavaScript=/^[ \t]*(this\.)?([A-Za-z0-9_$()]+)[ \t]*[:=][ \t]*function[ \t]*\(\)/\2/u,function/
--regex-JavaScript=/^[ \t]*function ([a-z0-9]+[A-Za-z0-9_]*)/\1/u,function/
--regex-JavaScript=/^[ \t]*([A-Za-z0-9]+)\.prototype\.([a-z0-9]+[A-Za-z0-9_]*)/\1 : \2/u,function/
--regex-JavaScript=/^[ \t]*function ([A-Z]+[A-Za-z0-9_]*)/\1/o,object/

的.vimrc

let g:tlist_javascript_settings = 'javascript;r:var;s:string;a:array;o:object;u:function'

这消除了一些误报,并添加了一些更多的功能,作为摆脱一些更有问题的正则表达式的权衡。 如果我发现我需要更多,我会不断更新。

编辑 :我现在已经完成了一切非常好的工作; 我觉得这个结果很稳固。 唯一的主要缺点是它不能用于逗号分隔的变量定义。 这似乎特别令人讨厌。 也许改天。 :)

另请注意,我更改了.vimrc。 这不是因为我是一个怪人; 这是因为某种方式taglist或ctags或某些东西有一些默认值设置,如果你不改变它,那么你会得到很多关于功能和变量的双打,这真的让我疯狂(我非常注重细节。 。:P)

编辑 :更多调整。 它现在接受了原型函数声明,并没有做其他一些愚蠢的事情。

最佳实践解决方案,也是使用Mozilla的DoctorJS (以前称为jsctags )在Vim中获取JavaScript源代码浏览/标记列表的全新且简单的方法。

有关详细信息,请参阅此问题的答案

请享用。 :)

我没有多少使用javascript或taglist,但通过:help taglist-extend ,看起来你的定义(如上所列)将javascript输出重命名为js,所以你可能需要像(在你的vimrc中):

let tlist_js_settings = 'js;f:function;m:method'

这假设ctags'种类'对于函数是'f'而对于方法是'm'。 查看您的代码文件,看看“种类”列的外观。 举例来说,我的C代码标签文件包含以下行:

ADC_CR1_AWDCH_0 .\LibraryModules\CMSIS\Headers\stm32f10x.h  2871;"  d

这是符号ADC_CR1_AWDCH_0#define ,它位于第2871行的列表文件中。“d”是已定义名称的ctags“种类”。 希望这会让你足够让你前进。

顺便说一句,我不确定覆盖是否会正常工作,因此可能值得命名您的文件'myfile.mjs'并将您的langmap更改为js:.mjs直到它正常工作。 那么至少你会知道你的问题是否与错误识别文件或实际解析有关。

嗨,感谢汤姆弗罗斯特的问题和研究,我认为最终答案的第四行正则表达式存在一些问题:

--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\]\)]*\)/\1/f,function/

不适合我,我拉了一下,现在工作正常:

--regex-JavaScript=/function[ \t]+([A-Za-z0-9._$]+)[ \t]*\([^\)]*\)/\1/f,function/

PD。 其他答案'这里发布的正则表达式至少对我来说根本不起作用: - ?

为了避免来自ctags内置的javascript支持的重复条目,我在原始帖子中定义'js'语言,并且帮助标记列表使用ctags。 我还确保从一些不太有用的位(引号,“this。”,“。protototype”)中删除标记名。 我不使用object / array / string / var regexps,但很容易将我的正则表达式与其他建议结合起来。

〜/ .ctags:

--langdef=js
--langmap=js:.js
--regex-js=/["']?(this\.)?([A-Za-z0-9_$]+)["']?((\.prototype)?(\.[A-Za-z0-9_$]+))?[ \t]*[:=][ \t]*function/\2\5/f,function/
--regex-js=/function[ \t]+([A-Za-z0-9_$]+)/\1/f,function/

的〜/ .vimrc:

let g:tlist_javascript_settings = 'js;f:function'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM