vim和emacs中的代码导航

Kon*_*tov 5 tags vim emacs cscope

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

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

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

lou*_*xiu 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.
Run Code Online (Sandbox Code Playgroud)

至于语义(动态索引,不需要生成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))))
Run Code Online (Sandbox Code Playgroud)


Ale*_*Ott 5

例如,GNU Global允许重复的标识符,您将能够选择所需的标识符.


rom*_*inl 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足以满足我卑微的需要。