2012-07-02

A nice C++ autocomplete configuration for Emacs

Autocompletion for C++ in Emacs is a hot topic -- at least for Emacs users. At least for Emacs users who code C++... So here is my setup that I use, and which works reasonably well. I use the autocomplete package with the autocomplete-clang extension.



You can get the autocomplete package at github and the clang extension is available also on many repositories on github I used the one by brianjcj. Under OS X I use clang 3.1, under Linux I use clang 3.0. You may have to point autocomplete to the correct binary via the customizable variable ac-clang-executable.

So basically you have to clone the autocomplete package, clone the clang extension and copy the auto-complete-clang.el file into the same folder. I used ~/bin/emacs/auto-complete, but you can choose any directory. Maybe you have your own site-lisp folder.

(defcustom mycustom-system-include-paths '("./include/" "/opt/local/include" "/usr/include" )
  "This is a list of include paths that are used by the clang auto completion."
  :group 'mycustom
  :type '(repeat directory)
  )

(add-to-list 'load-path "~/bin/emacs/auto-complete")
(require 'auto-complete-config)
(add-to-list 'ac-dictionary-directories "~/bin/emacs/auto-complete/ac-dict")
(ac-config-default)
(require 'auto-complete-clang)
(setq clang-completion-suppress-error 't)
(setq ac-clang-flags
      (mapcar (lambda (item)(concat "-I" item))
              (append 
               mycustom-system-include-paths
               )
              )
      )

(defun my-ac-clang-mode-common-hook()
  (define-key c-mode-base-map (kbd "M-/") 'ac-complete-clang)
)

(add-hook 'c-mode-common-hook 'my-ac-clang-mode-common-hook)

The key binding to M-/ is useful on US-keyboard, you may change that to your liking. So to start autocompletion, just type something and hit M-/. Clang will try to parse your file up to point and give useful completions. If it cannot parse your source, the cursor at point will turn red, and the minibuffer will show the error message. Most likely you forgot to add some include paths to mycustom-system-include-paths, or you really do have a syntax error.

The customizable variable mycustom-system-include-paths can be named arbitrarily. Many thanks to the helpful people over at stackoverflow for supplying me with the answer how to make a directory list nicely customizable.

3 comments:

  1. Thank you for your great article. I have a quick question.

    I have my AC-clang bind to "M-/" but it is annoying because I have to press it every time I want to see the list. Is there a way to have clangAC show up automatically with any key bindings?

    Thank you so much for your time.

    ReplyDelete
  2. Autocomplete can be configured to run on self insert of any character. However, I don't think this might be wise, since it brings quite a bit of latency. It does not run asynchronously.

    ReplyDelete
  3. Furthermore: the autocomplete docs describe how to configure the ac sources: http://cx4a.org/software/auto-complete/manual.html#Using_Source

    I would recommend to set the sources to only use clang, and to automatically complete by setting the auto start: http://cx4a.org/software/auto-complete/manual.html#Trigger_Key

    ReplyDelete