Emacs可以告诉我调用特定函数的位置吗?

时间:2010-06-02 05:12:15

标签: c emacs

在Emacs中有没有办法找出代码中哪些其他地方调用特定的函数?使用我当前的设置(GNU emacs 23.1.1,C代码库),我通常必须在整个代码库中搜索函数名称,以查看其他函数调用它。如果我能有效地显示调用我正在查看的这个特定函数的函数的所有名称,那将是很好的。

3 个答案:

答案 0 :(得分:11)

您可以使用CEDET包中的semantic-symref函数(C-c , G)。它可以使用GNU Global或CTags数据库查找呼叫者(如果存在)。它还可以解析来源以查找事件。

答案 1 :(得分:2)

我使用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 :(得分:1)

这是我旧的.emacs文件的片段

它确实:要求从etags-tagfile中找到的东西(find-tag-tag) 根据模式grep for it

(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 "' *"))))))