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

基于 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,但愿未有选错

a2f7a53100dbecacf050864d7d391bb3.gif

如果面对的问题是 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 秒种有多么长),这行配置代码完全可以不需要的。

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

e71262dfc75d5cb8cde423bfd478b51d.gif

体验一下 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,这样自动补全才可以工作。下面看看我在编辑代码过程中的截图:

3bf47503bfe6808f4d6dc2a02fe5111c.png

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

只针对 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 模式。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/272625.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言一元二次方程 ii(分支嵌套),C程序设计——求一元二次方程算法

要求:从键盘上输入一元二次方程的三个参数,编程判断并求一元二次方程的实根(a,b,c均为整数)算法分析:一元二次方程是只含有一个未知数,且未知数的最高次数是二次的多项式方程。一元二次方程经过整理都可化成一般形式axbxc0(a≠0)&…

程序员如何优雅度过一生的15个建议

首先,我要说明一下精彩的职业生涯应该是什么样。他们不是这样的一个线性图形,不是每过一个月你就会有对应的成长。(就算是普通的职业生涯也不会这样。你不会每个月都有提升。每个月你都会变的好一点,但是每次有提升都是大幅度的&a…

cocos2d-x游戏开发 跑酷(四) 关联与物理世界

原创。转载注明出处http://blog.csdn.net/dawn_moon/article/details/21451077 前面一节尽管实现了一个跑动的人物,可是他只不过一个精灵在运行一个跑动的帧动画而已。这一节我要实现精灵和物理世界关联。让这个人跟实际的Parkour一样,有实际体积&#x…

MyBatis多条件查询

1.MyBatis多条件查询1.1&#xff1a;使用实体类 将参数封装成对象接口&#xff1a;public List<User> getUserListByUser(User user);Mapper映射文件&#xff1a;<select id"getUserListByUser" resultType"User" parameterType"User"…

android蓝牙移植,平板蓝牙测试与移植一

一&#xff0e;平板蓝牙测试硬件连接&#xff1a;进入系统的”设置”&#xff0c;开启“蓝牙”&#xff1a;可以看到扫描到其他的蓝牙设备&#xff0c;“Bluez”是平板的名称。点击“Bluez”&#xff0c;设置如下&#xff1a;点击要配对的蓝牙设备(手机等)&#xff0c;进行蓝牙…

ASP.NET系列:自定义配置节点的复用

appSettings太简单&#xff0c;为每个程序自定义配置节点太复杂&#xff0c;因此要解决app.config&web.config自定义配置的复用问题。 1.读取不依赖SectionName,根节点可以定义为任何名称。 2.足够简单&#xff0c;配置项采用name value的形式&#xff1b;足够复杂&#xf…

Web的26项基本概念和技术

Web开发是比较费神的&#xff0c;需要掌握很多很多的东西&#xff0c;特别是从事前端开发的朋友&#xff0c;需要通十行才行。今天&#xff0c;本文向初学者介绍一些Web开发中的基本概念和用到的技术&#xff0c;从A到Z总共26项&#xff0c;每项对应一个概念或者技术。Internet…

BZOJ3670: [Noi2014]动物园

Description 近日&#xff0c;园长发现动物园中好吃懒做的动物越来越多了。例如企鹅&#xff0c;只会卖萌向游客要吃的。为了整治动物园的不良风气&#xff0c;让动物们凭自己的真才实学向游客要吃的&#xff0c;园长决定开设算法班&#xff0c;让动物们学习算法。 某天&#x…

android one指纹解锁,小米用屏幕内指纹扫描仪准备了两部Android One手机

2017年9月发布时&#xff0c;小米米A1几乎成功一夜成名。小西米去年夏天推出了Mi A2和Mi A2 Lite。现在&#xff0c;正如XDA开发者所揭示的那样&#xff0c;中国品牌正在筹备第三代产品阵容。代号为“bamboo_sprout”和“cosmos_sprout” - 所有Android One智能手机都包含代号为…

控制算法用c语言实现的,PID控制算法的C语言实现(完整版)

【实例简介】该文件里面还有各种改进的PID的算法&#xff0c;比如变积分控制等【实例截图】【核心代码】具体 PID 实现代码如下&#xff1a;pid.Kp0.4;pid.Ki0.2;//增加了积分系数pid.Kd0.2;float PID_realize(float speed){float index;pid.SetSpeedspeed;pid.errpid.SetSpeed…

easyui dialog的一个小坑

问题描述&#xff1a;1、html<div id"dig" style"padding:10px;width:500px;height:300px;font-family:微软雅黑;font-size:16px;"> Dialog Content. </div> 2、js$("#dig").css("display", "block");$(#dig).d…

C# 如何转换生成长整型的时间

这个数字字符串就是我们平常所说的时间戳。什么是时间戳&#xff1f;时间戳&#xff08;timestamp&#xff09;&#xff0c;通常是一个字符序列&#xff0c;唯一地标识某一刻的时间。时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至…

html自动滑动轮播代码,html+css+js 实现自动滑动轮播图

轮播图*{margin: 0 auto;padding: 0;list-style: none; //去圆点}.one {width: 1200px;height:350px;margin: 0 auto;overflow: hidden; //设定好的宽度多余的进行隐藏}.one ul{width: 3600px;position: relative;}.one ul li{float: left; //图片浮动}.two ul li { …

程序员必定会爱上的10款软件

目录 第一款&#xff1a;TrueCrypt 第二款&#xff1a;Soureinsight 第三款&#xff1a;Sublime 第四款&#xff1a;Mindmanager 第五款&#xff1a;MarkdownPad 第六款&#xff1a;Beyond compare 第七款&#xff1a;Vim 第八款&#xff1a;Wireshark 第九款&#xff1a;Fiddl…

html定义字体纵向对齐,HTML5 Canvas的文本如何实现垂直对齐

垂直对齐&#xff0c;使用CSS很容易实现&#xff0c;如果想在HTML5 Canvas中实现垂直对齐&#xff0c;如何设置呢&#xff0c;这就是今天要分享的笔记。HTML画布垂直对齐的文本&#xff0c;我们可以使用的textBaseline在画布范围内的属性值。textBaseline可以设置以下值之一 &a…

深度学习方法:受限玻尔兹曼机RBM(三)模型求解,Gibbs sampling

欢迎转载&#xff0c;转载请注明&#xff1a;本文出自Bin的专栏blog.csdn.net/xbinworld。 技术交流QQ群&#xff1a;433250724&#xff0c;欢迎对算法、技术、应用感兴趣的同学加入。 接下来重点讲一下RBM模型求解方法&#xff0c;其实用的依然是梯度优化方法&#xff0c;但是…

推荐一款PC端的远程软件-Remote Utilities

远程控制软件非常之多&#xff0c;但小编自己用过的就那么3个&#xff1a;teamviewer&#xff1a;在家远程办公时基本上都靠它连回公司的电脑&#xff0c;速度快、稳定、不需要公网IP。vnc&#xff1a;要开启vpn才能连回公司的网络&#xff0c;速度够快。系统自带远程桌面&…

这些才是Win10真正好用之处:瞬对Win7无爱

自从将家里的笔电、台式机全部升级到Win10之后&#xff0c;小编可是切切实实感受到了它的强大&#xff0c;非常多的改进、非常多人性化的设计。和之前的测试版不同&#xff0c;作为主力系统后自然要匹配日常的工作。很多设置、操作也要顺应以前的使用习惯。经过这几天折腾&…

Win10非常好用的6个使用技巧

很多人已经用上了Win10系统&#xff0c;为了提高使用效率掌握使用技巧尤为重要&#xff0c;今天我为大家分享win10的6个使用技巧。第一个&#xff1a;快速查找文件&#xff08;win键E&#xff09;想要打开某个文件&#xff0c;直接使用这个快捷键就可以打开资源管理器&#xff…

servlet html登录,Servlet实现用户登录

1、登录过程分析&#xff1a;通过表单收集用户的数据&#xff0c;Servlet通过request对象获得用户提交的数据&#xff0c;服务器还需要从数据库中通过sql语句查询有没有表单提交的数据中的用户。有则登录成功&#xff0c;否则&#xff0c;登录失败。2、工程结构&#xff1a;3、…