Programming in Emacs+Sematic

C 程序

怎样在没有生成 TAGS 文件的时候在程序里跳转到某一个函数?

使用 imenu 或者 senator. 推荐使用 senator, 因为它来自 sematic,一个可以分析很多种语言文法的东西,你可以使用 C-c , j 跳转到文件里任何的函数或者变量。输入函数时按 TAB 可以补全 函数名。看看这幅图

imenu 在 semantic 加强后可以在 project 内的函数变量间跳转。 看这幅图

怎样方便的知道正在使用的变量,函数的类型?

使用 semantic-summary-mode 之后,把光标放在C, C++, Java 的变 量名,函数名之后,minibuffer 里就会显示它的类型。看看这幅图。如果放在 lisp 函数,变量上,就会显示它的 docstring, 看这幅图

semantic-summary-mode 只显示当前 project 里的函数和变量定义。 这个 project 是由 semanticdb-project-roots 定义的。这个变量 就是说:我们的 project 的根目录在这些地方。

(setq semanticdb-project-roots (list "/home/wy/rect"))

这样,不在这个目录之下(包括子目录)的文件就不会被检索。这样有 一个问题,如何 summary /usr/include 里的头文件里定义的库函数? 似乎只有

(setq semanticdb-project-roots (list "/"))

这样的办法才能做到?

怎样在编辑程序时自动补全函数名和变量名?

这有很多方法:

简单的办法:senator.

senator 可以在已经分析的文件里提取匹配前缀的符号进行补全。

补全当前的部分变量名,函数名或类型名。它通常绑定在 C-c , TAB。 反复调用这个函数就可以在补全之间循环。

弹出一个补全菜单。它可以由 C-c , SPC 或 S-mouse3 调出。看这幅图

使用 sematic-ia

semantic-ia 是智能补全。 semantic-ia-complete-symbol 是直接 补全,你可以重复执行来得到你需要的匹配。 semantic-ia-complete-symbol-menu 可以弹出一个菜单让你选择。

你可以把 semantic-ia-complete-symbol 绑定到 M-TAB, 把 semantic-ia-complete-symbol-menu 绑定到s-mouse3.

为了直观,我现在只示范一下使用 semantic-ia-complete-symbol-menu:

比较一下 senator 这幅图 ?是不是智能了很多?

使用 Speedbar

你可以使用 Speedbar。在输入一个结构或对象之后,Speedbar 会在 completions 一栏显示这个结构的成员,并可以补全一个前缀。

当我输入 "w->" 后,Speedbar 就在 completions 显示出了 Wavefront 结构的成员。当我中键点击 "w" 左边的 "i" 图标后,小 窗口显示这个结构的定义。看这幅图

当我中键点击 inact 插入它之后,打入一个 "=" 号,speedbar 里 出现了可以赋值给一个 float 类型变量的所有匹配。看这幅图

(add-hook 'speedbar-timer-hook
          (lambda ()
            (speedbar-refresh)))
(setq speedbar-verbosity-level 0)

粗略统计一个程序里函数的复杂度

semantic-chart-nonterminal-complexity-token 可以显示一个统计 图,图中是这个文件的函数的复杂度统计。看看这个图。当然这样以行 数来计算不是很恰当,不过它还是给我们一些直观的信息。

下载

这些 semantic, speedbar, ... 都可以在 http://sourceforge.net/projects/cedet 下载。