Emacs C IDE / Gnu 全局 helm-gtags

And*_*ndi 3 emacs

你好 Ubuntu 社区,

所以首先我想说我对 ubuntu (16.10) 和 linux 还是很陌生。我决定尽量少使用 Windows,也想开始学习编程语言 C。但是,我认为在 Emacs 中这样做会很好,所以我开始学习 Emacs 并在 emacs 上做了一些教程。主要是基础知识,而不是边做边学。所以我找到了这个教程https://tuhdo.github.io/c-ide.html 之前我安装了很多包,包括 helm 和 gtags 和 helm-gtags。我还安装了 ncurses libary 以安装 gnu global。

所以现在我们来解决我的问题/问题。首先,老实说,我现在真的不知道 gtags 是什么,但我想我会在安装它时弄清楚(我猜是导航的东西)。但在“源代码导航”部分下,他谈到:

“在使用 ggtags 或 helm-gtags 之前,请记住通过在终端中的项目根目录运行 gtags 来创建 GTAGS 数据库:“.. 然后是一些命令

我想我必须以某种方式将库与 emacs 连接起来。我编写了 GNU_Global FAQ 来创建指向我的项目文件夹的链接:/usr/src/lib

但是在我的 /usr/src 目录中没有 lib 文件夹。现在我想,因为 Ubuntu 的结构与其他 linux 发行版略有不同,所以这个库在其他地方吗?还是我完全错了?我找不到谷歌的答案,所以也许你可以启发我。

提前致谢,安迪

mta*_*xan 6

gtags 是一个 Linux 工具,它为源代码生成一个符号数据库,然后允许搜索这些符号的用法和定义。ggtags 是 Emacs 的“插件”,为该工具提供自动化前端。一些与 gtags 具有类似功能的替代品是 ctags、etags 和 cscope,其中大部分都有自己的 Emacs 插件。
值得注意的是,由于它们存储数据库的方式,这些工具中的许多都不太擅长处理大型代码库(Linux 内核大小和更大)。例如,当仅使用 gtags 时,Linux 内核将生成一个 2GB 的文本文件,并且每当您尝试进行符号查找时都必须加载和搜索该文件。存在解决此问题的变通方法(如下)。

简单的解决方案

1.在您的系统上安装 gtags。

sudo apt-get install global
Run Code Online (Sandbox Code Playgroud)

在命令行上,您现在应该能够运行此命令并查看它的安装位置:

which gtags
Run Code Online (Sandbox Code Playgroud)

2.告诉Emacs ggtags插件在哪里可以找到gtags工具。

使用which gtags命令返回的路径,将以下行添加到您的 ~/.emacs 文件中:

(setq ggtags-executable-directory "/path/to/gtags/parent/dir")
Run Code Online (Sandbox Code Playgroud)

3.为代码项目创建gtags数据库。

默认情况下,ggtags 将从您执行符号查找的文件中向上搜索目录树,以尝试查找 GTAGS 文件。该 GTAGS 文件(可能还有一些相关的文件)是您的符号数据库。如果在第一个数据库文件中没有找到匹配的符号,它将继续在目录树中搜索其他数据库。匹配的优先级基于符号使用/定义与您正在查找的文件的文件接近度。此数据库的生成称为“标记”,它通常位于您要标记的源树的根部。gtags 工具本身不执行这种继续搜索,因为它传递了一个特定数据库的路径,并且本机 Emacs 提供的 gtags 插件维护了这种单数据库行为。

要在使用 ggtags 插件(推荐使用本机 Emacs gtags 插件)时为 Emacs 之外的源文件夹创建 gtags 数据库,您需要运行命令ggtags-create-tags。在 Emacs 中运行任意命令的默认键绑定是 Mx,所以按下它然后输入ggtags-create-tags。它会提示你输入一个文件夹,所有东西都应该被标记,数据库应该被放置,所以将它指向你想要标记的源文件夹的顶级目录。它会运行一段时间,如果你有一个大的源代码树,它可能会运行一段时间,在它生成标签数据库时阻塞整个 Emacs GUI。完成后,ggtags 将在相关时自动使用它。

更好的解决方案

gtags、ctags、etags 和cscope 的问题之一是生成的数据库的大小。由于它们标记了符号的定义位置以及它们的使用位置,因此您最终可能会得到一个比实际源树更大的数据库。非常大的数据库会出现在合理时间内搜索它们的问题。在安装了默认 Ubuntu gnu-global 工具的情况下使用 ggtags 会产生一种非常低效的数据库格式,随着它的增长,这种格式会呈指数级恶化。这主要是因为 Ubuntu 仍然提供 2008 年的 gnu-global 工具而不是现代版本,并且它不是为了使用更高效的 ctags 工具作为底层框架而构建的。

为了避免 gtags 的问题并让它使用更高效的 ctags,您需要 global-6.4 或更高版本,并且需要构建它以指向您的 ctags 安装。我真正找到的唯一方法是从源代码构建它并提供适当的选项以及所有必要的依赖包安装。我最终编写了一个 shell 脚本来为我完成此安装和设置,并将它与我其余的 emacs 配置和安装脚本一起保存在 GitHub 中。您可以从https://github.com/mtalexan/emacs-settings/blob/master/global_install.sh获取它。

你需要在你的 ~/.emacs 中设置一些东西来充分利用它:

(setq ggtags-use-idutils t)
(setq ggtags-use-project-gtagsconf nil)
Run Code Online (Sandbox Code Playgroud)

这可以使用非常有效的 idutils 子包,并确保 gtags 调用使用您现在编译的 gtags 的全局设置。

如何使用 gtags/ggtags/helm-gtags

我个人使用 ggtags 而不是 helm-gtags 或 gtags。Emacs 提供了一个默认的 gtags “插件”,但它的界面比 ggtags 差得多,并且只会搜索单个数据库。我经常在大多数情况下使用 helm,但我喜欢在解析匹配时将 ggtags 界面与 helm 界面分开,因此我不使用 helm-gtags。如果您的 gtags 数据库很大, helm-gtags 也很慢。

对于 ggtags,您需要设置 ggtags-mode 以使其有用。这可以通过将以下内容添加到 .emacs 文件中,将其添加到 c-mode 自动触发来完成

(add-hook 'c-mode-common-hook
  (lambda ()
    (when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
     (ggtags-mode 1))))
Run Code Online (Sandbox Code Playgroud)

或者,您可以使用如下一行将其设置为始终启用:

(setq ggtags-global-mode 1)
Run Code Online (Sandbox Code Playgroud)



如果您要使用大型代码库,我建议的设置需要在 ~/.emacs 文件中包含以下几行:

; Allow very large database files
(setq ggtags-oversize-limit 104857600)
(setq ggtags-sort-by-nearness t)
Run Code Online (Sandbox Code Playgroud)



在浏览代码时,我做的最常见的事情是跟随光标下方的符号,查找光标下方符号的所有用途,并偶尔进行与光标所在位置无关的符号查找。这些对应于命令:ggtags-find-tag-dwimggtags-find-reference。这些命令在一个点(您的 Emacs 光标位置)上运行,但是当您的点下没有符号或从 Mx 调用它们时,将打开提示让您输入符号。
当你运行ggtags-find-tag-dwim它时,它可以做一些最容易理解的事情,但通常会在只有一场比赛时跳到一场比赛(相当于不自动跳转ggtags-find-tag),或者会打开一个侧窗,比如ggtags-find-reference包含可能匹配的列表,其中包括文件、行号和一些上下文,其中每个条目都可以单击以直接跳转到那里。
当该窗口打开时要小心,它会将您置于特殊的次要模式,这意味着向上和向下键将在匹配之间切换,直到您按 Enter 正式选择匹配。
当您选择匹配项时,您的标记会很方便地被留下。这意味着您可以使用该命令pop-tag-mark跳回上次所在的位置。tag-mark 是一堆标签标记,因此您可以重复查找符号,并且始终能够在查找之前返回到每个位置。如果您只想进行手动查找而不是基于该点的符号进行查找,则有一些 ggtags 函数可以像这样操作ggtags-find-tag-dwim,但会提示您输入迷你缓冲区中的符号。 ggtags-find-tag-dwim如果点下没有符号,也会这样做。