vim和emacs中的代码导航

时间:2012-11-18 13:32:50

标签: vim emacs tags cscope

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

  • 标签 - 指定文件中的标识符已编入索引,当您按下标识符上的快捷方式时,您将在那里导航
  • CScope - 它允许您导航到"用法"标识符

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

4 个答案:

答案 0 :(得分:6)

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

在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))))

答案 1 :(得分:5)

例如,

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

答案 2 :(得分:4)

有许多程序输出与ctags兼容的tags文件。它们通常是特定于语言的,因为ctags中有一些低级别的限制,但是当你有多个具有相同名称的方法时,它们和ctags都不会帮助你,因为这些工具只能完成作业的索引部分。搜索索引实际上是Vim的工作,因为它是一个怪异的文本编辑器而不是IDE 它有意味着决定哪个方法声明是正确的。

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

Cscope比ctags更聪明,当从Vim使用时,它会进行搜索以及索引。但是,像ctags一样,cscope 仍然是代码索引器。

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

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

IDE通常通过针对您的代码在后台运行的特定于语言的解析器/静态分析工具来发挥其魔力。 Vim至少有一个限制和一个功能,甚至很难想象它达到你似乎正在寻找的代码意识水平:

  1. Vim不是多线程的。因此它无法在后台运行静态分析工具。

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

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

    因为我的项目中没有多个具有相同名称的方法。

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

答案 3 :(得分:3)

请参阅eclim,它具有非常有用的emacs interface,它支持与Eclipse相同级别的代码导航。

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