Emacs源代码导航功能

6
我正在开发一个大型C++项目,使用了六个月的Emacs。我尝试配置CEDET以便能够轻松导航,但是遇到了一些问题。
1. 有时语义无法找到某些符号,有时它不会... 我不清楚语义索引哪些文件。 我尝试使用EDE(按照此文档中的说明http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html),但我也遇到了一些问题...
- 我有同一项目的多个版本(发布),每个版本都在自己的文件夹中。如何告诉Emacs我正在使用哪个项目? - 如何告诉EDE在哪里查找我的头文件?我可以指定一个根目录吗?语义将在所有子目录中搜索头文件吗?
2. 以前我使用vim + cscope并记得有一种方法可以在符号堆栈中向后导航(Ctrl-t)。Emacs中是否有类似的功能?
注:以下是更多数据,以使问题更加清晰。
我有同一项目的多个版本。 每个版本都有自己的根目录。 每个项目有多个模块,每个模块都在一个子目录中。 每个模块中都有头文件。
/home/user/
          |
           \Release-001
          |           |
          |            \makefile
          |            \ Module-001
          |           |           |
          |           |            \makefile
          |           |            \subdir-001
          |           |           |          \header-001.h
          |           |           |          \header-002.h
          |           |            \subdir-002
          |           |           |          \header-003.h
          |            \ Module-002
          |           |           |
          |           |            \makefile
          |           |            \subdir-003
          |           |           |          \header-004.h
          |           |           |          \header-005.h
          |           |            \subdir-004
          |           |           |          \header-006.h
          |
           \Release-002
          |           |
          |            \makefile
          |            \ Module-001
          |           |           |
          |           |            \makefile
          |           |            \subdir-001
          |           |           |          \header-001.h
          |           |           |          \header-002.h
          |           |            \subdir-002
          |           |           |          \header-003.h
          |            \ Module-002
          |           |           |
          |           |            \makefile
          |           |            \subdir-003
          |           |           |          \header-004.h
          |           |           |          \header-005.h
          |           |            \subdir-004
          |           |           |          \header-006.h

这是我在 .emacs 文件中关于 EDE 的配置:
;; Cedet load commands
(add-to-list 'load-path "~/emacs-dir/cedet/cedet")
(load-file "~/emacs-dir/cedet/cedet/common/cedet.el") 

;; EDE: activating mode.
(global-ede-mode t)

;; Projects definition
(ede-cpp-root-project "Release-001"
                     :name "Release-001"
                     :file "~/Release-001/makefile"
                     :include-path '("/"
                                     )
                     :system-include-path '("~/exp/include")
                     :spp-table '(("SUSE9" . "")
                                )
)
(ede-cpp-root-project "Release-002"
                     :name "Release-002"
                     :file "~/Release-002/makefile"
                     :include-path '("/"
                                     )
                     :system-include-path '("~/exp/include")
                     :spp-table '(("SUSE9" . "")
                                )
)

提醒一下...我正在使用emacs的控制台版本(-nw)。


你在使用EDE时遇到了哪些问题? - Laurynas Biveinis
我已经编辑了问题并添加了一些新信息。 感谢您的关注。 - thamurath
2个回答

2

您的配置基本上是正确的,除了项目的 :include-path。

如果给定的源文件说:

   #include "Module-001/subdir-002/header-003.h"

如果include包含以下内容,则一切都正常:

then it is ok.

   #include "subdir-002/header-003.h"

如果您的 :include-path 没有,则应该添加。
   :include-path '("/Module-001" )

在IT技术方面,语义索引将会对当前文件以及它所包含的所有文件进行索引。使用语义装饰模式查看EDE为您找到的标题,以确定您的配置是否准确。

它还将索引与您正在编辑的文件相同目录中的所有文件,但仅在空闲时间内进行,因此如果您不让Emacs处于空闲状态,它就无法完成这项任务。

如果按照Bozhidar的建议使用CScope,可以加快索引操作的速度。然后您可以在EDE和语义数据库中启用CScope支持。然而,Semantic DB中包含CScope支持是最近的,因此您需要CEDET的CVS版本。这将确保整个过程被索引。

要向后导航,请查看semantic-mru-bookmark-mode的帮助。这将跟踪您通过命名位置在文件中的进度,非常方便且始终有效。


谢谢你的回答。问题在于头文件分散在整个项目中。每个模块都有子文件夹,头文件位于这些子文件夹中,因此指定所有头文件所在的路径将是一场噩梦。
  • 有没有办法告诉Semmantic在根路径下查找所有子目录中的头文件?
  • 阅读EDE文档后,我发现“您可以提供一个函数来搜索项目中的包含文件,而不是将路径指定为列表。”不幸的是,我不知道elisp。有没有地方可以找到示例?
谢谢!
- thamurath
1
包含路径的目的是通过将其聚焦来加快路径查找速度。如果没有这样的好处,那么最好使用CScope。一旦CScope作为EDE locate功能启用(请参见变量ede-locate-setup-options),那么它就像是所有文件的包含路径。可能有一些注意事项,但我自己还没有尝试过这个技巧,所以不确定。 - Eric

0

在以前的C++项目中,我使用过Emacs Code Browser,我发现它非常令人满意 - 除了文件和代码结构导航外,您还可以获得出色的版本控制系统集成(根据项目中文件的当前状态显示不同的图标)。与ECB一起,我在Emacs中使用了cscope,因为您在vim中提到了它,您可能也想在Emacs中使用它。

或者,如果您想要一个更简单的解决方案,您可以看看Emacs Nav。它也支持一些花哨的东西,并且不依赖于semantic和speedbar - 您只需要使用etags/ctags来索引您的项目。


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