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,一经查实,立即删除!

相关文章

linux(fedora) 下dvwa 建筑环境

linux(fedora)下dvwa组态 1.下载httpd,dvwa,mysql,mysqlserver, php-mysql,php 除了dvwa 这是外界进入下一官方网站。该服务通过休息install 安装 yum install httpd, mysql, php-mysql, php 假设出现安装的问题。能够先yum search xxx 2.安装完之后,检查安装的状…

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

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

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

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

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

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

kmp算法的c语言,KMP算法 纯C实现

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼我自己写的KMP算法:int nt[256];void get_next1(char* T, int next[], int tlen){int i 0;int j 1;next[0] -1;while( j {if ( T[i] T[j] ){next[j] 0;i;}else{next[j] i;i 0;}j;}}int Index_KMP1(char* S, cha…

MyBatis多条件查询

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

android 定位 广播,android - 如何触发广播接收器在GPS开启/关闭? - SO中文参考 - www.soinside.com...

如何触发广播接收器在GPS开启/关闭&#xff1f;问题描述 投票&#xff1a;35回答&#xff1a;5public class BootReceiver extends BroadcastReceiver {Overridepublic void onReceive(Context context, Intent intent) {if (intent.getAction().matches("android.locatio…

sphinx数据文件简析

Sphinx使用的文件包括 “sph”&#xff0c; “spa”&#xff0c; “spi”&#xff0c; “spd”, “spp”&#xff0c; “spm” &#xff0c;还有锁文件&#xff08;.spl&#xff09;。其中sph是系统的配置文件。其它则为索引文件。 l Spi 文件&#xff1a;保存WordId及指向此Wo…

收集一些常用的正则表达式

1 . 校验密码强度密码的强度必须是包含大小写字母和数字的组合&#xff0c;不能使用特殊字符&#xff0c;长度在8-10之间。^(?.*\\d)(?.*[a-z])(?.*[A-Z]).{8,10}$2. 校验中文字符串仅能是中文。^[\\u4e00-\\u9fa5]{0,}$3. 由数字、26个英文字母或下划线组成的字符串^\\w$4.…

C#实现图片的无损压缩

/// <summary>/// 图像缩略图处理/// </summary>/// <param name"bytes">图像源数据</param>/// <param name"compression">压缩质量 1-100</param>/// <param name"thumbWidth">缩略图的宽</para…

部署和调优 1.3 pureftp部署和优化-1

FTP 是 File Transfe Protocol&#xff08;文件传输协议&#xff09;的英文简称&#xff0c;而中文简称为 “文传协议” 用于 Internet 上的控制件的双向传输。 可以访问 www.pureftpd.org 官网 切换到下载目录 cd /usr/local/src 下载 wget http://download.pureftpd.org/…

android通知图标变白色,android 7.0通知图标出现白色方块

我使用下面的代码片段在我的Android应用程序中生成通知.private void sendNotification(String contentText, String message) {Intent resultIntent new Intent(this, MainActivity.class);resultIntent.putExtra("clear","clear");resultIntent.setFlag…

sqlserver 查找某个字段在哪张表里

如何查找某个字段属于哪张表&#xff1f;select [name] from [库名].[dbo].sysobjects where id in(select id from [库名].[dbo].syscolumns Where name字段名)

性能

成员嵌套越深&#xff0c;访问速度越慢。location.href 总是快于window.location.href&#xff0c;而后者也要比window.location.href.toString()更快。如果这些属性不是对象的实例属性&#xff0c;那么成员解析还要在每个点上搜索原形链&#xff0c;这将需要更长时间。 functi…

身份证号码有效性检测算法 ( js版 转 C#版 )

C#版#region 检测是否是正确的身份证/// <summary>/// 身份证验证/// </summary>/// <param name"num"></param>/// <returns></returns>public static bool isIdCardNo(string cardid){string num cardid.ToUpper();int[] fac…

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…

android 引入 .so,android studio引入so库方法(示例代码)

在Android Studio中引入so库&#xff0c;只需在app/jniLibs下放入so文件&#xff0c;然后在Module的build.gradle中加入&#xff1a;sourceSets {main {jniLibs.srcDirs [‘libs‘]}}完整的build.gradle如下&#xff1a;apply plugin: ‘com.android.library‘android {compil…

BZOJ3670: [Noi2014]动物园

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