User:VladVukicevic/EmacsClangComplete
Jump to navigation
Jump to search
Clang is neat. clang-complete is neater, and more importantly, seems to work fine with Gecko with a bit of setup. Here's what I did under linux with emacs.
- Install clang (apt-get install clang)
- Install auto-complete mode
- Grab auto-complete-clang.el
- Install yasnippet
- Make ~/bin/clang-moz-flags and make it executable:
#!/bin/sh
if [ -z "$1" ] ; then
TARGET=firefox
else
TARGET=$1
fi
SRCDIR="`pwd`"
OBJDIR=`echo $SRCDIR | sed s,mozilla-central,$TARGET,`
make -C $OBJDIR showbuild 2>&1 | awk '
BEGIN { ORS=" "; }
/^COMPILE_CXXFLAGS / {
gsub(/-I\.\./,"-I'$OBJDIR'/..");
gsub(/ \.\./," '$OBJDIR'/..");
for (f=1;f<=NF;f++) {
if ($f ~ /^-[ID]/) print $f;
if ($f ~ /^-include/) { print $f; print $(f+1); }
#if ($f ~ /^-isystem/) { print $f; print $(f+1); }
}
}
'
- In your .emacs:
;; yasnippet
(require 'yasnippet)
(yas/global-mode 1)
;; clang autocomplete
(require 'auto-complete-config)
(require 'auto-complete-clang)
(setq moz-ac-objdir "fx-android-debug")
(defun moz-ac-set (objdir-name)
(interactive "sObjdir name to switch completion to: ")
(if (not (eq moz-ac-objdir objdir-name))
(setq moz-ac-objdir objdir-name)
(ac-clang-set-cflags-from-shell-command (concat "~/bin/clang-moz-flags " objdir-name)))
)
(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)
(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 '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)
- Then, open a source file and do M-x moz-ac-set and give it an objdir name. The above stuff assumes that your objdirs are alongside your mozilla-central dir (not inside it, because you shouldn't do that, that's gross, stop being gross); if you're doing something else, you'll need to tweak the above. Same with mozilla-central not being your source tree name.
- Hit control-tab to autocomplete!
- If something goes wrong, look at the *clang-output* buffer.