-->

使用irony将emacs打造为c++ IDE,代码补全

Posted on By Marquis

起因

vscode虽然很方便地看代码,不过时不时没法解析了,没法跳转了,没法补全了。
所以寻求emacs的解决方案。
使用irony插件很顺利地实现了 代码补全

已有的环境

  • virtual box上装了ubuntu16.04
  • 已安装vscode用来看代码,这个vscode和我们介绍的emacs并无任何关系,哈哈。
  • 已安装emacs 24.5, 并且emacs并无任何配置(全新的安装)。
  • 已安装clang
  • 已安装 cmake最新版

搞起来

首先按照irony-mode官网,的步骤装上irony。

libclang

由于irony依赖libclang,因此要先装它:sudo apt install libclang-dev

配置melpa,安装并配置irony

首先在home目录,即你的~/目录,新建一个配置文件.emacs,并写入:

(setq package-archives '(("gnu"   . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
                         ("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")))
(package-initialize)

注意,我用别人给的源老是找不到irony,这个清华的源很强,上面的url就是清华大学开源镜像的页面给的。

然后:
M-x package-install RET irony RET

配置为:

(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'objc-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)

其他配件

irony貌似只是一个后端,代码补全的前端可以使用Company,语法检查用Flycheck,另外用来显示参数列表的eldoc也是极好的。
装吧:

M-x package-install irony-eldoc
M-x package-install flycheck-irony
M-x package-install company-irony

这几个插件的配置文件可以抄这里
详见下一节。

配置文件汇总

(setq package-archives '(("gnu"   . "http://mirrors.tuna.tsinghua.edu.cn/elpa/gnu/")
                         ("melpa" . "http://mirrors.tuna.tsinghua.edu.cn/elpa/melpa/")))
(package-initialize)


;; irony-mode
(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'objc-mode-hook 'irony-mode)
(add-hook 'irony-mode-hook 'irony-cdb-autosetup-compile-options)

;; company mode
(add-hook 'c++-mode-hook 'company-mode)
(add-hook 'c-mode-hook 'company-mode)

;; flycheck-mode
(add-hook 'c++-mode-hook 'flycheck-mode)
(add-hook 'c-mode-hook 'flycheck-mode)
(eval-after-load 'flycheck
'(add-hook 'flycheck-mode-hook #'flycheck-irony-setup))

;; eldoc-mode
(add-hook 'irony-mode-hook 'irony-eldoc)

想了解更多看这里啊

  • rtags也是和irony平行的后端,且支持跳转,不过比较麻烦,不搞了。
  • 这篇 Emacs as a C++ IDE 对irony和rtags介绍的很详细。

安装projectile

根据Emacs as a C++ IDE的推荐,我还装了projectile
,这个用来给emcas一个project的概念,从而方便在工程文件之间进行跳转,用法详见:projectile

安装:
M-x package-install [RET] projectile [RET]

简介一下用法,只要你的文件有git等的文件,它就会将这个文件夹理解为一个project,或者你直接在文件夹里边放一个空的 .projectile就行了。
配置文件:

;; projectile-mode
(add-hook 'c++-mode-hook 'projectile-mode)
(add-hook 'c-mode-hook 'projectile-mode)

ctrl x ctrl f的时候用方向键选择曾经的历史文件

;; c-x c-f 的时候用上下箭头来选择历史文件。
;; from  http://stackoverflow.com/questions/3527150/open-recent-in-emacs
(savehist-mode 1)