几个vim标签插件之间的差异

时间:2014-08-14 05:55:17

标签: python ruby vim ctags gnu-global

实际上我有两个问题。

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

  1. C标签
  2. GNU Global a.k.a. gtags
  3. 我想知道哪一个更适合我的日常工作集中在Ruby,Rails,JavaScript和Python上。即,动态语言。 我用Google搜索了一下,似乎gtags在某种程度上等同于ctags + cscope?

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

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

      1. 这些插件之间是否有任何重叠?
      2. 如果有重叠,如何整合它们或如何选择使用哪一个?
      3. 我知道在一篇SO帖子中提出两个问题并不好,但我认为这两个问题高度相关,因为它们对于Vim + Tags组合至关重要。 希望这个问题可以作为想要使用标签但不像我一样熟悉它的人的基础或教程。 (我找不到vim + ctags的“现代”教程,互联网上的大多数帖子都是过时的IMO)

        感谢。

        更新

        基本上,我希望能够

        1. 跳转到某个功能的声明
        2. 跳转到使用某些功能
        3. 让自动完成功能更加智能化。我的意思是,如果我有

          class Obj
            def m1
              puts "hello"
            end
          end
          

          然后,当我输入m1时,我希望自动填充显示obj = Obj.new; obj.。 据我所知,YouCompleteMe可以使用ctags文件,但即使按照说明操作也无法设置。

        4. 老实说,我真的不知道ctags可以做什么或可以提供什么。所以请随意提出更多有用的功能。谢谢!

1 个答案:

答案 0 :(得分: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 ad更复杂一点,它的使用也有点复杂,但考虑到它的功能,这是非常符合逻辑的。

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

至于您列出的插件......

  1. 是的,#1和#3之间存在重叠。 #2不生成或使用tags文件。
  2. 试一试,阅读他们的文档并自行决定。
  3. 您甚至没有告诉我们您希望如何使用该功能?你在追求什么? tags代?跳转到使用?跳到声明?一个类似IDE的“类探险家”?所有这些?

    <强> 修改

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

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

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

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

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

    5. 请参阅:help ctags:help cscope,了解他们可以做些什么。