With some minor dependencies, it’s fairly straightforward in setting up your Emacs workflow to include IntelliSense-like auto-completion!

Dependencies

System

Assuming you’re running Linux, you’ll need to have the following packages installed:

  • cmake
  • libclang

Emacs

ELPA

If you already have ELPA/MELPA, feel free to skip this first part

To be able to easily fetch the packages, it’s highly recommended you use the Emacs Lisp Package Archive (ELPA). To do this, all that’s required is to simply add the following to your init.el/.emacs1 file:

(require 'package)
(add-to-list 'package-archives
             '("melpa" . "https://melpa.org/packages/"))
(package-initialize)
Emacs will need to be restarted or reloaded to load the package repository.

Packages

Install the following packages in Emacs (M-x package-install):

  • irony
  • company
  • company-irony
  • company-irony-c-headers Required if you want header auto-completion

Configuration

Company

Company (company-mode) needs to be required, added to the after-init-hook (or similar / manually called), and the back ends to be added to it’s list of usable back ends. This is done in the initialization file1:

(require 'company)
(add-hook 'after-init-hook 'global-company-mode)
(add-to-list 'company-backends '(company-irony-c-headers company-irony))

Irony

Initial setup of irony requires M-x irony-install-server to be run. If errors are encountered, please ensure that you have the necessary system dependencies installed.

Irony’s irony-mode should be added to the relevant C/C++ mode hooks:

(add-hook 'c++-mode-hook 'irony-mode)
(add-hook 'c-mode-hook 'irony-mode)
(add-hook 'objc-mode-hook 'irony-mode)

Additionally, it’s a good idea to add the compile options auto setup helper command to the irony-mode hook:

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

Usage

There are several ways to make irony-mode aware of what it should look for in it’s completion. My preferred method, though not the only one, is to simply add my compile flags in the special .clang_complete file as part of the working directory of the project.

For an STM32F0 project, the context of the .clang_complete file would be:

-I./libopencm3/include
-DSTM32F0
The above assumes that libopencm3 is also places within the project directory

Note

There is a strange issue that is encountered with non-working completion for new header include statements. The workaround for this includes running M-x irony-server-killafter new header additions to your current working file. Irony’s server is clever enough to restart itself after a completion request is triggered via TAB so this is a fairly uninvolved workaround.

Example


  1. Emacs Initialization File ↩︎