vim和emacs中的代码导航



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

  • 标签-指定文件中的标识符会被编入索引,当您在作为标识符的单词上按下快捷键时,您将被导航到那里
  • CScope-它允许您导航到标识符的"用法">

据我所知,这两个系统都非常不精确。如果我们有具有相同名称的相似标识符,那么标签和作用域可能会混淆它们。还有更好的替代方案吗?它们到底有多精确?

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

在cscope中,我经常使用的两个函数是cscope查找全局定义和cscope找到这个符号。前面的函数相当精确。

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))))
例如,

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

有许多程序可以输出ctags兼容的tags文件。由于ctag中的一些低级别限制,它们通常是特定于语言的,但当您有多个同名方法时,它们和ctag都不会对您有所帮助,因为这些工具只完成工作的索引部分。搜索索引实际上是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足以满足我的卑微需求。

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

Eclim还支持C/C++等,尽管在emacs-Eclim中还没有实现对它的支持,但如果你知道Elisp,那么实现起来就很简单了,因为对于java来说,所有必要的基础设施都已经存在,所以你只需要添加C++调用的实现。

最新更新