【问题标题】:Emacs source code navigation featuresEmacs 源代码导航功能
【发布时间】:2010-08-19 08:29:17
【问题描述】:

我正在处理一个大型 c++ 项目。在过去的六个月里,我一直在使用 emacs。 我尝试配置 CEDET 以便能够轻松导航,但我发现了一些问题。

1.- 有时语义找不到一些符号,有时他没有……我不清楚哪些文件是语义索引。 我曾尝试使用 EDE(按照本文http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html 中的说明进行操作),但我也发现了一些问题......

  • 我有同一个项目的多个版本(发布),每个版本都在自己的文件夹中。如何告诉 emacs 我正在处理哪个项目?
  • 如何告诉 ede 在哪里查找我的头文件?我可以只指定一个根目录,语义将在所有子目录中搜索头文件吗?

2.- 前段时间我在使用 vim+cscope,我记得有一种方法可以在符号堆栈中导航回来 (Ctrl-t)。在 emacs 中有这样的东西吗?

P.D.> 一些数据让问题更清楚。

我有同一个项目的多个版本。 每个都有自己的根目录。 每个项目都有多个模块,每个模块都位于一个子目录中。 每个模块都有头文件。

/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 时遇到了什么问题?
  • 我已编辑问题以添加一些新信息。感谢您的关注。

标签: emacs cedet emacs-semantic


【解决方案1】:

您的配置基本正确,但项目的 :include-path 除外。

如果给定的源文件说:

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

那就没问题了。如果包含说:

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

那么你的 :include-path 应该有

   :include-path '("/Module-001" )

在里面。

至于哪些东西做语义索引,它会索引你当前的文件,包括它可以找到的所有内容。使用语义修饰模式查看 EDE 为您找到了哪些标头,以确定您的配置是否准确。

它还会索引与您正在编辑的文件位于同一目录中的所有文件,但仅限于空闲时间,因此如果您不让 Emacs 空闲,它就不会处理它。

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

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

【讨论】:

  • 感谢您的回答。问题是头文件遍布整个项目。每个模块都有子文件夹,并且标题位于此子文件夹中,因此指定标题所在的所有路径将是一个地狱。 - 有没有办法告诉 Semantic 在根路径下的所有子目录中查找标题? - 阅读 EDE 文档我发现“除了将路径指定为列表,您还可以提供功能,该功能将在您的项目中搜索包含文件。”不幸的是我不知道elisp。我可以在任何地方找到示例吗?谢谢!
  • 包含路径的目的是通过集中路径使路径查找更快。如果这样做没有好处,那么最好的选择是使用 CScope。一旦启用 CScope 作为 EDE 定位功能(请参阅变量 ede-locate-setup-options),它就有点像将所有内容都作为所有文件的包含路径。可能有一些警告,但我自己还没有尝试过这个技巧来确定。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-15
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多