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

Tom*_*ost 14 javascript vim ctags taglist

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

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

function FUNCNAME (arg1, arg2) {
Run Code Online (Sandbox Code Playgroud)

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

var myFunc = function (arg1, arg2) {
Run Code Online (Sandbox Code Playgroud)

所以我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/
Run Code Online (Sandbox Code Playgroud)

之后,从命令行运行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'
Run Code Online (Sandbox Code Playgroud)

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

帮助赞赏!

Tom*_*ost 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/
Run Code Online (Sandbox Code Playgroud)

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

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

let g:tlist_javascript_settings = 'javascript;s:string;a:array;o:object;f:function'
Run Code Online (Sandbox Code Playgroud)

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

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

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