我实际上有两个问题。
首先,据我所知,有两个标签工具:
标签
GNU全球a.k.a. gtags
我想知道如果我的日常工作集中在Ruby,Rails,JavaScript和Python上,哪一种更合适。即,动态语言。
我已经用Google搜索了一下,看来gtags在某种程度上等效于ctags + cscope?
其次,关于ctags,有一些vim插件:
vim-tags:它可以通过命令:TagsGenerate
在Vim中生成标签文件。
tagbar:著名的插件。看来它可以即时生成标签。
vim-easytags:看起来像vim标签,但具有更多功能。
我很好奇
这些插件之间是否有重叠?
如果存在重叠,如何整合它们或如何选择使用哪一个?
我知道在一个SO帖子中有两个问题不是很好,但是我认为这两个问题是高度相关的,因为它们对于Vim + Tags组合至关重要。
希望这个问题可以为希望使用标签但不像我一样熟悉标签的人们提供基础或教程。 (我找不到vim + ctags的“现代”教程,互联网上的大多数帖子都已经过时了IMO)
谢谢。
更新:
基本上,我希望能够
跳转到某些功能的声明
跳转到某些功能的用法
使自动补全更加智能。我的意思是,如果我有
class Obj
def m1
puts "hello"
end
end
那么我想在输入
m1
时自动补全显示obj = Obj.new; obj.
。据我所知,YouCompleteMe可以使用ctags的文件,但是即使遵循指示,我也无法设置它。
老实说,我真的不知道ctags可以做什么或可以提供什么。因此,请随时提出更多有用的功能。谢谢!
最佳答案
您现在可能会忘记GNU GLOBAL,因为–上次检查时–它根本不支持JavaScript。我不了解Ruby和Python,但对它进行测试应该不难。
Ctags可与JavaScript(及其他)一起使用,但它不喜欢编写JavaScript的“现代”方式(内联回调,滥用的文字对象,自调用函数等)。您可以通过在~/.ctags
文件中添加以下几行来有所帮助:
--langmap=javascript:.js
--regex-javascript=/([A-Za-z0-9._$()]+)[ \t]*[:=][ \t]*function[ \t]*\(/\1/F,function,functions/
--regex-javascript=/function[ \t]*([A-Za-z0-9._$()]+)[ \t]*\(/\1/F,function,functions/
--regex-javascript=/([A-Za-z0-9._$]+)[ \t]*=[ \t]*\{/\1/o,object,objects/
--regex-javascript=/^[ \t]*([A-Za-z0-9._$]+)[ \t]*[:][ \t]*[^\{]/\1/p,property,properties/
--regex-javascript=/^[ \t]+var[ \t]*([A-Za-z0-9._$]+)[ \t]*=[ \t]*[\d"'\[]/\1/v,variable,variables/
这些对我有用,但是我的JavaScript确实有点“老派”。请注意,ctags仅限于“定义/声明”。
还有一些特定于语言的ctag变体,通常会给出更明智的结果,例如jsctags (JavaScript)或ripper-tags (Ruby)
另一方面,Cscope可以“使用”并适用于所有语言。设置它比设置ctags涉及更多的工作,它的用法也更复杂,但是考虑到它的功能,这很合逻辑。
cscope可能有一个“问题”,就是与ctags相比,围绕它编写的插件并不多。这是一个值得考虑的限制。
至于您列出的插件…
是的,#1和#3之间有重叠。 #2不会生成或使用
tags
文件。试试看,阅读他们的文档,然后自己决定。
您甚至没有告诉我们您想如何使用该功能?你要干嘛
tags
一代?跳转到用法?跳转到声明?类似IDE的“类资源管理器”?所有的?编辑
让我谈谈您的评论和您的修改:
ctags和cscope都允许您“跳到声明”任意符号或光标下的符号(通过cscope的自定义映射和设置)。
只有cscope允许您“跳转到用法”。
Ctags本身有点笨,而您使用高度动态的语言会使Ctags对于完成目的有点用处。但是,某些语言比其他语言具有更好的支持,因此您可能会找到一些有用的第三方插件,例如jedi-vim或Tern for Vim。
TagList和TagBar不会生成
tags
文件,但它们会运行ctags并消耗其输出。他们只是不将其写入磁盘。所以,是的,您可以使用这些插件“跳转至未成年人”,但它们仍与Vim内置的ctags支持隔离,可能会导致问题。请参见
:help ctags
和:help cscope
来了解他们可以做什么。