Introduction
The AC sources for Clang. Combine the power of AC, Clang and Yasnippet.
if you don't have Yasnippet, I recommend you install one. if you don't want to install Yasnippet, you can try snippet.el instead. if you don't install any of them, this script will still work for you any way.
Install
Here is my configurations for AC and auto-complete-clang for your reference.
(add-to-list 'load-path (concat myoptdir "AC")) (require 'auto-complete-config) (add-to-list 'ac-dictionary-directories (concat myoptdir "AC/ac-dict"))
(require 'auto-complete-clang)
(setq ac-auto-start nil) (setq ac-quick-help-delay 0.5) ;; (ac-set-trigger-key "TAB") ;; (define-key ac-mode-map [(control tab)] 'auto-complete) (define-key ac-mode-map [(control tab)] 'auto-complete) (defun my-ac-config () (setq-default ac-sources '(ac-source-abbrev ac-source-dictionary ac-source-words-in-same-mode-buffers)) (add-hook 'emacs-lisp-mode-hook 'ac-emacs-lisp-mode-setup) ;; (add-hook 'c-mode-common-hook 'ac-cc-mode-setup) (add-hook 'ruby-mode-hook 'ac-ruby-mode-setup) (add-hook 'css-mode-hook 'ac-css-mode-setup) (add-hook 'auto-complete-mode-hook 'ac-common-setup) (global-auto-complete-mode t)) (defun my-ac-cc-mode-setup () (setq ac-sources (append '(ac-source-clang ac-source-yasnippet) ac-sources))) (add-hook 'c-mode-common-hook 'my-ac-cc-mode-setup) ;; ac-source-gtags (my-ac-config)
Screenshot
Refer to the screenshot folder.
Note
Troubleshooting
It is because clang's include file search path is not correct. Here is the solution:
find out the include file search pathes of your g++:
echo "" | g++ -v -x c++ -E -
you wil get something like this:
/usr/include/c++/4.6 /usr/include/c++/4.6/x86_64-linux-gnu/. /usr/include/c++/4.6/backward /usr/lib/gcc/x86_64-linux-gnu/4.6.1/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.6.1/include-fixed /usr/include/x86_64-linux-gnu /usr/include End of search list.
setting the ac-clang-flags to include these default include pathes. e.g.,
(setq ac-clang-flags (mapcar (lambda (item)(concat "-I" item)) (split-string " /usr/include/c++/4.6 /usr/include/c++/4.6/x86_64-linux-gnu/. /usr/include/c++/4.6/backward /usr/lib/gcc/x86_64-linux-gnu/4.6.1/include /usr/local/include /usr/lib/gcc/x86_64-linux-gnu/4.6.1/include-fixed /usr/include/x86_64-linux-gnu /usr/include " )))
You can put it into your .emacs file.
Then code completion works just fine!