你好,Ubuntu 社区,
首先我想说的是,我对 ubuntu (16.10) 和 linux 还很陌生。我决定尽可能少地使用 Windows,并且还想开始学习编程语言 C。但是,我认为在 Emacs 中这样做会很好,所以我开始学习 Emacs 并做了一些关于 emacs 的教程。主要是基础知识,然后边做边学。所以我找到了这个教程https://tuhdo.github.io/c-ide.html 在此之前,我安装了很多软件包,包括 helm 和 gtags 以及 helm-gtags。我还安装了 ncurses 库以便安装 gnu global。
现在我们来谈谈我的问题。首先,说实话,我不太清楚 gtags 是什么,但我想在安装它时弄清楚(我猜是用于导航的东西)。但在“源代码导航”部分,他谈到:
“在使用 ggtags 或 helm-gtags 之前,请记住通过在终端中在项目根目录运行 gtags 来创建 GTAGS 数据库:”...然后是一些命令
我认为我必须以某种方式将库与 emacs 连接起来。我 GNU_Global FAQ 被写成创建一个指向我的项目文件夹的链接,指向:/usr/src/lib
但是在我的 /usr/src 目录中没有 lib 文件夹。现在我猜是因为 Ubuntu 的结构与其他 Linux 发行版略有不同,所以这个库在其他地方?还是我完全错了?我在 Google 上找不到答案,所以也许你可以给我一些启发。
提前致谢,安迪
答案1
gtags 是一个 Linux 工具,它为源代码生成一个符号数据库,然后允许搜索这些符号的使用和定义。ggtags 是 Emacs 的“插件”,为该工具提供自动化的前端。一些具有与 gtags 类似功能的替代方案是 ctags、etags 和 cscope,其中大多数都有自己的 Emacs 插件。
值得注意的是,由于它们存储数据库的方式,这些工具中的许多工具在处理大型代码库(Linux 内核大小及更大)方面并不是很好。例如,Linux 内核在仅使用 gtags 时会生成一个 2GB 的文本文件,并且每当您尝试进行符号查找时都必须加载和搜索该文件。存在解决此问题的解决方法(如下)。
简单的解决方案
1.在您的系统上安装 gtags。
sudo apt-get install global
在命令行上您现在应该能够运行此命令并查看其安装位置:
which gtags
2. 告诉 Emacs ggtags 插件在哪里找到 gtags 工具。
使用命令返回的路径which gtags
,将以下行添加到您的 ~/.emacs 文件:
(setq ggtags-executable-directory "/path/to/gtags/parent/dir")
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)
这使得能够使用非常高效的 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 才能使用。这可以通过将其添加到 c 模式下自动触发来实现,方法是将以下内容添加到您的 .emacs 文件
(add-hook 'c-mode-common-hook
(lambda ()
(when (derived-mode-p 'c-mode 'c++-mode 'java-mode)
(ggtags-mode 1))))
或者,您也可以使用如下代码将其设置为始终启用:
(setq ggtags-global-mode 1)
如果您要使用大型代码库,我建议的设置需要在您的 ~/.emacs 文件中添加以下几行:
; Allow very large database files
(setq ggtags-oversize-limit 104857600)
(setq ggtags-sort-by-nearness t)
浏览代码时,我最常做的事情是跟踪光标下方的符号,查找光标下方符号的所有用法,偶尔进行与光标位置无关的符号查找。这些对应于命令:ggtags-find-tag-dwim
和ggtags-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
如果该点下没有符号,也会这样做。
答案2
sudo apt 获取全局
/************************ 以下无关紧要 *****************/ 欢迎来到 Linux 和 C。这是我的第一篇文章。哈哈
你走在正确的道路上!恭喜!我现在是一名电气工程专业的学生,正在攻读计算机科学。
希望我的建议能够帮到你。
- 摆脱 Windows,甚至不要在虚拟机中使用它。如果不能,那么第二台笔记本电脑只能用于 Linux 和编程 C/C++。
Windows 是为娱乐而设计的,适合非程序员,我可能有点极端。是的,C/C++ 和 unix 是为大胆的人而设计的,适合专业人士!
- 我猜你还没开始学习 C++。如果是的话,老兄,先开始学习 C++,使用 stack exchange 或 quora 上的任何一本书。
为什么?C++ 更难,工作量也更大,而且如果你熟悉 C++ 的话。我不确定,我认为 C 很容易上手。
为什么首先选择 C++,很多 C 编程风格在 C++ 中并不推荐。如果你想编写优秀而现代的 C++,有些风格是禁止的。
是的,用艰难的方式学习 C。甚至有一本书叫这个。
哈哈,但如果你是电子工程专业的学生,并且正在做嵌入式系统,那就学 C!学 C!学 C!C 绝对是这里的仙境。
成为 C 语言编程大神:(我的道路)
K&R书,圣经!
APUE,又是圣经!APUE 有在线课程,人们很认真。
我认为你已经很好了,不需要再读更多了,但是!
如果你有足够的时间和精力,就去读 UNIX 源代码吧。有一本书叫《unix 源代码解说》,是麻省理工学院必读的计算机科学书籍。不过在这之前,你需要了解一些操作系统的知识。
关于 C 已经足够了!
由于您是 Linux 新手,因此让我们来讨论 IDE。
使用 Emacs、Vi 或... 来处理 C 和 C++、python,哦,也可能是其他编程语言。
IDE 让你变得懒惰,不再思考真正发生了什么。
想想看,C/C++ 是在一些花哨的 IDE、Windows 操作系统出现之前就创建的!
那时候人们怎么编写操作系统?用 IDE 吗?哈哈
艰难地学习 C/C++。我保证你会喜欢它。
最后,不要获取 gnu global。
网络上称:“它对于破解包含许多子目录的大型项目很有用。”
您正在维护一些大型项目还是只是在做一些教科书式的编程练习?
再次,它会让你变得懒惰!