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

标签 javascript vim ctags taglist

我最近放弃了鼠标驱动的、特定于平台的 GUI 编辑器,并完全致力于 vim。到目前为止的体验非常棒,但我对 Javascript 感到困惑。

广受欢迎的 taglist 实用程序(使用 Exuberant Ctags)对除 Javascript 以外的所有东西都非常有用。由于该语言过于自由的形式和结构,当我打开它时,taglist 只能选择少数函数——只有那些以格式定义的函数:

function FUNCNAME (arg1, arg2) {

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

var myFunc = function (arg1, arg2) {

所以我用谷歌搜索了一下,找到了以下为 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 中。

感谢帮助!

最佳答案

明白了!我深入研究了 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 正则表达式添加了更多数组和对象定义。

关于javascript - 如何让 vim 的 taglist 插件显示对 javascript 有用的信息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1790623/

相关文章:

vim - 如何在 quickfix 窗口中浏览任何随机命令的输出?

oracle - PL/SQL 代码导航工具

linux - 使用 find 命令创建 ctags(用于代码导航)

c - 如何浏览C源代码?

javascript - IE 中的 HTTP 获取 JSON 问题,适用于 Chrome FF

javascript - 如何调整adminLTE模板中的header和navigation bar的高度?

javascript - PDF.JS 在客户端预览从服务器端发送的大型 pdf 文件(> 200MB)

javascript - 需要根据 .txt 文件中的数据创建 Google 图表

vim - 防止 (g)vim 自动缩进注释

vim - 如何使 %(跳转到匹配的括号)键忽略 Vim 中注释掉的代码