我在 emacs 和 vim 中最怀念的 IDE 功能是代码导航和查找用法。这两个编辑器都具有以下相似的功能:
- 标签 - 来自指定文件的标识符被索引,当您按下作为标识符的单词上的快捷方式时,您将被导航到那里
- CScope - 它允许您导航到标识符的“用法”
据我了解,这两个系统都非常不精确。如果我们有相同名称的相似标识符,则标签和范围可能会混淆它们。有没有更好的选择以及它们的精确度如何?
我在 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))))
有许多程序可以输出与 ctags 兼容的tags
文件。它们通常是特定于语言的,因为 ctags 中存在一些低级限制,但是当您有多个同名方法时,它们和 ctags 都不能帮助您,因为这些工具只完成索引部分的工作。搜索索引实际上是 Vim 的工作,因为它是一个可怕的文本编辑器,而不是 IDE,它以零平均值来决定哪个方法声明是正确的。
幸运的是,当有多个点击时,Vim 会显示一个可操作的列表。但这就是你能走多远。
Cscope 比 ctags 更智能一点,并且当在 Vim 中使用时,它可以进行搜索和索引。但是,和 ctags 一样,cscope仍然是一个代码索引器。
实际上可以同时使用两者,set cscopetags
但这对您的命名问题没有帮助。
你可以试试 GNU Global。但它不支持 JavaScript,所以我从来没有真正使用它足够长的时间来发表意见。
IDE 通常通过在后台针对您的代码运行的特定于语言的解析器/静态分析工具来发挥作用。Vim 至少有一个限制和一个特性,这让你很难想象它会达到你想要的代码意识水平:
Vim 不是多线程的。所以它不能在后台运行静态分析工具。
Vim 支持数百种语言。对于任何规模的组织来说,为这么多语言提供这种功能是不可能的。
但这对我来说都不是问题,因为Vim 不是 IDE。
而且因为我的项目中没有多个同名的方法。
<C-]>
, <C-w>}
,:tag /foo<Tab>
并且:cs f c bar
足以满足我卑微的需求。
例如, GNU Global允许重复标识符,您可以选择需要的。