Autocompletion for C and C++ with Emacs 24

I have already done a blog post on auto completion using Emacs. But that was back in Emacs 23 days. Long ago...

Since then a lot has happened. Emacs 24 has been released, package managers like MELPA or ELPA have become standard, and company-mode seems to be winning against auto-complete. Also, clang has made huge strides forward.

So it is time to revisit the task of developing C or C++ using Emacs. I have put online an easy-to-install Emacs init.el that you can use as a start for your own development environment. I am using the OS X version of Emacs, but this should also work on Linux, given that you have clang and git installed.

You can install this init.el by issuing the following commands:

git clone https://github.com/root42/yet-another-emacs-init-el
mkdir ~/.emacs.d
cd ~/.emacs.d
ln -snf ../yet-another-emacs-init-el/init.el .

The file will make sure that upon startup of Emacs all necessary packages are installed, like company, magit but also LaTeX tools like aucTeX or refTeX. You can disable this check (or individual packages) in the init.el.

The code is up on github, so feel free to fork and/or contribute.

When doing simple C++ programming using only standard libraries, you should be ready to go. For more complex projects, you have to tweak the clang parameters, so that the compiler will find the header files. Completion happens automatically after ".", "->" and "::" but also when pressing M-/. You can rebind this key in the init.el, of course. This is what the completion looks like:

My most commonly used keys that I have re-bound are as follows:
  • f3 - Runs ff-find-other-file, trying to switch between header and implementation for C/C++ programs.
  • f4 - Toggles the last two used buffers.
  • f5, f6 - If tabbar is enabled (tabbar-mode), navigates back/forward through tabs.
  • f7 - Toggle ispell dictionaries (german/english).
  • f8 - Kill current buffer.
  • f9 - Run compile.
  • M-? - Run grep.
  • M-n - Go to next error in compilation buffer.
  • M-S-n - Go to previous error in compilation buffer.
  • M->, M-< - Go to next/previous Emacs frame.
  • M-/ - Run autocompletion using company mode.
  • C-x o, C-x C-o - Go to next/previous Emacs window
Very nice is also the magit-mode, which is a very sane interface to git for Emacs. It looks like this:
You can run it by executing M-x magit-status. Just type ? to get online help. Magit uses simple one-character-commands, like s for stage, c for commit, p for push and so on.

Currently I am evaluating the integration of lldb into Emacs, but haven't come far enough to say that I have found a powerful and flexible interface, apart from the standard command line. So there's more to come, hopefully!