As you know I’m an emacs user. I use emacs due its flexibility and extensibility, I’m using some major modes like CEDET and ECB. I use some hooks to integrate emacs and my common programming tasks. For example, I can’t imagine programming large projects like the FreeBSD Kernel or Linux Kernel only by using grep(1), egrep(1) or find(1), so I need to index large amount of code files…
For indexing tasks I’ve integrated ECB and cscope-mode, and created some hooks for certain directories. To let ECB know which hook must run on each directory, I’ve created the following variable in my .emacs file:
(defvar dmw-ecb-directory-change-alist
'(("/work/src/caffeine" caffeine-c-mode-hook)
("/work/src/caffeine++" caffeine-c++-mode-hook)
("/work/src/fireservice" caffeine-c++-mode-hook)
("/work/src/Linux" caffeine-c-mode-hook)
("/work/src/FreeBSD" caffeine-c-mode-hook)
("/work/src/jaxer/products/server/src" caffeine-c++-mode-hook)
("/work/src/syslog-ng" caffeine-c-mode-hook)
("/work/src/pyxser" python-c-mode-hook)
("/work/gae/gae-1.3.5/cclp" python-mode-hook)
("/work/gae/gae-1.3.5" python-mode-hook)))
To let emacs know which directories requires automatic indexing of C code files I’ve created the following variable:
(defvar dmw-ecb-cscope-autoindexing-projects
'("/work/src/caffeine"
"/work/src/caffeine++"
"/work/src/fireservice"
"/work/src/Linux"
"/work/src/FreeBSD"
"/work/src/jaxer/products/server/src"
"/work/src/syslog-ng"
"/work/src/pyxser"))
And created the following hook to make each emacs sessions something really productive:
(defun dmw-ecb-directory-change-hook (dirold dirnew)
(dolist (prji dmw-ecb-directory-change-alist)
(let ((prj-name (first prji))
(prj-match (string-match (concat (first prji) ".*") dirnew))
(prj-hook (last prji))
)
(if (numberp prj-match)
(progn
(if (>= prj-match 0)
(dolist (h (last prji))
(run-hook-with-args h)))
(dolist (cscope-auto dmw-ecb-cscope-autoindexing-projects)
(let ((newpath (concat dirnew "/cscope.out"))
(dirnew dirnew))
(if (and (string= prj-name cscope-auto)
(not (file-exists-p cscope-auto)))
(progn
(setq cscope-database-file newpath
cscope-do-not-update-database nil
cscope-use-relative-path t
cscope-initial-directory dirnew)
(cscope-index-files dirnew)))))
)))))
(defun dmw-cedet-hook ()
(local-set-key [(control return)] 'semantic-ia-complete-symbol)
(local-set-key "C-c?" 'semantic-ia-complete-symbol-menu)
(local-set-key "C-c>" 'semantic-complete-analyze-inline)
(local-set-key "C-cp" 'semantic-analyze-proto-impl-toggle))
(add-hook 'c-mode-common-hook
'dmw-cedet-hook)
(add-hook 'ecb-after-directory-change-hook
'dmw-ecb-directory-change-hook)
(global-ede-mode t)
The dmw-ecb-directory-change-hook run each hook associated with project directories in the dmw-ecb-directory-change-alist list and also, it verify if the directory is present in the dmw-ecb-cscope-autoindexing-projects, and if the directory is on the list, it will call the cscope-index-files function to index the directory using cscope(1).
Also, here is my ecb-activate-hook, which makes coding under emacs quite more productive, and make its behaviour very similar to any another IDE:
(defun dmw-ecb-activate-hook ()
(custom-set-variables
'(ecb-display-default-dir-after-start t)
'(ecb-auto-activate nil)
'(ecb-options-version "2.32")
'(ecb-source-path dmw-ecb-working-projects)
'(ecb-tip-of-the-day nil)
'(cache-directory-contents
(quote ((".*caffeine" . 10000)
(".*caffeine++" . 10000)
(".*pyxser" . 10000)
(".*fireservice" . 10000)
(".*src/" . 10000))))
)
(setq-mode-local c-mode semanticdb-find-default-throttle
'(project unloaded system recursive))
(setq-mode-local c++-mode semanticdb-find-default-throttle
'(project unloaded system recursive))
(semantic-add-system-include "/usr/include" 'c++-mode)
(semantic-add-system-include "/usr/local/include" 'c++-mode)
(semantic-add-system-include "/usr/include" 'c-mode)
(semantic-add-system-include "/usr/local/include" 'c-mode)
(message "ECB Activate Hook Done!"))
emacs rocks ;)
