最近在看SICP,里面的实现语言是Scheme(
Lisp的一种方言),于是试着配置了Scheme的环境,自然而然得用到了Emacs编辑器,配置Emacs编辑器要用Lisp编程实现(是的,你没看错,要用Lisp编程实现Emacs的配置,之后用Emacs编写Lisp的程序……),之后发现Emacs的插件功能很强大,可以完成c++的自动补全,这里记录一下配置过程。
1. Emacs编辑器简介

Emacs运行初始界面
Emacs,著名的集成开发环境和文本编辑器。Emacs被公认为是最受专业程序员喜爱的代码编辑器之一,另外一个被广泛使用的是VIM编辑器。Emacs使用Lisp这种有着极强扩展性的编程语言,从而实现了包括编程、编译乃至网络浏览等等功能的扩展。
2. Emacs编辑器的安装
本人安装的是GNU Emacs,支持Linux,windows,MacOS三种平台,查看安装步骤请点击链接。本文介绍在Linux平台下的安装。
3. 安装自动补全插件auto-complete和auto-complete-clang
约定:
C-x代表同时按Control和x键,M-b代表同时按Alt和b键
- 在路径
~/emacs.d下创建init.el文件,在文件中添加以下内容:
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/"))
(add-to-list 'package-archives '("melpa-stable" . "https://stable.melpa.org/packages/"))
(package-initialize)
- 打开Emacs(安装好后,直接搜索
GNU-Emacs,单击就可以打开),输入
M-x package-install
敲击回车,之后在编辑器最下方可以看到:

在光标后输入
auto-complete,敲击回车,即完成auto-complete插件的安装;之后相同步骤完成auto-complete-clang插件的安装。
3 . 安装完成后,~/emacs.d文件夹会生成elpa文件夹,elpa文件夹中是安装好的插件,如下图

之后打开~/emacs.d下的init.el文件,再其中添加以下内容:
(add-to-list 'load-path "~/.emacs.d/elpa/auto-complete-20170124.1845/")
(require 'auto-complete)
(add-to-list 'ac-dictionary-directories "~/.emacs.d/elpa/auto-complete-20170124.1845/dict/")
(require 'auto-complete-config)
(add-to-list 'load-path "~/.emacs.d/elpa/auto-complete-clang-20140409.52/")
(require 'auto-complete-clang)
;; 设置不自动启动
(setq ac-auto-start nil)
;; 设置响应时间 0.5
(setq ac-quick-help-delay 0.5)
;;(ac-set-trigger-key "TAB")
;;(define-key ac-mode-map [(control tab)] 'auto-complete)
;; 提示快捷键为 M-/
(define-key ac-mode-map (kbd "M-/") 'auto-complete)
(defun my-ac-config ()
(setq ac-clang-flags
(mapcar(lambda (item)(concat "-I" item))
(split-string
"
/usr/include/c++/4.7
/usr/include/x86_64-linux-gnu/c++/4.7/.
/usr/include/c++/4.7/backward
/usr/lib/gcc/x86_64-linux-gnu/4.7/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
"
)))
(setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers))
(add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup)
(add-hook 'c-mode-common-hook 'ac-cc-mode-setup)
(add-hook 'ruby-mode-hook 'ac-ruby-mode-setup)
(add-hook 'css-mode-hook 'ac-css-mode-setup)
(add-hook 'auto-complete-mode-hook 'ac-common-setup)
(global-auto-complete-mode t))
(defun my-ac-cc-mode-setup ()
(setq ac-sources (append '(ac-source-clang ac-source-yasnippet) ac-sources)))
(add-hook 'c-mode-common-hook 'my-ac-cc-mode-setup)
;; ac-source-gtags
(my-ac-config)
(ac-config-default)
;; 结束
注意:
- 第1,3,5行修改对应文件路径到你自己的安装路径,上面的配置是我自己的配置路径。
- 配置文件中也声明了代码自动补全的相应设置,比如响应时间,是否自动启动,提示快捷键(这里设置的是
M-/,当然你也可以自己修改成任意按键) - 因为要完成
c++代码的自动补全,所以要将c++库的路径添加到配置文件,配置文件中的是我自己的c++库路径
/usr/include/c++/4.7
/usr/include/x86_64-linux-gnu/c++/4.7/.
/usr/include/c++/4.7/backward
/usr/lib/gcc/x86_64-linux-gnu/4.7/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
在终端中输入如下命令可以生成自己的c++库的路径,首先输入:
echo "" | g++ -v -x c++ -E -
终端会输出:
#include "..." 搜索从这里开始:
#include <...> 搜索从这里开始:
/usr/include/c++/4.7
/usr/include/x86_64-linux-gnu/c++/4.7/.
/usr/include/c++/4.7/backward
/usr/lib/gcc/x86_64-linux-gnu/4.7/include
/usr/local/include
/usr/lib/gcc/x86_64-linux-gnu/4.7/include-fixed
/usr/include/x86_64-linux-gnu
/usr/include
搜索列表结束。
中间输出的即为你自己的c++库目录,之后替换你自己对应的路径到配置文件init.el中即完成配置。
4. 补全效果
放一张补全效果图,感觉还是很强大的,毕竟是在这样底层环境下实现的自动补全。

5. 常用Emacs命令
附一张常用Emacs命令,感觉概括了常用的命令,很不错。

emacs指南.png
希望本篇博客可以给使用Emacs编辑器的同学一些帮助。
