最近我放弃了鼠标驱动的平台具体的GUI编辑和承诺完全vim。在迄今的经验已经太棒了,但我被困时候Javascript。

曾经流行的taglist用(使用旺盛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插件是不是看到这些新的结果。当我打开我的javascript文件在vim和打击: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.现在,当标签库部队vim的注册文件类型,该新定义使用。还缺少以前发布的~/.ctags行是"种类"的信,人提到在他的回答,所以这些都包含在我的更新版本。

从那里降下到你~/.vimrc激活新的类型:

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

所有在所有新regex线不是完美的-他们肯定会需要一些调整,以避免一个很大的误报,并且它可能是好的,分开的常数等。但至少现在我有能力做到这一点:).

编辑: 加说明如何激活类型未经编辑的插件,并大大改进主要ctags功能regex,以避免一些假阳性。

编辑2: 加入多数组和对象定义的ctags regex.

其他提示

我遇到这个职位上谷歌搜索,尽管你的结论是优秀的,我认为我们可以改善他们。这是结果的一位黑客对你的解决方案:

.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'

这个摆脱了一些更多的误报,并增加了一些更多的功能,作为一个折衷于摆脱一些更大的问题regex.我会继续更新如果我找到我需要的更多。

编辑:我已经得到的一切工作真的很好现在;我觉得这一结果是坚实的。唯一的主要缺陷是它不工作上的逗号分隔的变量的定义。这似乎特别讨厌。也许一天。:)

还注意到,我改变了。vimrc.这不是因为我是个怪物;这是因为在某种程度上taglist或ctags或东西有某些缺省值,和如果你不改变它,然后你会得到很大的加倍在功能和增值关注的是,这真使我疯狂(I支付超注意细节。。:P)

编辑:更多的调整。它拿上的原型功能的声明现在,并且没有做其他一些愚蠢的东西。

最佳做法的解决方案,这也是非常新的、简洁和方便的方式得到JavaScript源码浏览/标记名单中Vim,使用Mozilla的 DoctorJS (以前称为 jsctags).

看到我的回答对于这个问题的更多信息.

享受。:)

我不用javascript或taglist多,但是寻找过 :help taglist-extend, 它看起来像你的定义(上面列出)重新命名javascript输出到js,所以你可能会需要喜欢的东西(在你vimrc):

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

这是假设ctags'种'是'f'功能和'm'的方法。看看标签的文件,看看什么的'种'栏看起来像。通过举例的方式,我的代码标签的文件包括这一行:

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

这是一个 #define 一个符号 ADC_CR1_AWDCH_0, ,其中列出的文件的在线2871.'D'是ctags'种'定义的名称。我们希望,这将给你足够让你去。

作为旁白,我不确定是否复盖将正常工作,所以它可能是值得的命名你的文件'myfile.mjs'和改变你的langmap到 js:.mjs 直到它的正常工作。然后至少你会知道是否你的问题是相关联的错误识别的文件或实际的分析。

嗨谢谢你汤姆霜对于他的问题和研究,我认为有一个小问题的第4行regexp你的最终答案:

--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。其他的答案'regexp张贴在这里,不工作,在所有的至少对我来说:-?

为了避免重复的项目从ctags'建立在javascript支持我定义的"j"的语言在原来的职位,并帮助taglist使用ctags。我也确保tagnames被剥夺了从一些不太有用的位(报价"这个.", ".原型").我不要使用对象/array/string/var regexp,但它很容易地结合我regexp与其他建议。

~/.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归因
不隶属于 StackOverflow
scroll top