Vim和Emacs中的代码导航

5
我最想在emacs和vim中拥有的IDE功能是代码导航和查找用法。这两个编辑器都有以下类似的功能:
  • 标签 - 特定文件中的标识符被索引,当你按下快捷键时,会导航到该位置
  • CScope - 它允许您导航到标识符的“用法”
据我所知,这两个系统都非常不精确。如果我们有相似名称的标识符,标签和范围可能会混淆它们。是否有更好的替代方案?它们的精度如何?

2
当您对某个问题进行负面评价或投票以关闭该问题时,请解释为什么这样做?就我个人而言,我不认为如何在vim和emacs中进行代码导航的问题是不构建性的。 - Konstantin Solomatov
3
请注意,如果您想在vim/emacs中使用Java(以及Scala,我认为),您可以以无头模式(或常规模式)运行Eclipse,并充当“服务器”,然后您可以使用vim客户端(eclim)或emacs客户端(emacs-eclim)从vim / emacs获取精确的Eclipse代码完成/代码导航功能。 eclim.org网站上有截图/说明。 - TacticalCoder
4个回答

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.

关于语义(动态索引,不需要生成标签)。
(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))))

是的,语义也可以成为导航信息的良好来源。 - Alex Ott

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

5
有许多程序可以输出符合ctags标准的“tags”文件。由于一些低级限制,它们通常是特定于某种语言的,但无论是这些工具还是ctags都无法帮助你处理同名方法的问题,因为这些工具只完成了索引任务的一部分。实际上,在索引完成后进行搜索是Vim的工作,但由于它只是一个文本编辑器而不是IDE,因此它无法决定哪个方法声明是正确的。幸运的是,当有多个匹配项时,Vim会显示可操作的列表,但这也只是极为有限的帮助。Cscope比ctags智能一些,并且在从Vim中使用时,既执行搜索又执行索引操作。然而,与ctags一样,Cscope仍然只是代码索引工具。你可以使用“set cscopetags”同时使用两者,但这也无法解决同名问题。
你可以尝试使用GNU Global,但它不支持JavaScript,所以我并没有使用过足够长的时间来对其做出评价。
IDE通常通过针对您的代码运行的针对特定语言的解析器/静态分析工具完成其魔术。 Vim至少存在一个限制和一个功能,使得即使想象也难以将其达到您所寻求的代码智能感知的水平:
1. Vim不支持多线程。因此,它无法在后台运行静态分析工具。
2. Vim支持数百种语言。为这么多的语言提供这样的功能对于任何规模的组织来说都是不可能的。
但对我来说,这些都不是问题,因为Vim不是IDE,并且我的项目中没有同名方法。对于我谦卑的需求,"", "}", ":tag /foo"和":cs f c bar"就足够了。

3
请查看 eclim,它具有非常实用的emacs界面,支持与Eclipse相同级别的Java代码导航。
Eclim还支持C / C ++等其他语言,尽管emacs-eclim中尚未实现对此的支持,但如果您了解Elisp,则很容易实现,因为对于Java,所有必要的基础设施都已经存在,所以您只需要添加C ++调用的实现即可。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接