【问题标题】:Alternatives to Ctags/Cscope with Objective-c?使用 Objective-c 替代 Ctags/Cscope?
【发布时间】:2011-02-27 10:51:10
【问题描述】:

在支持 Objective-c 的情况下,是否有 ctags 和 cscope 的替代品。这确实与可可开发有关,所以我似乎不可避免地会使用 Xcode(并且可能应该)。我只是想知道我的 Vim 选项是什么。

也许有某种类型的插件系统,比如 eclim,但是对于 xcode?​​p>

编辑

看来,除了更新 ctags 来支持 Objective-c 之外,我很不走运。有谁知道cscope是否一样?

【问题讨论】:

  • 回答可能有点晚了,但是已经提出了几个补丁来添加对 ctags 的客观 C 支持,所以应该是下一个版本。至于什么时候发布,那是一个完全不同的问题……
  • 主干中现在有一个正在工作的Objective C解析器......看我的回答
  • 现在使用Universal Ctags 维护最多的ctags

标签: objective-c xcode vim ctags cscope


【解决方案1】:

AFAIK,ctags 支持您为新语言定义一些规则,我在使用 laszlo(类似于 flex)进行一些开发时这样做了。您可以阅读 ctags 的手册页以获取更多详细信息,这并不难。

发现cocoa下有个vim文件类型插件支持开发here,希望对你有帮助。

【讨论】:

    【解决方案2】:

    objective-c 有一个使用 ctags 的选项。您可以在 ctags 模式下使用 etags。 etags是前段时间从ctags衍生出来的,在其源代码中会通过定义某个宏开关来生成ctags兼容的标签。

    事实上,Mac Os 的手册页已经在同一页中记录了 etags 和 ctags。它指出 ctags 支持objective-c。您应该能够使用以下命令生成标记文件: ctags -l objc *.[mh]

    不幸的是,Mac OS 中的 ctags 程序的行为与记录中的不同,因为 Apple 搞砸了它。然而,我设法使用 Ubuntu Linux 安装了这种 ctags,效果很好!!!在那里你必须安装 emacs22-bin-common 包。

    所以在 Mac OS 下你所要做的就是自己编译这个包。

    • 下载相应的源码包,例如来自 Debian 服务器 (link)。
    • 解压并切换到源目录
    • 运行./configure
    • configure 因找不到 lispref 而返回错误
    • 我删除了已创建文件 config.status 中变量 config_files 中的所有目标,尽管有 lib-src 的目标
    • 运行./config.status
    • cd lib-src
    • 制作
    • 复制 ctags,例如到 /usr/local/bin 并更改权限
      • sudo cp ctags /usr/local/bin
      • chmod a+rx /usr/local/bin/ctags

    你已经完成了。快乐标记!!!

    【讨论】:

      【解决方案3】:

      建议另一个答案:您可以相当轻松地使用 MacPorts 安装 EMACS,它将在 /opt/local/bin 中包含一个 etags 版本,其中编译了 Objective-C 支持。

      % sudo port install emacs
      % find . -name ‘*.[hm]’ -print0 | xargs −0 /opt/local/bin/etags
      

      然后在vim里面:

      :setlocal tags=TAGS
      

      这对我来说很适合 MacVim。

      【讨论】:

      • 但是 etags 会创建一个合适的标签文件来使用 VIM。我在 Emacs 中瘫痪了
      • 是的。我不使用 EMACS,只使用 vi、vim 或 MacVim。
      【解决方案4】:

      在这个问题“playing”用 vim 之后很长时间,我想要 ObjC 支持,尤其是 taglist 插件。我找到了那个问题,然后挖了一下,这里有一个不太脏的解决方案:

      1. ObjectiveC 解析器has been added to Exuberant CTags trunk,尚未发布(还没有?)
      2. 您可以通过自制软件轻松地将其安装在 OSX 上:

        $ brew install ctags --HEAD

      3. 注意,使用 ctags 时,.m 被视为 Matlab,.h 被视为 C++。要覆盖,请使用:

        $ ctags --langmap=ObjectiveC:.m.h

      4. 然后我在我的.vimrc 中添加了类似的内容以支持 taglist:

        let tlist_objc_settings = 'ObjectiveC;P:protocols;i:interfaces;types(...)'

        从该列表中添加您感兴趣的任何类型:

        ctags --list-kinds=all
        ObjectiveC
            i  class interface
            I  class implementation
            p  Protocol
            m  Object's method
            c  Class' method
            v  Global variable
            F  Object field
            f  A function
            p  A property
            t  A type alias
            s  A type structure
            e  An enumeration
            M  A preprocessor macro
        

      我希望这会对某人有所帮助!

      【讨论】:

      • 即使使用最新的 ctags 也有问题:现在生成了标签文件,但 taglist 不显示任何内容。你知道出了什么问题吗?
      • 检查 1. 您的标签已加载到该列表中 :set tags 2. 您已设置 taglist 设置 :let tlist_objc_settings (请参阅我的回答的第 4 点) 3. taglist 将自动显示打开的标签缓冲区 4. 即使没有 taglist,您也可以使用标准 vim 命令检查您的标签是否正常,例如跳转到标签查看 :help tags
      • 谢谢你,你让我很开心!它终于起作用了 :-) 最初标签使用标准 vim 命令工作,但在 taglist 中没有,在更改设置后,每次打开 taglist 时它都会停止。所以最后我删除了我拥有的 ctags(我已经从 github 安装了它们,虽然它已经足够新了)并按照你最初的建议使用 brew 重新安装......瞧!如果有人有类似的症状,希望这会有所帮助。
      • 好消息!我忘记了检查标签是否正确生成的简单事情...vim tags标签文件以简单的格式可读:)
      • 我刚刚尝试使用brew install ctags --HEAD,并且在成功安装 ctags 时,调用 --version 不会返回版本号。这对于在启动前检查版本号的 Tagbar 插件来说是有问题的。 Tagbar 插件加载失败。
      【解决方案5】:

      你也可以试试我写的objcscope。

      objcsope

      【讨论】:

        【解决方案6】:

        你可以试试Fishman fork of Exuberant Ctags,它支持 Objective C 和 CSS。

        【讨论】:

        • 由此产生的 obj-c 输出非常糟糕。我对此感到非常失望。
        【解决方案7】:

        我发现很难让 ctags 为标签栏生成标签。在 Objective-C 编辑器中使用 vim 插件更容易。 XVim 适用于 XCode。如果你像我一样使用 Appcode,IdeaVim 集成得很好。

        虽然您不会使用该插件获得完整的 Vi/Vim 功能。我发现与本机 IDE 命令混合使用足以弥补。

        【讨论】:

          【解决方案8】:

          如果我没记错的话:

          最新的ctags 现在解析@property 关键字不正确, 这可能导致源中@property 之后的所有单词 代码被解析为属性,导致文件tags混乱。

          我必须通过注释ObjC.c 中的所有属性关键字处理来重新编译 ctags (https://sourceforge.net/p/ctags/code/HEAD/tree/) 作为解决方法。尽管如此,它只会有助于更好地阅读 Taglist 中的源代码。

          它仍然不能跳转(例如到实现 带参数的方法)正确。

          我也试过这个(https://github.com/mcormier/ctags-ObjC-5.8.1),可惜这个根本跳不过去。

          总结:对于 ObjC 似乎没有 ctags 像 C/C++ 那样可行。

          【讨论】:

            【解决方案9】:

            Universal-ctags(https://ctags.io) 可以捕获Objective-C的属性。

            [jet@localhost objectivec_property.h.d]$ cat input.h 
            
            @interface Person : NSObject {
                @public
                    NSString *m_name;
                @private
                    int m_age;
            }
            
            @property(copy) NSString *personName;
            @property(readonly) int personAge;
            
            -(id)initWithAge:(int)age;
            @end
            [jet@localhost objectivec_property.h.d]$ ../../../ctags -x -o - input.h 
            Person           interface     2 input.h          @interface Person : NSObject {
            initWithAge:     method       12 input.h          -(id)initWithAge:(int)age;
            m_age            field         6 input.h          int m_age;
            m_name           field         4 input.h          NSString *m_name;
            personAge        property     10 input.h          @property(readonly) int personAge;
            personName       property      9 input.h          @property(copy) NSString *personName;
            

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-01-11
              • 2018-11-08
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多