基于 Emacs 的 company 模式并配合 semantic 文法分析器,实现 Emacs 的 C/C++ 代码自动补全。

关于 Emacs 的代码自动补全

代码自动补全的功能,对于使用 Emacs 写代码的程序员而言其重要性不言而喻的,但是搜了一些所谓的 “Emacs 完美的 C++ 自动补全” 的文章,丝毫也没有感觉到美,反而只是让我不断的追忆 MS 的 Visual Stdio (.net) 的 C/C++ 代码自动补全功能,所以干脆就只当没这回事。一个本性就有些懒惰的人,最好不要面对太多容易令自己失望的东西。

"在 Emacs 下用 C/C++ 编程" 较为详细地讲述了使用 Emacs 内置的 hippie-expand 模式并配合 semantic 来解决 C/C++ 代码自动补全问题。在我知道 company-mode 项目之前,个解决方案或许是最好的选择了。实际上,我不满意 hippie-expand + semantic 组合,主要是因为配置有些麻烦,并且补全的界面也有些丑陋。

Company-mode 是什么

Company-mode(Complete anything-mode)是 Emacs 的代码自动补全扩展包,它的主要工作是配合许许多多的处理后端来实现比较方便并且清晰的代码补全。可以在一份简短的视频中获得对 company-mode 的直观认识。

要使用 company-mode 来解决 Emacs 的 C/C++ 代码自动补全问题,可选择的处理后端(tag 工具)有 etags、gtags 和 semantic。由于我之前从未用过这些工具,所以只好对比了一些资料并依赖直觉选择了 semantic,但愿未有选错

如果面对的问题是 c/c++ 之外的代码补全,那么 company-mode 扩展包中提供的那些后端或许可以满足大部分需求了,这意味着不用像 C/C++ 那样折腾。

安装所需要的软件包

炫耀一下我用的 gentoo 可以很方便地安装 company-mode 和 semantic(当然你也有足够的理由来炫耀你的系统):

$ echo "app-emacs/company-mode semantic" | sudo tee -a /etc/portage/package.use

$ sudo emerge company-mode

由于开启了 company-mode 的 "semantic" USE 标识,会自动依赖安装 cedet(它包含 semantic)。

配置,配置……很容易令人厌倦

要在 Emacs 中生活的好,前提是得好好学习,天天配置。我这个 Emacs 世界的穷人,却每天都希望眼前不要出现那些括号套括号的代码,大有穷且益坚之势。

因为穷,所以也很容易感恩。Gentoo 在安装 emacs 的扩展包之后,会在 /usr/share/emacs/site-gentoo.el 文件中自动添加所安装扩展包的加载代码,因此我可以在自己的 .emacs 配置文件中省却类似以下的代码:

(load "/usr/share/emacs/site-lisp/cedet/common/cedet" nil t)

(add-to-list 'load-path "/usr/share/emacs/site-lisp/company-mode")

(autoload 'company-mode "company" nil t)

真好。

下面,先来配置一下 semantic,目的是让它可以帮助我们更好的分析出现在 Emacs 中的 C/C++ 代码,从中提取出那些有用的 tag。将下面代码写入个人的 .emacs 配置文件中。

(setq semanticdb-default-save-directory "~/.emacs.d/semanticdb")

(semantic-load-enable-code-helpers)

上面的第 1 行代码是设定 semantic 生成的 tag 文件保存目录(请手动建立该目录)。如果不设置这个目录的话,据说 semantic 会将生成的 tag 文件放在当前的工作目录。第 2 行代码是设置 semantic 分析代码文法的方式,据说共有 5 种级别的分析方式,详见“在 Emacs 中使用 semantic”,对于 C/C++ 代码自动补全问题而言,选择 semantic-load-enable-code-helpers 没错。

配置完 semantic 之后,紧接着就是配置 company-mode 了,配置代码只有一行:

(setq company-idle-delay t)

这行代码是告诉 company-mode 扩展包,在弹出自动补全窗口之时莫要犹豫。如果不是很苛求自动补全窗口的弹出速度(假如你不认为 1 秒种有多么长),这行配置代码完全可以不需要的。

这令人厌倦的配置工作终于做完了,好累

体验一下 company-mode

现在,可以用 emacs 编辑一份 C 程序源文件,内容大致如下:

#include

typedef struct tagPoint {

double x;

double y;

double z;

} Point;

int main (void)

{

Point *pt = (Point *) malloc (sizeof (Point));

pt->x = 0.0;

pt->y = 0.0;

pt->z = 0.0;

return 0;

}

在打开 C 文件之后,需要使用 “M-x company-mode" 命令开启 company-mode,这样自动补全才可以工作。下面看看我在编辑代码过程中的截图:

感觉很舒服。所以再花点时间进一步配置一下。

只针对 C/C++ 的配置

因为只是想在 C/C++ 代码编辑过程中启用 company-mode 和 semantic,所以前面所讲的配置虽然可以工作,但是有点铺张浪费。可以利用 Emacs 的 hook 函数,将上述配置代码插入 C/C++ 编辑模式中。这样,只有在使用 Emacs 编辑 C/C++ 源文件时,有关 company-mode 和 semantic 的配置才会生效。

现在请冷酷将前面的配置代码从 .emacs 文件中清除掉,换上下面稍微有点复杂的配置。

(add-hook 'c-mode-hook

(lambda ()

(setq semanticdb-default-save-directory "~/.emacs.d/semanticdb")

(semantic-load-enable-code-helpers)

(setq company-idle-delay t)

(company-mode)))

上述配置是针对 C 语言的模式。如果你是用 C++ 模式,那么就将 c-mode-hook 替换为 c++-mode-hook 吧。

上述配置代码的作用是定义了一个匿名的 elisp 函数(lambda 函数),然后这个函数插入到 c-mode-hook 的函数列表中。当 Emacs 编辑 C 文件时,便会自动调用那个 lambda 函数,从而 semantic 和 company-mode 的一些设置代码开始工作,最后并自动启用 company 模式。

emacs c语言 自动补全,Emacs 与 C/C++ 代码自动补全相关推荐

  1. vscode自动填充地址插件_制作VSCODE代码自动补全插件

    首先写在前面,我是看了VSCode插件制作:HTML代码自动填充这篇文章后,才基本了解这类vscode插件的编写和配置方法的,所以在文章开头特地声明一下. 首先在本地测试一下补全的信息 第一步,你需要 ...

  2. 百度自动推送html5,百度暂停 JS 代码自动推送功能,代码是否需要删除?

    本月上旬末的时候百度站长平台就推送了一则关于:搜索资源平台自动推送暂停使用通知.说到由于升级维护,搜索资源平台链接提交-自动提交-自动推送(JS 代码推送)功能暂时停止使用.并且会在恢复使用时再次通知 ...

  3. 恶补tranformer(一)--cv,在看代码,后期补

    transformer: https://zhuanlan.zhihu.com/p/62397974 https://zhuanlan.zhihu.com/p/44731789 https://www ...

  4. 正在启动python的代码补全客户端_Python交互模式下代码自动补全

    这个功能是以lib的形式提供的,配置写到home下的.pythonrc文件中, 并设置好环境变量让python启动时执行初始化: # ~/.pythonrc # enable syntax compl ...

  5. FlashBuilder4的小技巧 代码自动完成 和 代码自动提示

    1 使用空格或其他字符 完成代码输入 一般都是键入"." 开始提示代码, 但是我们可以设置其他的键盘字符更快的输入 进入 菜单"窗口"-> "首 ...

  6. emacs c语言配置文件,Emacs配置及使用方法(转)--- 很经典的

    最近需要用Emacs编辑C程序,看到这个教程非常不错,故转载 在Emacs下用C/C++编程 参考文献: hhuu @ newsmth 的<Emacs的日常生活> emacs 的文档 em ...

  7. vs代码补全的快捷键_效率工具 | 一款基于深度学习的代码自动补全神器

    前言 代码补全对于大多数开发人员来说是至关重要的,它可以有效的提高开发效率.减少拼写错误和输入代码量.我们使用的大多数开发工具都自带补全功能,或者可以通过安装插件具备补全功能.但是,以往的代码补全功能 ...

  8. 准确率可提升50%以上,Facebook用迁移学习改进代码自动补全

    视学算法报道 转载自:机器之心 编辑:陈萍.杜伟 来自 Facebook 的研究团队将迁移学习用于代码自动补全,提出的方法在非常小的微调数据集上提高 50% 以上的准确率,在 50k 标记示例上提高了 ...

  9. hbuilderx代码自动补全_DL时代的代码补全利器,北大出品,效果远超语言模型

    从程序员到数据工程师,编写程序代码是一项基本功,但是编写冗长代码的过程也极大地消耗了开发者的耐心.近来,有不少关于代码补全工具的消息爆出,例如,来自美国的 Kite,来自加拿大的 TabNine 等, ...

最新文章

  1. python 常用内置函数_Python小白必备的8个最常用的内置函数(推荐)
  2. 向256 MB内存的Windows Phone提供应用的最佳实践指导
  3. MATLAB工具箱下载地址
  4. android 多个style,Android样式的开发_style篇
  5. kali linux操作系统
  6. android 耗电量分析,使用能耗性能剖析器检查耗电量
  7. day 4 基本数据类型/list列表的操作/元组/range数数
  8. 【Xamarin 跨平台机制原理剖析】
  9. 小程序mysql+php测试,莲米粒是一个基于PHP+MySQL+微信小程序技术栈
  10. Oozie安装ExtJs教程
  11. Letv超级电视再出发,这次拿什么讲故事?
  12. 《matlab图像处理入门》总结
  13. Android平台快速集成当下流行平台分享
  14. 如何做好预算管理?预算上接战略,下接绩效,如何形成战略-计划-预算-绩效的闭环?
  15. 武音硕士研究生《计算机音乐作曲》培训,武汉音乐学院2013年硕士研究生招生计算机音乐作曲科目考试大纲及参考书目...
  16. 真香!一行代码搞定微信支付回调
  17. 机器学习实战——绘制决策树(代码)
  18. 5.1.2 消费者的加入组和同步组
  19. 学习Chrome Devtools 调试
  20. VIL100数据集处理

热门文章

  1. MAATLAB GUI——回调函数的设置(Callbacks)
  2. C#窗体应用程序崩溃解决方法总结
  3. Tesseract入门-VS2015下调用Tesseract4.0 +win7 64位系统
  4. 【python】画一个爱心
  5. python git是什么_python爬虫之git的使用
  6. Jena Fuseki安装完成后不能添加数据库
  7. Pycharm 项目无法导入自己写的模块(问题记录贴)
  8. 【洛谷P2680】运输计划
  9. linux 安装软件的几种方法
  10. 20165301 预备作业二:学习基础和C语言基础调查