簡體   English   中英

vim和emacs中的代碼導航

[英]Code navigation in vim and emacs

我在emacs和vim中最想念的IDE功能是代碼導航和查找用法。 這兩個編輯器都具有以下類似功能:

  • 標簽 - 指定文件中的標識符被編入索引,當您按下作為標識符的單詞的快捷方式時,您將在那里導航
  • CScope - 它允許您導航到標識符的“用法”

據我了解,這兩個系統都非常不精確。 如果我們有相同名稱的相似標識符,則標記和范圍可能會混淆它們。 有沒有更好的選擇,它們究竟有多精確?

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

例如, GNU Global允許重復的標識符,您將能夠選擇所需的標識符。

有許多程序輸出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-]><Cw>} :tag /foo<Tab>:cs fc bar足以滿足我的謙遜需求。

請參閱eclim ,它具有非常有用的emacs接口 ,支持與Eclipse相同級別的Java代碼導航。

Eclim還支持C / C ++,盡管在emacs-eclim中尚未實現對此的支持,但如果你了解Elisp,那么實現它是非常簡單的,因為對於java來說,所有必要的基礎設施已經存在,所以你只需要添加c ++調用的實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM