我最近放弃了鼠标驱动的,特定于平台的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'
...这意味着我们只是从ctags实用程序中查看javascript的一种特定输出。不幸的是,我对taglist或vim一般都不够精明(尚未)发现我可以做出哪些改变以使所有那些精彩的ctags命令行结果显示在vim中。
帮助表示赞赏!
答案 0 :(得分:21)
知道了!我潜入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正则表达式添加了更多数组和对象定义。
答案 1 :(得分:3)
我在谷歌搜索上遇到了这篇文章,虽然你的发现非常好,但我认为我们可以改进它们。这是对您的解决方案进行一些黑客攻击的结果:
<强> .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)
修改:更多调整。它现在接受了原型函数声明,并没有做其他一些愚蠢的事情。
答案 2 :(得分:2)
最佳实践解决方案,也是使用Mozilla的 DoctorJS (以前称为 jsctags )。
享受。 :)
答案 3 :(得分:1)
我没有多少使用javascript或taglist,但是查看:help taglist-extend
,看起来你的定义(上面列出的)将javascript输出重命名为js,所以你可能需要类似的东西(在你的vimrc中) ):
let tlist_js_settings = 'js;f:function;m:method'
这假设ctags'kind'对于函数是'f'而对于方法是'm'。查看您的代码文件,看看“种类”列的外观。举例来说,我的C代码标签文件包含以下行:
ADC_CR1_AWDCH_0 .\LibraryModules\CMSIS\Headers\stm32f10x.h 2871;" d
这是符号#define
的{{1}},位于第2871行的列表文件中。“d”是已定义名称的ctags“种类”。希望这会让你足以让你前进。
顺便说一句,我不确定覆盖是否能正常工作,所以可能值得命名你的文件'myfile.mjs'并将你的langmap更改为ADC_CR1_AWDCH_0
,直到它正常工作。那么至少你会知道你的问题是否与错误识别文件或实际解析有关。
答案 4 :(得分:1)
您好,感谢汤姆弗罗斯特的问题和研究,我认为最终答案的第四行正则表达式存在一些问题:
--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。其他答案'在这里发布的正则表达式至少对我来说根本不起作用: - ?
答案 5 :(得分:1)
为了避免在javascript支持中内置ctags的重复条目,我在原始帖子中定义'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'