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



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

  • cmake
  • libclang



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/"))

Emacs will need to be restarted or reloaded to load the package repository.


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)



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))


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)


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:


The above assumes that libopencm3 is also places within the project directory


Header Completion


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-kill after 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.