5

我在 emacs 和 vim 中最怀念的 IDE 功能是代码导航和查找用法。这两个编辑器都具有以下相似的功能:

  • 标签 - 来自指定文件的标识符被索引,当您按下作为标识符的单词上的快捷方式时,您将被导航到那里
  • CScope - 它允许您导航到标识符的“用法”

据我了解,这两个系统都非常不精确。如果我们有相同名称的相似标识符,则标签和范围可能会混淆它们。有没有更好的选择以及它们的精确度如何?

4

4 回答 4

6

我在 Emacs 中使用 cscope 和语义。这对我来说已经足够了。

在 cscope 中,我经常使用的两个函数是 cscope-find-global-definition 和 cscope-find-this-symbol。前面的函数非常精确。

C-c s s         Find symbol. 
C-c s d         Find global definition.

至于语义(动态索引,不需要生成TAGS)。

(global-set-key [f8] 'semantic-ia-fast-jump) ;; jump to definition.
(global-set-key [S-f8]                       ;; jump back
                (lambda ()
                  (interactive)
                  (if (ring-empty-p (oref semantic-mru-bookmark-ring ring))
                     (error "Semantic Bookmark ring is currently empty"))
                  (let* ((ring (oref semantic-mru-bookmark-ring ring))
                         (alist (semantic-mrub-ring-to-assoc-list ring))
                         (first (cdr (car alist))))
                    (if (semantic-equivalent-tag-p (oref first tag)
                                                   (semantic-current-tag))
                        (setq first (cdr (car (cdr alist)))))
                    (semantic-mrub-switch-tags first))))
于 2012-11-18T13:56:01.987 回答
5

有许多程序可以输出与 ctags 兼容的tags文件。它们通常是特定于语言的,因为 ctags 中存在一些低级限制,但是当您有多个同名方法时,它们和 ctags 都不能帮助您,因为这些工具只完成索引部分的工作。搜索索引实际上是 Vim 的工作,因为它是一个可怕的文本编辑器,而不是 IDE,它以平均值来决定哪个方法声明是正确的。

幸运的是,当有多个点击时,Vim 会显示一个可操作的列表。但这就是你能走多远。

Cscope 比 ctags 更智能一点,并且当在 Vim 中使用时,它可以进行搜索和索引。但是,和 ctags 一样,cscope仍然是一个代码索引器。

实际上可以同时使用两者,set cscopetags但这对您的命名问题没有帮助。

你可以试试 GNU Global。但它不支持 JavaScript,所以我从来没有真正使用它足够长的时间来发表意见。

IDE 通常通过在后台针对您的代码运行的特定于语言的解析器/静态分析工具来发挥作用。Vim 至少有一个限制和一个特性,这让你很难想象它会达到你想要的代码意识水平:

  1. Vim 不是多线程的。所以它不能在后台运行静态分析工具。

  2. Vim 支持数百种语言。对于任何规模的组织来说,为这么多语言提供这种功能是不可能的。

但这对我来说都不是问题,因为Vim 不是 IDE。

而且因为我的项目中没有多个同名的方法。

<C-]>, <C-w>},:tag /foo<Tab>并且:cs f c bar足以满足我卑微的需求。

于 2012-11-18T14:15:22.697 回答
5

例如, GNU Global允许重复标识符,您可以选择需要的。

于 2012-11-18T13:43:04.833 回答
3

请参阅eclim,它有一个非常有用的emacs 界面,它支持与 Eclipse 相同级别的 java 代码导航。

Eclim 还支持 C/C++ 等,虽然在 emacs-eclim 中还没有实现对此的支持,但是如果你知道 Elisp,那么实现它是非常简单的,因为对于 java,所有必要的基础设施都已经存在,所以你只需要为 c++ 调用添加实现。

于 2012-11-19T09:20:43.183 回答