2

我其实有两个问题。

首先,据我所知,有两个标签工具:

  1. 标签
  2. GNU Global 又名 gtags

如果我的日常工作集中在 Ruby、Rails、JavaScript 和 Python 上,我想知道哪个更合适。即,动态语言。我用谷歌搜索了一下,似乎 gtags 在某种程度上等同于 ctags + cscope?

其次,至于ctags,有一些vim插件:

  1. vim-tags:可以通过命令在 Vim 中生成标签文件:TagsGenerate
  2. tagbar:一个著名的插件。它似乎可以即时生成标签。
  3. vim-easytags:看起来像 vim-tags,但具有更多功能。

我在想

  1. 这些插件之间有重叠吗?
  2. 如果有重叠,如何整合或如何选择使用哪一个?

我知道在一篇 SO 帖子中有两个问题不好,但我认为这两个问题高度相关,因为它们对于 Vim+Tags 组合至关重要。希望这个问题可以作为像我一样想要使用标签但不熟悉它的人的基础或教程。(我找不到 vim+ctags 的“现代”教程,互联网上的大多数帖子都是过时的 IMO)

谢谢。

更新:

基本上,我希望能够

  1. 跳转到某个函数的声明
  2. 跳转到某个函数的用法
  3. 使自动完成更智能。我的意思是,如果我有

    class Obj
      def m1
        puts "hello"
      end
    end
    

    然后我希望m1在我键入时显示自动补全obj = Obj.new; obj.。据我所知,YouCompleteMe可以使用 ctags 的文件,但即使我按照说明进行设置,我也无法设置它。

老实说,我真的不知道 ctags 能做什么或能提供什么。因此,请随时提出更多有用的功能。谢谢!

4

1 回答 1

2

你现在可以忘记 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 仅限于“定义/声明”。

还有一些特定于语言的 ctags 变体通常会提供更合理的结果,例如jsctags (JavaScript)ripper-tags (Ruby)

另一方面,Cscope 可以“使用”并适用于您的所有语言。设置它比设置 ctags 复杂一点,它的使用也有点复杂,但考虑到它的功能,这是非常合乎逻辑的。

cscope 可能遇到的一个“问题”是,与 ctags 相比,围绕它编写的插件并不多。这是一个值得考虑的限制。

至于你列出的插件……</p>

  1. 是的,#1 和#3 之间有重叠。#2 不生成或使用tags文件。
  2. 尝试他们,阅读他们的文档并自己决定。

您甚至没有告诉我们您想如何使用该功能你追求什么?tags一代?跳转到用法?跳转到声明?类似 IDE 的“类资源管理器”?所有的?

编辑

让我谈谈您的评论和您的编辑:

  1. ctags 和 cscope 都允许您“跳转到声明”任意符号或(通过 cscope 的自定义映射和设置)光标下的符号。

  2. 只有 cscope 允许您“跳转到使用”。

  3. Ctags 本身有点愚蠢,而您使用高度动态的语言使 ctags 对于完成目的有点无用。不过,有些语言比其他语言有更好的支持,因此您可能会发现一些有用的第三方插件,例如jedi-vimTern for Vim

  4. TagList 和 TagBar 不生成tags 文件,但它们运行确实运行 ctags 并使用其输出。他们只是不将其写入磁盘。所以是的,你可以使用这些插件“跳转到声明”,但它们仍然与 Vim 的内置 ctags 支持隔离,这可能会导致问题。

看看:help ctags:help cscope了解他们能做什么。

于 2014-08-14T07:40:00.627 回答