Есть ли способ в Emacs узнать, какие другие места в коде вызывает определенную функцию? С моей текущей настройкой (GNU emacs 23.1.1, C codebase), я обычно должен искать всю базу кода для имени функции, чтобы увидеть, какие другие функции называют ее. Было бы неплохо, если бы я мог эффективно отображать все имена функций, которые вызывают эту конкретную функцию, на которую я смотрю.
Может ли Emacs показать мне, где называется определенная функция?
Ответ 1
Я использую xcscope
для этого. Это библиотека, которая заставляет Emacs взаимодействовать с внешним инструментом cscope
.
После настройки вы можете использовать cscope-find-functions-calling-this-function
, чтобы получить список адресатов исходного кода, вызывающих определенную функцию.
http://www-inst.eecs.berkeley.edu/~cs186/fa05/debugging/xcscope.el http://www.emacswiki.org/emacs/CScopeAndEmacs
Ответ 2
Вы можете использовать функцию semantic-symref
(C-c , G
) из пакета CEDET. Он может использовать базы данных GNU Global или CTags для поиска вызывающих абонентов, если они существуют. Он также может анализировать источники для поиска вхождений.
Ответ 3
Вот фрагмент из моего старого файла .emacs
он делает: попросите найти вещь из etags-tagfile (find-tag-tag) grep для него в соответствии с режимом
(defun find-caller (tagname)
"Find occurences of tagname in files in the current directory
matching extension of current file."
(interactive (list (find-tag-tag "Find caller: ")))
(let ((cmd "grep -n "))
(cond
((member major-mode '(lisp-mode cmulisp-mode))
(grep (concat cmd "-i '" tagname "' *.lisp")))
((eq major-mode 'c-mode)
(grep (concat cmd "'" tagname "' *.[ch]")))
((member major-mode '(latex-mode tex-mode))
(grep (concat cmd "-i '" tagname "' *.tex")))
((eq major-mode 'emacs-lisp-mode)
(grep (concat cmd "'" tagname "' *.el")))
(t (grep (concat cmd "'" tagname "' *"))))))