| (load "/usr/share/emacs/site-lisp/xcscope.el") |
| |
| (setq cscope-do-not-update-database t) |
| (setq cscope-initial-directory nil) |
| |
| (defun ami-src-root-for-buffer () |
| "Return the source root for the current buffer" |
| (cond |
| ((null buffer-file-name) (error "Unexpected no path!")) |
| ((string-match "/chromium/src/" buffer-file-name) "~/src/chromium/src") |
| ((string-match "/wr/trunk/" buffer-file-name) "~/src/wr/trunk") |
| (t (error (concat "Unexpected path: " buffer-file-name))))) |
| (defun ami-cscope-symbol-feeling-lucky (sym) |
| "Do a cscope symbol lookup trying for the declaration of a type." |
| (interactive (list |
| (cscope-prompt-for-symbol "Find this symbol: " nil) |
| )) |
| (let* ((file-line |
| (shell-command-to-string |
| (format (concat "cd %s/.. && " |
| "cscope -dL -1 %s |egrep '[0-9] *((struct|class|#define)( [A-Z]*_EXPORT)? %s($| |\\()|typedef .* %s(;?| {)$)'|" ;; # |
| "head -1 |cut -d' ' -f1,3|tr ' ' ':'") |
| (ami-src-root-for-buffer) sym sym sym)))) |
| (if (not (string= "" file-line)) |
| (let* ((parts (split-string file-line ":")) |
| (file (car parts)) |
| (line (string-to-int (cadr parts)))) |
| (find-file file) |
| (goto-line line)) |
| (cscope-find-this-symbol sym)))) |
| (defun ami-cscope-at-point () |
| "Invoke reasonable cscope command depending on the context. |
| Useful in chromium." |
| (interactive) |
| (let ((line (buffer-substring-no-properties |
| (line-beginning-position) (line-end-position)))) |
| (if (string-match "^#include [\"<]" line) |
| (call-interactively 'cscope-find-this-file) |
| (call-interactively 'ami-cscope-symbol-feeling-lucky)))) |
| |
| (global-set-key '[?\M-.] 'ami-cscope-at-point) |