Emacs & cflow 生成函数调用树

标签: 初级 小技巧 | 发表时间:2010-11-29 10:16 | 作者:ahei yboren
出处:http://emacser.com

作者: tubo

介绍 Emacs 中使用cflow制作函数的调用树

1 Introduction to cflow

GNU cflow analyzes a collection of C source files and prints a graph, charting control flow within the program.

GNU cflow is able to produce both direct and inverted flowgraphs for C sources. Optionally a cross-reference listing can
be generated. Two output formats are implemented: POSIX and GNU (extended).

Input files can optionally be preprocessed before analyzing.

The package also provides Emacs major mode for examining the produced flowcharts in Emacs.

以上内容取自 cflow 的网站: http://www.gnu.org/software/cflow/manual/html_node/Intro.html#Intro

2 Emacs & cflow

cflow 的代码包中提供了cflow-mode.el (cflow-1.3/elisp/cflow.el), 该文件提供了 emacs 的 cflow-mode,
用于显示 cflow 输出的内容,但该文件中并未提供自动生成指定函数的 call tree
的功能,用起来多少有点不方便。

下面是一个简单的 elisp 函数,通过该函数可以为指定的函数生成调用树。

(require 'cflow-mode)
(defvar cmd nil nil)
(defvar cflow-buf nil nil)
(defvar cflow-buf-name nil nil)
 
(defun yyc/cflow-function (function-name)
  "Get call graph of inputed function. "
  ;(interactive "sFunction name:\n")
  (interactive (list (car (senator-jump-interactive "Function name: "
                                                    nil nil nil))))
  (setq cmd (format "cflow  -b --main=%s %s" function-name buffer-file-name))
  (setq cflow-buf-name (format "**cflow-%s:%s**"
                               (file-name-nondirectory buffer-file-name)
                               function-name))
  (setq cflow-buf (get-buffer-create cflow-buf-name))
  (set-buffer cflow-buf)
  (setq buffer-read-only nil)
  (erase-buffer)
  (insert (shell-command-to-string cmd))
  (pop-to-buffer cflow-buf)
  (goto-char (point-min))
  (cflow-mode)
  )

函数中使用了 CEDET 提供的 senator-jump-interactive 用于实现函数名的自动补全,如果你的机器上没有 CEDET, 那么就把
(interactive “sFunction name:\n”) 的注释去掉,而将后面的那句话注释掉即可。

用法很简单,将上面的代码添加到 ~/.emacs 中后,重新载入配置文件,然后打开一个 C 文件,
M-x, 输入: yyc/cflow-function , 随后在 Mini-buffer 中输入函数名字,
回车,即可生成一个新的 buffer, 并在其中填写了生成的调用树。

如下图所示:

cflow

在调用树中,还可以通过键盘从调用树中跳转到相应的源代码中,具体可以参阅 cflow
提供的 cflow.el。

这样, cflow 配置 GNU Global 和 cedet , 代码的阅读和理解效率会大大提高。

分享家:Addthis中国

相关 [emacs cflow 生成函数] 推荐:

Emacs & cflow 生成函数调用树

- yboren - Emacs中文网
介绍 Emacs 中使用cflow制作函数的调用树. 以上内容取自 cflow 的网站: http://www.gnu.org/software/cflow/manual/html_node/Intro.html#Intro. cflow 的代码包中提供了cflow-mode.el (cflow-1.3/elisp/cflow.el), 该文件提供了 emacs 的 cflow-mode,.

灵异 Emacs 之画皮

- 月乾 - LinuxTOY
好吧,这回真的是一个小技巧,我以本站站长的名誉担保……如果你觉得我撒谎了,你可以把站长找出来随意处置……(神秘的声音:偶们是无辜的,找 Kardinal 就行). 话说比较讲究的同学,都喜欢给 emacs 设置个漂亮的字体,一般都是矢量字体,大黑二黑三黑啥的,就不点名了,你懂的……. 可是这样也有麻烦的时候,比如说我最近比较爱玩的 eshell ,或者版本控制的 diff 界面之类的……总之,有些情况下,用点阵字体又比较舒服点.

emacs 新手必看: undo-tree

- leafduo - LinuxTOY
火星人都知道,emacs 只有 undo ,没有 redo ……或者说它有 redo,但是相当的诡异,套用一句经典台词就是: 猥琐,非常的猥琐. 简单的说,emacs 的 redo 就是 undo undo ,也就是传说中的负负得正. 可能有些 emacs 新手,还不知道怎么去操作,因为一般情况下,无论你 undo 多少次,都不会发生 redo 的现象.

配置 Emacs 的小技巧

- return - LinuxTOY
前几天……大约在冬季吧,我发现了一个惊天小技巧,当然,是关于 Emacs 的……看到标题你也应该猜到. 这事要从很久以前说起,我很久以前用 Vim ,很久很久以前用 Emacs ,很久很久很久以前用 Vim ……你知道的,我也不知道我到底在多久以前用 Emacs 或者 Vim…… 后来,出了个叫 Vimim 的东东,输入法再也不用担心我的切换了.

Emacs被发现未遵守GPL许可

- elis - Solidot
Emacs 23.2和23.3被发现没有遵守GPL许可证的要求公开所有源代码. 自2009年12月9日Emacs 23.1.90发布起,Emacs发行包包含了众多用Bison创建的未提供源代码的解析器. Emacs作者、自由软件基金会主席Richard Stallman称此事不仅仅是法律问题,而且是道德问题.

我是如何从vim转向Emacs的

- flychen50 - Emacs中文网
以前,我多次试图从 vim 转变到 emacs 都失败了. 原因很多,主要原因是 vim 的确一个很强大的 editor 不愧为 emacs 的主要竞争对手,vim 很多强大的功能,很难在 emacs 中找到相应的功能,那个时候还没有水木Emacs版,如果有的话,情况会好一些, 还有一个原因就是我周围几乎没有人用 emacs ,现在也是.

大话 Emacs Shell Mode 第 3 部分

- ndv - IBM developerWorks 中国 : Linux : Articles,Tutorials
这是《大话 Emacs Shell Mode 》的最后一篇. 这一篇中介绍了 GNU Emacs 下窗口操作的一些高级技巧和扩展函数的编写方法. 通过这些扩展,可以对 Emacs 环境下的窗口与缓冲区进行灵活自如的配置,甚至旋转,由此打造一个更加灵活,舒适的 Shell 工作环境.

Emacs 普通人的编辑利器

- tisyang - 学无止境@一点一滴
现代生活中,文档越来越重要,电脑已经成为编辑文本最主要的工具,程序员的工作其实就是编辑文档,选择高效的文本工具,自然要考虑程序员用的工具. 而 Emacs 就是一个是适合普通人使用的高效文档编写工具. 谈及 Emacs,很多人第一个感觉就是很复杂,随之而来就有一个疑问“很难用的吧. 但是,我虽然不是程序员,现在使用 Emcas + Org-mode(Emcas 上的插件) 的组合,感觉行云流水,毫无碍难.

为何 Emacs 和 Vim 被称为两大神器

- mgo - LinuxTOY
Emacs 是神的编辑器,而 Vim 是编辑器之神. 二者为何会有如此美誉,且听本文向你一一道来. Author: Jiqing Wu email:[email protected] homepage:http:://hi.baidu.com/jiqing0925 create:2011-01-09 update:2011-01-09 面向的读者:经常用电脑处理文本和编程的同学.

gocode——VIM 和 Emacs 的 golang 代码自动补全

- XiaoHui - Some reminiscences, some memories
虽然 golang 自身提供了 VIM 的语法高亮之类的脚本,但 autocompletion 并没有官方解决方案. 无意之中发现 gocode 这个支持 VIM 和 Emacs 的 autocompletion daemon. 这里有个Flash 动画演示,展示了 gocode 的强大. 我得说,用过之后,感觉速度确实够快.