<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Emacs中文网 &#187; CEDET</title>
	<atom:link href="http://emacser.com/c-cedet.htm/feed" rel="self" type="application/rss+xml" />
	<link>http://emacser.com</link>
	<description>没有我做不到的，只有你想不到的</description>
	<lastBuildDate>Fri, 12 Aug 2011 12:56:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET</title>
		<link>http://emacser.com/built-in-cedet.htm</link>
		<comments>http://emacser.com/built-in-cedet.htm#comments</comments>
		<pubDate>Sun, 09 May 2010 18:11:03 +0000</pubDate>
		<dc:creator>Meteor Liu</dc:creator>
				<category><![CDATA[CEDET]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[自动补全]]></category>
		<category><![CDATA[ahei]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[company-mode]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[ede]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[highlight]]></category>
		<category><![CDATA[imenu]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[meteor]]></category>
		<category><![CDATA[meteor1113]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[pulse]]></category>
		<category><![CDATA[putty]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[semantic]]></category>
		<category><![CDATA[senator]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[代码折叠]]></category>
		<category><![CDATA[代码补全]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[补全]]></category>
		<category><![CDATA[配色]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41327</guid>
		<description><![CDATA[作者: Meteor Liu




1 前言 
2 semantic配置 

2.1 基本配置 
2.2 代码跳转 
2.3 代码补全 


3 EDE配置 
4 其它 

4.1 可视化书签 
4.2 pulse 
4.3 h/cpp切换 
4.4 代码折叠 






1 前言 


今天，emacs-23.2发布了，最大的改变就是集成进了CEDET，所以有了这个续， 介绍下build in CEDET和offical CEDET的区别，以及内置CEDET缺少某些功能的替代方案。
PS1：虽然现在官方release版本是1.0pre7，内置的CEDET用cedet-version命令看输入也是1.0pre7，可我总感觉内置的CEDET用起来比官方版本慢很多，我猜想内置的CEDET可能没升级到1.0pre7的release。


PS2：内置CEDET不支持emacs-lisp语言了，没想明白是为什么。




2 semantic配置 



2.1 基本配置 


官方的CEDET通过semantic-load-enable-minimum-features等几个函数来启动，而内置的CEDET增加了一个单独的minor mode，即semantic-mode，可以通过(semantic-mode)命令来Enable或Disable。


(semantic-mode)是通过semantic-default-submodes这个变量来决定启用哪些minor mode，默认的semantic-default-submodes包含了下面两个minor mode：



global-semantic-idle-scheduler-mode


global-semanticdb-minor-mode


根据(semantic-mode)的文档，semantic-default-submodes里可以设置下面这些minor mode：



global-semanticdb-minor-mode


global-semantic-idle-scheduler-mode


global-semantic-idle-summary-mode


global-semantic-idle-completions-mode


global-semantic-decoration-mode


global-semantic-highlight-func-mode


global-semantic-stickyfunc-mode


global-semantic-mru-bookmark-mode


可以根据自己的需要设置，比如我开启了下面4个minor mode：


?View Code LISP1
2
3
4
5
&#40;setq semantic-default-submodes '&#40;global-semantic-idle-scheduler-mode
            [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://emacser.com/about.htm#meteor" target="_blank"><span style="color: #0000ff;"><b>Meteor Liu</b></span></a></p>
<p><img class="alignright" title="CEDET" src="screenshots/cedet/cedet-logo.png" width="200" height="90"/></p>
<div id="table-of-contents">
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 前言 </a></li>
<li><a href="#sec-2">2 semantic配置 </a>
<ul>
<li><a href="#sec-2.1">2.1 基本配置 </a></li>
<li><a href="#sec-2.2">2.2 代码跳转 </a></li>
<li><a href="#sec-2.3">2.3 代码补全 </a></li>
</ul>
</li>
<li><a href="#sec-3">3 EDE配置 </a></li>
<li><a href="#sec-4">4 其它 </a>
<ul>
<li><a href="#sec-4.1">4.1 可视化书签 </a></li>
<li><a href="#sec-4.2">4.2 pulse </a></li>
<li><a href="#sec-4.3">4.3 h/cpp切换 </a></li>
<li><a href="#sec-4.4">4.4 代码折叠 </a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-3">
<h3 id="sec-1">1 前言 </h3>
<div id="text-1">
<p>
今天，emacs-23.2发布了，最大的改变就是集成进了CEDET，所以有了这个续， 介绍下build in CEDET和offical CEDET的区别，以及内置CEDET缺少某些功能的替代方案。<span id="more-41327"></span></p>
<p>PS1：虽然现在官方release版本是1.0pre7，内置的CEDET用cedet-version命令看输入也是1.0pre7，可我总感觉内置的CEDET用起来比官方版本慢很多，我猜想内置的CEDET可能没升级到1.0pre7的release。
</p>
<p>
PS2：内置CEDET不支持emacs-lisp语言了，没想明白是为什么。
</p>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2">2 semantic配置 </h3>
<div id="text-2">
</div>
<div id="outline-container-2.1" class="outline-4">
<h4 id="sec-2.1">2.1 基本配置 </h4>
<div id="text-2.1">
<p>
官方的CEDET通过semantic-load-enable-minimum-features等几个函数来启动，而内置的CEDET增加了一个单独的minor mode，即semantic-mode，可以通过(semantic-mode)命令来Enable或Disable。
</p>
<p>
(semantic-mode)是通过semantic-default-submodes这个变量来决定启用哪些minor mode，默认的semantic-default-submodes包含了下面两个minor mode：
</p>
<ul>
<li>
global-semantic-idle-scheduler-mode
</li>
<li>
global-semanticdb-minor-mode</p>
</li>
</ul>
<p>根据(semantic-mode)的文档，semantic-default-submodes里可以设置下面这些minor mode：
</p>
<ul>
<li>
global-semanticdb-minor-mode
</li>
<li>
global-semantic-idle-scheduler-mode
</li>
<li>
global-semantic-idle-summary-mode
</li>
<li>
global-semantic-idle-completions-mode
</li>
<li>
global-semantic-decoration-mode
</li>
<li>
global-semantic-highlight-func-mode
</li>
<li>
global-semantic-stickyfunc-mode
</li>
<li>
global-semantic-mru-bookmark-mode</p>
</li>
</ul>
<p>可以根据自己的需要设置，比如我开启了下面4个minor mode：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code13'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132713"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41327code13"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> semantic-default-submodes '<span style="color: #66cc66;">&#40;</span>global-semantic-idle-scheduler-mode
                                  global-semanticdb-minor-mode
                                  global-semantic-idle-summary-mode
                                  global-semantic-mru-bookmark-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>semantic-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
另外，emacs-23.2的Tools菜单下下新增了&#8221;Source Code Parsers (Semantic)&#8221;菜单项，可以通过这个菜单项来Enable和Disable semantic-mode，和命令(semantic-mode)的功能是一样的。
</p>
<p>
此外，官方CEDET里还有其它一些minor mode，现在基本上都还可以用，比如我还打开了下面几个：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code14'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132714"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41327code14"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-semantic-highlight-edits-mode <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> window-system <span style="color: #cc66cc;">1</span> -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-semantic-show-unmatched-syntax-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-semantic-show-parser-state-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
关于system-include-dir的设置，还和以前一样：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code15'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132715"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p41327code15"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defconst user-include-dirs
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;..&quot;</span> <span style="color: #ff0000;">&quot;../include&quot;</span> <span style="color: #ff0000;">&quot;../inc&quot;</span> <span style="color: #ff0000;">&quot;../common&quot;</span> <span style="color: #ff0000;">&quot;../public&quot;</span>
        <span style="color: #ff0000;">&quot;../..&quot;</span> <span style="color: #ff0000;">&quot;../../include&quot;</span> <span style="color: #ff0000;">&quot;../../inc&quot;</span> <span style="color: #ff0000;">&quot;../../common&quot;</span> <span style="color: #ff0000;">&quot;../../public&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defconst win32-include-dirs
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;C:/MinGW/include&quot;</span>
        <span style="color: #ff0000;">&quot;C:/MinGW/include/c++/3.4.5&quot;</span>
        <span style="color: #ff0000;">&quot;C:/MinGW/include/c++/3.4.5/mingw32&quot;</span>
        <span style="color: #ff0000;">&quot;C:/MinGW/include/c++/3.4.5/backward&quot;</span>
        <span style="color: #ff0000;">&quot;C:/MinGW/lib/gcc/mingw32/3.4.5/include&quot;</span>
        <span style="color: #ff0000;">&quot;C:/Program Files/Microsoft Visual Studio/VC98/MFC/Include&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>include-dirs user-include-dirs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> system-type 'windows-nt<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> include-dirs <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> include-dirs win32-include-dirs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapc</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>dir<span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>semantic-add-system-include dir 'c++-mode<span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>semantic-add-system-include dir 'c-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        include-dirs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-2.2" class="outline-4">
<h4 id="sec-2.2">2.2 代码跳转 </h4>
<div id="text-2.2">
<p>
代码跳转和官方版本一样还是用semantic-ia-fast-jump命令，不过在emacs-23.2里直接用这个命令可能会报下面的错误：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code16'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132716"><td class="code" id="p41327code16"><pre class="text" style="font-family:monospace;">semantic-ia--fast-jump-helper: Symbol's function definition is void: semantic-analyze-tag-references</pre></td></tr></table></div>

<p>
这可能是emacs的bug，semantic-analyze-tag-references这个函数是定义在semantic/analyze/refs.el这个文件中的，而semantic/ia.el里写的是(eval-when-compile (require &#8217;semantic/analyze/refs))，所以运行时这个feature没被load进来，我们需要自己load一下：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code17'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132717"><td class="code" id="p41327code17"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'semantic/analyze/refs<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
另外，官方CEDET里semantic-ia-fast-jump后可以通过命令semantic-mrub-switch-tags来回到曾经跳转过的地方，不过在emacs-23.2里会提示：
</p>
<pre class="example">
Semantic Bookmark ring is currently empty
</pre>
<p>
这是因为semantic-ia-fast-jump会用函数push-mark把跳过的地方放到mark ring里去，官方CEDET通过定义push-mark的advice把它也放到了semantic-mru-bookmark-ring里去，semantic-mrub-switch-tags就是从semantic-mru-bookmark-ring来找位置的，但build in的CEDET里把push-mark的advice去掉了，所以semantic-mru-bookmark-ring总是空的，我的办法是把官方CEDET里对push-mark的device拷贝到我的.emacs中来：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code18'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132718"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p41327code18"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defadvice push-mark <span style="color: #66cc66;">&#40;</span>around semantic-mru-bookmark activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Push a mark at LOCATION with NOMSG and ACTIVATE passed to `push-mark'.
If `semantic-mru-bookmark-mode' is active, also push a tag onto
the mru bookmark stack.&quot;</span>
  <span style="color: #66cc66;">&#40;</span>semantic-mrub-push semantic-mru-bookmark-ring
                      <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span>
                      'mark<span style="color: #66cc66;">&#41;</span>
  ad-do-it<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
这样，我以前写的semantic-ia-fast-jump-back函数也能用了：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code19'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132719"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p41327code19"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> semantic-ia-fast-jump-back <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>ring-empty-p <span style="color: #66cc66;">&#40;</span>oref semantic-mru-bookmark-ring ring<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">error</span> <span style="color: #ff0000;">&quot;Semantic Bookmark ring is currently empty&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span>* <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>ring <span style="color: #66cc66;">&#40;</span>oref semantic-mru-bookmark-ring ring<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>alist <span style="color: #66cc66;">&#40;</span>semantic-mrub-ring-to-assoc-<span style="color: #b1b100;">list</span> ring<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>first <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>semantic-equivalent-tag-p <span style="color: #66cc66;">&#40;</span>oref first tag<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>semantic-current-tag<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> first <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>semantic-mrub-switch-tags first<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
对这个函数需要说明一下：网友<a href="http://fangzhzh.blogs.mu/" target="_blank">fangzhzh</a>提过可以用C-u C-space来跳回原来的mark，<a href="http://emacser.com/about.htm#ahei" target="_blank">ahei</a>说可以用C-x C-x来跳回，可我测试这两个按键好像跳得都有点乱，不能和semantic-ia-fast-jump的位置对应。我估计是这两个key是跳回push-mark函数mark的位置，而push-mark不光CEDET用。我的需求是只跳回semantic-ia-fast-jump曾经到过的地方，所以仍然保留了这个函数。
</p>
<p>
我的习惯还是绑定到F12上：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code20'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132720"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p41327code20"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> semantic-ia-fast-jump-or-back <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional back<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;P&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> back
      <span style="color: #66cc66;">&#40;</span>semantic-ia-fast-jump-back<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>semantic-ia-fast-jump <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key semantic-mode-map <span style="color: #66cc66;">&#91;</span>f12<span style="color: #66cc66;">&#93;</span> 'semantic-ia-fast-jump-or-back<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key semantic-mode-map <span style="color: #66cc66;">&#91;</span>C-f12<span style="color: #66cc66;">&#93;</span> 'semantic-ia-fast-jump-or-back<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key semantic-mode-map <span style="color: #66cc66;">&#91;</span>S-f12<span style="color: #66cc66;">&#93;</span> 'semantic-ia-fast-jump-back<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
这儿多出来个semantic-ia-fast-jump-or-back函数，是因为我有时候在putty里操作远程的emacs，putty里用不了S-f12这个key，所以我把f12绑定到semantic-ia-fast-jump-or-back上，这样我可以在putty里通过C-u f12来跳回。
</p>
<p>
以前的semantic-analyze-proto-impl-toggle命令还能用：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code21'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132721"><td class="code" id="p41327code21"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-key semantic-mode-map <span style="color: #66cc66;">&#91;</span>M-S-f12<span style="color: #66cc66;">&#93;</span> 'semantic-analyze-proto-impl-toggle<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-2.3" class="outline-4">
<h4 id="sec-2.3">2.3 代码补全 </h4>
<div id="text-2.3">
<p>
官方版本里可以用命令semantic-ia-complete-symbol-menu弹出semantic的补全菜单，不过这个命令在内置的CEDET里不存在了(可能是因为emacs官方版本认为这个命令只在GUI下能用，不够通用吧)。
</p>
<p>
不过，内置的CEDET倒是可以通过命令complete-symbol(默认绑定到ESC-TAB)在另一个buffer里显示可能补全的内容，像这样：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/cedet/emacs-semantic-complete-symbol.jpg" rel="lightbox"><img src="screenshots/cedet/thumbs/thumbs_emacs-semantic-complete-symbol.jpg" height="150"/></a><p class="wp-caption-text">semantic的complete-symbol</p></div>
<p>
如果还希望能使用补全菜单，可以使用其它插件，比如auto-complete或company-mode：company-mode-0.5已经可以支持emacs内置的CEDET了；auto-complete-1.2对内置CEDET的支持还有些问题，关于如何配置auto-complete-1.2让它支持内置的CEDET，我准备另外写文章介绍。
</p>
</div>
</div>
</div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3">3 EDE配置 </h3>
<div id="text-3">
<p>
ede和官方版本没有区别，仍然用(global-ede-mode t)启用就行了；不过emacs-23.3的Tools菜单下新增了&#8221;Project support (EDE)&#8221;菜单项，可以完成global-ede-mode一样的功能。
</p>
</div>
</div>
<div id="outline-container-4" class="outline-3">
<h3 id="sec-4">4 其它 </h3>
<div id="text-4">
</div>
<div id="outline-container-4.1" class="outline-4">
<h4 id="sec-4.1">4.1 可视化书签 </h4>
<div id="text-4.1">
<p>
官方CEDET里的visual-studio-bookmarks在内置的CEDET里没有了，所以我现在使用<a href="http://www.nongnu.org/bm/" target="_blank">bm</a>了。
</p>
</div>
</div>
<div id="outline-container-4.2" class="outline-4">
<h4 id="sec-4.2">4.2 pulse </h4>
<div id="text-4.2">
<p>
pulse的功能在内置CEDET里还存在，不过官方CEDET里可以用pulse-toggle-integration-advice函数来切换pulse，在内置CEDET里这个函数消失了，现在的办法是设置pulse-command-advice-flag变量来切换：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code22'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132722"><td class="code" id="p41327code22"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> window-system <span style="color: #cc66cc;">1</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
另外，官方版本里对下面这些函数设置了pulse的device：
</p>
<ul>
<li>
goto-line
</li>
<li>
exchange-point-and-mark
</li>
<li>
find-tag
</li>
<li>
tags-search
</li>
<li>
tags-loop-continue
</li>
<li>
pop-tag-mark
</li>
<li>
imenu-default-goto-function</p>
</li>
</ul>
<p>内置版本里这些device都没了，所以我直接把官方版本里的advice拷贝过来了：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code23'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132723"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p41327code23"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defadvice goto-line <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Cause the line that is `goto'd to pulse when the cursor gets there.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice exchange-point-and-mark <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Cause the line that is `goto'd to pulse when the cursor gets there.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">abs</span> <span style="color: #66cc66;">&#40;</span>- <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>mark<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">400</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice find-tag <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;After going to a tag, pulse the line the cursor lands on.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice tags-search <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;After going to a hit, pulse the line the cursor lands on.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice tags-loop-<span style="color: #b1b100;">continue</span> <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;After going to a hit, pulse the line the cursor lands on.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice pop-tag-mark <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;After going to a hit, pulse the line the cursor lands on.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice imenu-default-goto-<span style="color: #b1b100;">function</span> <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;After going to a tag, pulse the line the cursor lands on.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> pulse-command-advice-flag
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
另外，我还喜欢对下面这些函数定义pulse：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41327code24'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4132724"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code" id="p41327code24"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defadvice cua-exchange-point-and-mark <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Cause the line that is `goto'd to pulse when the cursor gets there.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&gt;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">abs</span> <span style="color: #66cc66;">&#40;</span>- <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>mark<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">400</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice switch-to-buffer <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;After switch-to-buffer, pulse the line the cursor lands on.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice previous-buffer <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;After previous-buffer, pulse the line the cursor lands on.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice next-buffer <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;After next-buffer, pulse the line the cursor lands on.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice ido-switch-buffer <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;After ido-switch-buffer, pulse the line the cursor lands on.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defadvice beginning-of-buffer <span style="color: #66cc66;">&#40;</span>after pulse-advice activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;After beginning-of-buffer, pulse the line the cursor lands on.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> pulse-command-advice-flag <span style="color: #66cc66;">&#40;</span>interactive-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>pulse-momentary-highlight-one-line <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-4.3" class="outline-4">
<h4 id="sec-4.3">4.3 h/cpp切换 </h4>
<div id="text-4.3">
<p>
官方CEDET里的eassist.el没有了，所以eassist-switch-h-cpp也没了，现在我用<a href="http://www.hendawi.com/emacs/sourcepair.el" target="_blank">sourcepair</a>代替，sourcepair比eassist-switch-h-cpp更好用。
</p>
</div>
</div>
<div id="outline-container-4.4" class="outline-4">
<h4 id="sec-4.4">4.4 代码折叠 </h4>
<div id="text-4.4">
<p>
semantic-tag-folding.el没有了，可我没找到其它更好的替代方案，所以我把官方CEDET里的semantic-tag-folding.el拷过来了，只需要把文件中(require &#8217;semantic-decorate-mode)替换成(require &#8217;semantic/decorate/mode)就能像以前一样用了。
</p>
<p>
以前的senator-fold-tag功能还可以使用。
</p>
<p>
最后插播个广告，我关于内置CEDET的配置(最后那部分)：<a href="http://github.com/meteor1113/dotemacs/blob/master/init-basic.el" target="_blank">http://github.com/meteor1113/dotemacs/blob/master/init-basic.el</a>
</p>
</div>
</div>
</div>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/built-in-cedet.htm' t='用CEDET浏览和编辑C++代码(续) &amp;#8211; 使用Emacs 23.2内置的CEDET' d='' tag='ahei,C/C++,CEDET,company-mode,cursor,ede,Emacs,emacser,emacser.com,highlight,imenu,lambda,meteor,meteor1113,org,pulse,putty,screenshot,semantic,senator,windows,代码折叠,代码补全,插件,补全,配色,配色' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (185)</li>
	<li><a href="http://emacser.com/emacs.htm" title="Emacs长啥样 (2009年11月5日)">Emacs长啥样</a> (15)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (345)</li>
	<li><a href="http://emacser.com/emacs-cpp-dev.htm" title="在Emacs下用C/C++编程 (2010年10月25日)">在Emacs下用C/C++编程</a> (33)</li>
	<li><a href="http://emacser.com/auto-complete.htm" title="Emacs才是世界上最强大的IDE － 用auto-complete实现自动补全 (2009年11月11日)">Emacs才是世界上最强大的IDE － 用auto-complete实现自动补全</a> (109)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/built-in-cedet.htm/feed</wfw:commentRss>
		<slash:comments>97</slash:comments>
		</item>
		<item>
		<title>用CEDET浏览和编辑C++代码</title>
		<link>http://emacser.com/cedet.htm</link>
		<comments>http://emacser.com/cedet.htm#comments</comments>
		<pubDate>Wed, 17 Mar 2010 21:59:13 +0000</pubDate>
		<dc:creator>Meteor Liu</dc:creator>
				<category><![CDATA[CEDET]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[自动补全]]></category>
		<category><![CDATA[autoload]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[calc]]></category>
		<category><![CDATA[cogre]]></category>
		<category><![CDATA[company-mode]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ede]]></category>
		<category><![CDATA[editor]]></category>
		<category><![CDATA[eieio]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[highlight]]></category>
		<category><![CDATA[highlight-symbol]]></category>
		<category><![CDATA[imenu]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[meteor]]></category>
		<category><![CDATA[meteor1113]]></category>
		<category><![CDATA[mode-line]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[pulse]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[semantic]]></category>
		<category><![CDATA[senator]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[speedbar]]></category>
		<category><![CDATA[srecode]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[yasnippet]]></category>
		<category><![CDATA[代码折叠]]></category>
		<category><![CDATA[代码补全]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[淡入淡出]]></category>
		<category><![CDATA[补全]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[颜色]]></category>
		<category><![CDATA[鼠标]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=40990</guid>
		<description><![CDATA[



1 前言 
2 简介 

2.1 EDE 
2.2 Semantic 
2.3 SRecode 
2.4 Cogre 
2.5 Speedbar 
2.6 EIEIO 


3 安装 
4 semantic配置 

4.1 功能介绍 

4.1.1 semantic-load-enable-minimum-features 
4.1.2 semantic-load-enable-code-helpers 
4.1.3 semantic-load-enable-gaudy-code-helpers 
4.1.4 semantic-load-enable-excessive-code-helpers 
4.1.5 semantic-load-enable-semantic-debugging-helpers 


4.2 基本配置 
4.3 代码跳转 
4.4 代码补全 


5 EDE配置 
6 其它 

6.1 可视化书签 
6.2 pluse 
6.3 h/cpp切换 
6.4 代码折叠 

6.4.1 semantic-tag-folding 
6.4.2 senator-fold-tag 




7 [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" title="CEDET" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/cedet-logo.png" width="200" height="90"/></p>
<div id="table-of-contents">
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 前言 </a></li>
<li><a href="#sec-2">2 简介 </a>
<ul>
<li><a href="#sec-2.1">2.1 EDE </a></li>
<li><a href="#sec-2.2">2.2 Semantic </a></li>
<li><a href="#sec-2.3">2.3 SRecode </a></li>
<li><a href="#sec-2.4">2.4 Cogre </a></li>
<li><a href="#sec-2.5">2.5 Speedbar </a></li>
<li><a href="#sec-2.6">2.6 EIEIO </a></li>
</ul>
</li>
<li><a href="#sec-3">3 安装 </a></li>
<li><a href="#sec-4">4 semantic配置 </a>
<ul>
<li><a href="#sec-4.1">4.1 功能介绍 </a>
<ul>
<li><a href="#sec-4.1.1">4.1.1 semantic-load-enable-minimum-features </a></li>
<li><a href="#sec-4.1.2">4.1.2 semantic-load-enable-code-helpers </a></li>
<li><a href="#sec-4.1.3">4.1.3 semantic-load-enable-gaudy-code-helpers </a></li>
<li><a href="#sec-4.1.4">4.1.4 semantic-load-enable-excessive-code-helpers </a></li>
<li><a href="#sec-4.1.5">4.1.5 semantic-load-enable-semantic-debugging-helpers </a></li>
</ul>
</li>
<li><a href="#sec-4.2">4.2 基本配置 </a></li>
<li><a href="#sec-4.3">4.3 代码跳转 </a></li>
<li><a href="#sec-4.4">4.4 代码补全 </a></li>
</ul>
</li>
<li><a href="#sec-5">5 EDE配置 </a></li>
<li><a href="#sec-6">6 其它 </a>
<ul>
<li><a href="#sec-6.1">6.1 可视化书签 </a></li>
<li><a href="#sec-6.2">6.2 pluse </a></li>
<li><a href="#sec-6.3">6.3 h/cpp切换 </a></li>
<li><a href="#sec-6.4">6.4 代码折叠 </a>
<ul>
<li><a href="#sec-6.4.1">6.4.1 semantic-tag-folding </a></li>
<li><a href="#sec-6.4.2">6.4.2 senator-fold-tag </a></li>
</ul>
</li>
</ul>
</li>
<li><a href="#sec-7">7 Todo  </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-2">
<h3 id="sec-1">1 前言 </h3>
<div id="text-1">
<p>
网上关于如何用<a href="#www.gnu.org/software/emacs" target="_blank">emacs</a>+<a href="http://cedet.sourceforge.net" target="_blank">cedet</a>做C++ IDE的文章已经很多了，可是大都只列出了配置文件和效果，没有讲清楚具体的配置过程；一篇讲得比较具体的文章(<a href="http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html" target="_blank">http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html</a> ,这篇文章是被cedet官方推荐的)还是英文的。刚接触cedet的用户经常照抄了别人的配置却发现不能补全，而且配置文件是别人的想改还无法下手。本文中我尽量详细解释各个语句的作用，希望能给初次接触的人提供点帮助。<span id="more-40990"></span>
</p>
<p>
cedet于2010年2月26日发布了1.0pre7，强烈建议以前用过cedet觉得速度慢而放弃的同学试试1.0pre7，这个版本速度比以前有很大很大提高。
</p>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h3 id="sec-2">2 简介 </h3>
<div id="text-2">
<p>
cedet是一堆完全用elisp实现的emacs工具的集合，主要有：
</p>
</div>
<div id="outline-container-2.1" class="outline-3">
<h4 id="sec-2.1">2.1 EDE </h4>
<div id="text-2.1">
<p>
用来管理项目，它可以把emacs模拟得像一个IDE那样，把一堆文件作为一个project来管理。
</p>
</div>
</div>
<div id="outline-container-2.2" class="outline-3">
<h4 id="sec-2.2">2.2 Semantic </h4>
<div id="text-2.2">
<p>
Semantic应该是cedet里用得最多的组件了，代码间跳转和自动补全这两大功能都是通过semantic来实现的。
</p>
</div>
</div>
<div id="outline-container-2.3" class="outline-3">
<h4 id="sec-2.3">2.3 SRecode </h4>
<div id="text-2.3">
<p>
SRecode是一个模板系统，通过一些预定义的模板，可以很快地插入一段代码。个人觉得这个功能跟msf-abbrev和yasnippet的功能有些类似。
</p>
</div>
</div>
<div id="outline-container-2.4" class="outline-3">
<h4 id="sec-2.4">2.4 Cogre </h4>
<div id="text-2.4">
<p>
全称叫&#8221;Connected Graph Editor&#8221;，主要和图形相关，比如可以用它来为C++类生成UML图。
</p>
</div>
</div>
<div id="outline-container-2.5" class="outline-3">
<h4 id="sec-2.5">2.5 Speedbar </h4>
<div id="text-2.5">
<p>
Speedbar可以单独创建一个frame，用于显示目录树，函数列表等等。这个组件已经包含在emacs官方发布包中。
</p>
</div>
</div>
<div id="outline-container-2.6" class="outline-3">
<h4 id="sec-2.6">2.6 EIEIO </h4>
<div id="text-2.6">
<p>
EIEIO是一个底层库，它为elisp加入了OO支持。cedet的其它组件都依赖于EIEIO。
</p>
</div>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h3 id="sec-3">3 安装 </h3>
<div id="text-3">
<p>
安装就不多说了，<a href="http://emacser.com/install-cedet.htm" target="_blank">这儿</a>详细说明了如何下载安装。
</p>
<p>
要注意的是通过cvs下载必须要编译后才能用，而官方发布后的包可以直接解压不编译也是能用。
</p>
<p>
安装完后首先当然要load它(确保安装的路径已经在load-path中了)：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code44'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099044"><td class="code" id="p40990code44"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'cedet<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-4" class="outline-2">
<h3 id="sec-4">4 semantic配置 </h3>
<div id="text-4">
<p>
先介绍一下最常用的semantic。
</p>
</div>
<div id="outline-container-4.1" class="outline-3">
<h4 id="sec-4.1">4.1 功能介绍 </h4>
<div id="text-4.1">
<p>
一般装插件的思路，都是先load然后enable某个minor mode。cedet基本上也遵循这个规则，不过有点区别是semantic定义了很多个mode，要是挨个去enable，用户可能就要骂娘了，所以cedet的作者Eric定义了几个方便使用的函数，这些函数会自动帮你enable某些minor mode，大概有这么几个：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code45'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099045"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p40990code45"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>semantic-load-enable-minimum-features<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>semantic-load-enable-code-helpers<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>semantic-load-enable-guady-code-helpers<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>semantic-load-enable-excessive-code-helpers<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>semantic-load-enable-semantic-debugging-helpers<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
简单介绍一下各个函数的功能：
</p>
</div>
<div id="outline-container-4.1.1" class="outline-4">
<h5 id="sec-4.1.1">4.1.1 semantic-load-enable-minimum-features </h5>
<div id="text-4.1.1">
<p>
这个函数开启了最基本的三个特性：
</p>
<ul>
<li id="sec-4.1.1.1">semantic-idle-scheduler-mode <br/>
<p>
enable这个mode让cedet在emacs空闲的时候自动分析buffer内容，比如正在编辑的buffer内容改变后。这个mode一般应该是需要enable的，如果没有enable这个mode，那只有手工触发才会让cedet重新分析。
</p>
</li>
<li id="sec-4.1.1.2">semanticdb-minor-mode <br/>
<p>
semanticdb是semantic用来保存分析后的内容的，所以也是应该enable的。
</p>
</li>
<li id="sec-4.1.1.3">semanticdb-load-ebrowse-caches <br/>
<p>
这个feature我不是很确定，大概的意思好像是semantic可以利用ebrowse的结果。这个feature大概就是把ebrowse生成的文件load给semantic使用。(要是谁了解这个feature具体意义请告诉我下)
</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-4.1.2" class="outline-4">
<h5 id="sec-4.1.2">4.1.2 semantic-load-enable-code-helpers </h5>
<div id="text-4.1.2">
<p>
这个函数除enable semantic-load-enable-minimum-features外，还包括：
</p>
<ul>
<li id="sec-4.1.2.1">imenu <br/>
<p>
这个feature可以让imenu显示semantic分析出的类，函数等tags。如图：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-imenu.jpg" rel="lightbox"><img title="imenu显示semantic分析出的类" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/thumbs/thumbs_emacs-semantic-imenu.jpg" width="150" height="150" /></a><p class="wp-caption-text">imenu显示semantic分析出的类</p></div>
</li>
<li id="sec-4.1.2.2">semantic-idle-summary-mode <br/>
<p>
打开这个mode之后，光标停留在一个类/函数等tag上时，会在minibuffer显示出这个函数原型，如图：
</p>
<div class="wp-caption alignnone" style="width: 610px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-idle-summary.jpg" rel="lightbox"><img title="用ssemantic在minibuffer显示函数原型" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-idle-summary.jpg" width="600" /></a><p class="wp-caption-text">用ssemantic在minibuffer显示函数原型</p></div>
</li>
<li id="sec-4.1.2.3">senator-minor-mode <br/>
<p>
senator开启之后，会在emacs上增加一个senator的菜单，可以通过菜单在当前文件的各个tag之间前后移动，跳转；还可以在里面方便地打开/关闭某个feature；还有另外一些实用的功能，看看菜单大概就能明白：
</p>
<div class="wp-caption alignnone" style="width: 190px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-senator-menu.jpg" rel="lightbox"><img title="senator菜单" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-senator-menu.jpg"/></a><p class="wp-caption-text">senator菜单</p></div>
</li>
<li id="sec-4.1.2.4">semantic-mru-bookmark-mode <br/>
<p>
cedet有tag跳转的功能，但是经常跳转完后还需要跳回刚才的位置，这时候就需要mru-bookmark-mode了。打开这个mode之后，每次跳转semantic都会把位置当作书签一样记录下来，以后可以通过M-x semantic-mrub-switch-tags（绑定到按键C-x B上）来选择跳回以前的任意一个位置。
</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-4.1.3" class="outline-4">
<h5 id="sec-4.1.3">4.1.3 semantic-load-enable-gaudy-code-helpers </h5>
<div id="text-4.1.3">
<p>
这个函数除enable semantic-load-enable-code-helpers之外，还包括：
</p>
<ul>
<li id="sec-4.1.3.1">semantic-stickyfunc-mode <br/>
<p>
这个mode会根据光标位置把当前函数名显示在buffer顶上，如图：
</p>
<div class="wp-caption alignnone" style="width: 610px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-stickyfunc.jpg" rel="lightbox"><img title="在head-line上显示函数名" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-stickyfunc.jpg" width="600"/></a><p class="wp-caption-text">在head-line上显示函数名</p></div>
<p>
这个mode我觉得用处不大，因为基本上可以用which-func-mode代替。而且我习惯打开tabbar-mode，这个mode会覆盖tabbar-mode，所以我是不打开它的。
</p>
</li>
<li id="sec-4.1.3.2">semantic-decoration-mode <br/>
<p>
打开这个mode后，semantic会在类/函数等tag上方加一条蓝色的线，源文件很大的时候用它可以提示出哪些是类和函数的头。如图：
</p>
<div class="wp-caption alignnone" style="width: 610px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-decoration.jpg" rel="lightbox"><img title="semantic标记函数头" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-decoration.jpg" width="600"/></a><p class="wp-caption-text">semantic标记函数头</p></div>
</li>
<li id="sec-4.1.3.3">semantic-idle-completions-mode <br/>
<p>
这个mode打开后，光标在某处停留一段时间后，semantic会自动提示此处可以补全的内容。比如下面这段代码：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-idle-complete-1.jpg" rel="lightbox"><img title="semantic自动补全当前光标内容" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/thumbs/thumbs_emacs-semantic-idle-complete-1.jpg" width="150" height="150" /></a><p class="wp-caption-text">semantic自动补全当前光标内容</p></div>
<p>
如果把光标停留在&#8221;this-&gt;&#8221;的后面，稍隔一会会提示：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-idle-complete-2.jpg" rel="lightbox"><img title="semantic自动补全当前光标内容" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/thumbs/thumbs_emacs-semantic-idle-complete-2.jpg" width="150" height="150" /></a><p class="wp-caption-text">semantic自动补全当前光标内容</p></div>
<p>
如果提示的函数不是需要的，按TAB键可以在各个可能的函数之间循环，按回车就可以确定了。
</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-4.1.4" class="outline-4">
<h5 id="sec-4.1.4">4.1.4 semantic-load-enable-excessive-code-helpers </h5>
<div id="text-4.1.4">
<p>
这个函数除enable semantic-load-enable-gaudy-code-helpers之外，还包括：
</p>
<ul>
<li id="sec-4.1.4.1">semantic-highlight-func-mode <br/>
<p>
打开这个mode的话，semantic会用灰的底色把光标所在函数名高亮显示，如下图中，函数Delete被高亮了，而LexicalCast没被高亮：
</p>
<div class="wp-caption alignnone" style="width: 610px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-highlight-func.jpg" rel="lightbox"><img title="semantic高亮当前函数" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-highlight-func.jpg" width="600"/></a><p class="wp-caption-text">semantic高亮当前函数</p></div>
</li>
<li id="sec-4.1.4.2">semantic-idle-tag-highlight-mode <br/>
<p>
用过XCode或eclipse的人应该会喜欢高亮光标处变量的功能：就是在函数内部，光标停留在一个变量上，整个函数内部用这个变量的地方都高亮了。在emacs里只要打开semantic-idle-tag-highlight-mode，光标在变量处停留一会，就会把相同的变量全都高亮，比如下图中的变量mAddr：
</p>
<div class="wp-caption alignnone" style="width: 610px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-idle-tag-highlight.jpg" rel="lightbox"><img title="semantic智能高亮当前符号" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-idle-tag-highlight.jpg" width="600"/></a><p class="wp-caption-text">semantic智能高亮当前符号</p></div>
<p>
semantic的这个tag-highlight虽然智能，可是我感觉它显示得太慢了，所以我是用另一个插件<a href="http://nschum.de/src/emacs/highlight-symbol/" target="_blank">highlight-symbol</a>来高亮的，<a href="http://emacser.com/highlight-symbol.htm" target="_blank">这儿</a>有它的介绍。
</p>
</li>
<li id="sec-4.1.4.3">semantic-decoration-on-*-members <br/>
<p>
把private和protected的函数用颜色标识出来，如图：
</p>
<div class="wp-caption alignnone" style="width: 610px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-decoration-on-star.jpg" rel="lightbox"><img title="semantic用颜色区分方法的访问权限" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-decoration-on-star.jpg" width="600"/></a><p class="wp-caption-text">semantic用颜色区分方法的访问权限</p></div>
</li>
<li id="sec-4.1.4.4">which-func-mode <br/>
<p>
这个其实就是emacs自带的which-function-mode，把光标当前所在的函数名显示在mode-line上。
</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-4.1.5" class="outline-4">
<h5 id="sec-4.1.5">4.1.5 semantic-load-enable-semantic-debugging-helpers </h5>
<div id="text-4.1.5">
<p>
这个函数会enable几个和调试semantic相关的特性：
</p>
<ul>
<li id="sec-4.1.5.1">semantic-highlight-edits-mode <br/>
<p>
打开这个mode后，emacs会把最近修改过的内容高亮出来，如下图中begin就是刚输入的，所以用灰底色高亮了：
</p>
<div class="wp-caption alignnone" style="width: 600px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-highlight-edits.jpg" rel="lightbox"><img title="semantic高亮最近修改" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-highlight-edits.jpg"/></a><p class="wp-caption-text">semantic高亮最近修改</p></div>
<p>
隔一段时间后高亮会自动取消，不会一直高亮着让整个buffer看起来混乱。
</p>
<p>
其实emacs自带也有高亮修改内容的mode：highlight-changes-mode，它会用红色的字体高亮所有修改的内容，但是不会自动取消，所以修改多了整个buffer就会乱七八糟糕。用semantic这个就好多了。
</p>
</li>
<li id="sec-4.1.5.2">semantic-show-unmatched-syntax-mode <br/>
<p>
这个mode会把semantic解析不了的内容用红色下划线标识出来，比如下面这个文件是从emacs源代码中来的：
</p>
<div class="wp-caption alignnone" style="width: 610px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-highlight-unmatched-syntax.jpg" rel="lightbox"><img title="semantic用红色下划线标记不匹配的语法" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-highlight-unmatched-syntax.jpg" width="600"/></a><p class="wp-caption-text">semantic用红色下划线标记不匹配的语法</p></div>
</li>
<li id="sec-4.1.5.3">semantic-show-parser-state-mode <br/>
<p>
打开这个mode，semantic会在modeline上显示出当前解析状态，这是关闭mode的样子：
</p>
<p><img title="semantic在mode-line上显示解析状态" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-show-parse-1.jpg"/></p>
<p>
这是打开mode的样子：
</p>
<p><img title="semantic在mode-line上显示解析状态" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-show-parse-2.jpg"/></p>
<p>
能看出modeline上文件名前的横线多了一条，其实倒数第二条就是用来显示当前semantic解析状态的：未解析时显示为&#8221;!&#8221;，正在解析时显示&#8221;@&#8221;，解析完后显示&#8221;-&#8221;，如果buffer修改后未重新解析显示为&#8221;^&#8221;。
</p>
<p>
semantic会在空闲时自动解析，另外可以打开senator-minor-mode，按[C-c , ,]或者在senator菜单中选[Force Tag Refresh]强制它马上解析。
</p>
</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-4.2" class="outline-3">
<h4 id="sec-4.2">4.2 基本配置 </h4>
<div id="text-4.2">
<p>
了解了上面这些feature，就可以根据需要配置了，为了使用semantic，至少需要开启semantic-load-enable-minimum-features定义的三个基础feature，其余的feature就可以根据自己的需要开启了。比如我的配置是：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code46'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099046"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p40990code46"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; (semantic-load-enable-minimum-features)</span>
<span style="color: #66cc66;">&#40;</span>semantic-load-enable-code-helpers<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;; (semantic-load-enable-guady-code-helpers)</span>
<span style="color: #808080; font-style: italic;">;; (semantic-load-enable-excessive-code-helpers)</span>
<span style="color: #66cc66;">&#40;</span>semantic-load-enable-semantic-debugging-helpers<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
因为imenu,idle-summary-mode,senator-mode,mru-bookmark-mode都是我需要的。特别是senator，有时候我会碰到semantic等很久也不自动解析文件的问题，这时候就需要在senator菜单里[Force Tag Refresh]一下了，并且senator还可以通过菜单方便地打开和关闭某些mode，用起来还是很方便的。
</p>
<p>
(semantic-load-enable-guady-code-helpers)和(semantic-load-enable-excessive-code-helpers)定义的那些feature，对我来说用处不大，而且我感觉打开的话还会让emacs反应变慢，所以我就不启用了。
</p>
<p>
(semantic-load-enable-semantic-debugging-helpers)的几个feature我都比较喜欢，所以我也启用了。
</p>
<p>
有了这些基本配置，在emacs打开C和C++文件的时候，semantic就会自动解析文件。不过有个问题，一个cpp文件中肯定会include很多头文件，要想解析这个cpp的内容，头文件的信息是必要的；但是头文件可能和cpp放在一起，也可能放在系统某个目录下，semantic怎么才能找到这个头文件一起解析呢？
</p>
<p>
semantic是这样处理的：1、如果当前目录中能找到，就直接在当前文件中读取头文件。2、如果当前目录下没有，就上系统INCLUDE目录中去找（在Linux下，我们一般使用gcc编译器，semantic会自动调用gcc，取得gcc的INCLUDE目录，比如/usr/include,/usr/local/include等，但是Windows下就不行了）。
</p>
<p>
BTW：很多文档中提到需要load semantic-gcc，不过我没有load它，在Linux下semantic仍然能自动把gcc的INCLUDE目录加进来。
</p>
<p>
semantic这种找法肯定会造成大量的头文件找不到的(找不到头文件还怎么解析啊)，有两个问题需要解决：1、很多工程中都会把头文件和实现文件分开放置，比如头文件放在include(或者inc,public,common等)目录中，实现文件放在src目录中，这些目录semantic是不能自己找的；2、在Windows下怎么能让semantic去找编译器的INCLUDE目录。
</p>
<p>
既然semantic不能自动查找找，那就只能我们告诉semantic了，办法是调用semantic-add-system-include函数，这个函数会根据mode把路径加入到semantic-dependency-system-include-path里去。下面是我的配置：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code47'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099047"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code" id="p40990code47"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; (setq semanticdb-project-roots (list (expand-file-name &quot;/&quot;)))</span>
<span style="color: #66cc66;">&#40;</span>defconst cedet-user-include-dirs
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;..&quot;</span> <span style="color: #ff0000;">&quot;../include&quot;</span> <span style="color: #ff0000;">&quot;../inc&quot;</span> <span style="color: #ff0000;">&quot;../common&quot;</span> <span style="color: #ff0000;">&quot;../public&quot;</span>
        <span style="color: #ff0000;">&quot;../..&quot;</span> <span style="color: #ff0000;">&quot;../../include&quot;</span> <span style="color: #ff0000;">&quot;../../inc&quot;</span> <span style="color: #ff0000;">&quot;../../common&quot;</span> <span style="color: #ff0000;">&quot;../../public&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defconst cedet-win32-include-dirs
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;C:/MinGW/include&quot;</span>
        <span style="color: #ff0000;">&quot;C:/MinGW/include/c++/3.4.5&quot;</span>
        <span style="color: #ff0000;">&quot;C:/MinGW/include/c++/3.4.5/mingw32&quot;</span>
        <span style="color: #ff0000;">&quot;C:/MinGW/include/c++/3.4.5/backward&quot;</span>
        <span style="color: #ff0000;">&quot;C:/MinGW/lib/gcc/mingw32/3.4.5/include&quot;</span>
        <span style="color: #ff0000;">&quot;C:/Program Files/Microsoft Visual Studio/VC98/MFC/Include&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>require 'semantic-c <span style="color: #b1b100;">nil</span> 'noerror<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>include-dirs cedet-user-include-dirs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> system-type 'windows-nt<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> include-dirs <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> include-dirs cedet-win32-include-dirs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapc</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>dir<span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>semantic-add-system-include dir 'c++-mode<span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>semantic-add-system-include dir 'c-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        include-dirs<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
因为我在Windows下可能用MinGW和VC6，所以我把它们的include目录都加进来了，要是你用别的编译器，就改成自己的目录好了。
</p>
<p>
另外，我找了一些一般项目中经常用到的头文件目录名(include,inc,common,public)，把它们也加进来了，这样对于一般的项目来说基本上都能解析正确（比如我们在项目中见到头文件放在include目录实现文件放在src目录的方式，对src目录下一个cpp文件，通过“../include”这个路径就能找到对应的头文件）。如果你的项目中还用了其它一些目录名，也可以配置在这儿。
</p>
<p>
上面配置中那一行(require &#8217;semantic-c nil &#8216;noerror)是必须的，因为semantic的大部分功能是autoload的，如果不在这儿load semantic-c，那打开一个c文件时会自动load semantic-c，它会把semantic-dependency-system-include-path重设为/usr/include，结果就造成前面自定义的include路径丢失了。
</p>
<p>
顺便说一下semanticdb-project-roots的配置，很多地方都说要把它配置成&#8221;/&#8221;，但是我在Linux/Mac/Windows都试验过，不配这一行并没什么影响。
</p>
<p>
解析文件是semantic基本高级功能的基础，正确地解析了文件我们才能实现：代码跳转和代码补全。
</p>
</div>
</div>
<div id="outline-container-4.3" class="outline-3">
<h4 id="sec-4.3">4.3 代码跳转 </h4>
<div id="text-4.3">
<p>
有了前面的配置，semantic自动就解析c/c++文件，解析完后跳转就容易了：光标放在函数上，执行M-x semantic-ia-fast-jump，马上就跳转到函数的定义上了。如果跳不过去，那就检查一下前面配置的INCLUDE路径，是不是当前文件include的所有头文件都能在INCLUDE中找到。如果检查了很多遍都不好用，那就换个项目或者别的文件试试，确实存在semantic对某些文件支持不太好的情况，比如boost。
</p>
<p>
semantic-ia-fast-jump这个功能如此常用，我就把它绑定到f12上去了。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code48'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099048"><td class="code" id="p40990code48"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span>f12<span style="color: #66cc66;">&#93;</span> 'semantic-ia-fast-jump<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
另外，前面我们说过跳转过去了我们还需要跳回来，在打开mru-bookmark-mode的情况下，按[C-x B]，emacs会提示你跳回到哪个地方，一般默认的就是上一次semantic-ia-fast-jump的位置，所以回车就可以回去了。
</p>
<p>
不过看代码时候我经常需要跳转后马上就跳回来，要按[C-x B] [RET]这么多键实在有点麻烦，所以我写了个函数不提示直接就跳回上次的位置，并把它绑定到shift+f12上了：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code49'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099049"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p40990code49"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span>S-f12<span style="color: #66cc66;">&#93;</span>
                <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>ring-empty-p <span style="color: #66cc66;">&#40;</span>oref semantic-mru-bookmark-ring ring<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">error</span> <span style="color: #ff0000;">&quot;Semantic Bookmark ring is currently empty&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span>* <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>ring <span style="color: #66cc66;">&#40;</span>oref semantic-mru-bookmark-ring ring<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                         <span style="color: #66cc66;">&#40;</span>alist <span style="color: #66cc66;">&#40;</span>semantic-mrub-ring-to-assoc-<span style="color: #b1b100;">list</span> ring<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                         <span style="color: #66cc66;">&#40;</span>first <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>semantic-equivalent-tag-p <span style="color: #66cc66;">&#40;</span>oref first tag<span style="color: #66cc66;">&#41;</span>
                                                   <span style="color: #66cc66;">&#40;</span>semantic-current-tag<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> first <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                    <span style="color: #66cc66;">&#40;</span>semantic-mrub-switch-tags first<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
除了semantic-ia-fast-jump可以跳转之外，其实semantic中还有两个函数也有类似的功能：
</p>
<ul>
<li>
semantic-complete-jump-local
</li>
<li>
semantic-complete-jump</p>
</li>
</ul>
<p>看名字很容易看出来，前一个只能在当前buffer内跳转，后一个可以跳转到其它文件。不过这两个命令都需要用户手工输入要跳转的Tag名，不能像semantic-ia-fast-jump那样自动识别当前光标处单词，所以浏览代码时还是semantic-ia-fast-jump舒服。
</p>
<p>
cedet还有个功能在函数和声明和实现间跳转，一般的，函数声明放在h文件中，函数的实现放在cpp文件中，光标在函数体的时候通过M-x semantic-analyze-proto-impl-toggle可以跳到函数声明去，在声明处再执行的话就会再跳回函数体，我把它绑定到M-S-F12上了：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code50'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099050"><td class="code" id="p40990code50"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span>M-S-f12<span style="color: #66cc66;">&#93;</span> 'semantic-analyze-proto-impl-toggle<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
不是这个功能不是十分准确，一般在cpp中函数实现处想跳到函数声明处正常，但是从声明处跳到实现处的话cedet不一定能找到cpp文件的位置。
</p>
</div>
</div>
<div id="outline-container-4.4" class="outline-3">
<h4 id="sec-4.4">4.4 代码补全 </h4>
<div id="text-4.4">
<p>
semantic中有4个用来代码补全的命令：
</p>
<ul>
<li>
senator-complete-symbol
</li>
<li>
senator-completion-menu-popup
</li>
<li>
semantic-ia-complete-symbol
</li>
<li>
semantic-ia-complete-symbol-menu</p>
</li>
</ul>
<p>senator-complete-symbol和semantic-ia-complete-symbol这两个函数是新开一个buffer提示可能的补全内容；而senator-completion-menu-popup和semantic-ia-complete-symbol-menu会弹出一个补全菜单。
</p>
<p>
至于功能，以senator开头的两个函数是调用senator补全，另外两个是调用semantic-ia补全。至于senator和semantic-ia的区别，<a href="http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html#sec9" target="_blank">http://alexott.net/en/writings/emacs-devenv/EmacsCedet.html#sec9</a>是这样解释的：
</p>
<p>
“semantic-ia调用semantic-analyze-possible-completions函数来取得可能的补全内容，它能为用户提供精确的补全列表；而senator用了一个更简单的的函数来获取补全内容，所以有可能会提供错误的结果。”
</p>
<p>
也就是说semantic-ia的补全更智能一些。
</p>
<p>
至于semantic-ia这两个补全选哪一样就看各人喜好了，我喜欢用semantic-ia-complete-symbol-menu，因为看起来更直观一些，像这样：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic.png" rel="lightbox"><img title="semantic的补全菜单" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/thumbs/thumbs_emacs-semantic.png" width="150" height="150" /></a><p class="wp-caption-text">semantic的补全菜单</p></div>
<p>
我喜欢把它绑定到[Alt+n]上：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code51'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099051"><td class="code" id="p40990code51"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;M-n&quot;</span><span style="color: #66cc66;">&#41;</span> 'semantic-ia-complete-symbol-menu<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
不过semantic-ia-complete-symbol-menu只能用于GUI下，要是在终端下，就只能用semantic-ia-complete-symbol了。(终端下想要semantic-ia-complete-symbol一样的结果可以用别的插件，比如auto-complete或者company-mode)
</p>
<p>
如果启用了semantic-idle-completions-mode，不用按键只需要光标在.或者-&gt;后面停一会semantic就会自动开始补全了。
</p>
<p>
如果你用cedet不能补全，检查一下semantic是不是已经启用了，我的emacs上经常出现第一次打开c++-mode时semantic没自动启用的情况。看semantic是否正常有个直观的方法就是senator，如果启用了senator-minor-mode，打开c++文件时emacs会出现Senator菜单，如果没有Senator菜单你可以关掉再重新打开试试，要是仍然不出现菜单那就得检查配置是不是有问题。
</p>
<p>
如果确认semantic启用了仍然不能补全，就需要检查INCLUDE路径的配置，通过C-h v semantic-dependency-system-include-path RET检查INCLUDE路径，确保当前cpp中直接或间接include的头文件都能在INCLUDE路径中找到。
</p>
</div>
</div>
</div>
<div id="outline-container-5" class="outline-2">
<h3 id="sec-5">5 EDE配置 </h3>
<div id="text-5">
<p>
EDE是用来管理project的工具，用下面的代码启用它：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code52'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099052"><td class="code" id="p40990code52"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-ede-mode t<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
EDE会在emacs中加一个叫做“Project”的菜单：
</p>
<div class="wp-caption alignnone" style="width: 195px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-ede-menu.jpg" rel="lightbox"><img title="EDE的Project菜单" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-ede-menu.jpg"/></a><p class="wp-caption-text">EDE的Project菜单</p></div>
<p>
通过菜单可以创建project，往project里添加/移除文件；还可以编译project，不过好像只能通过已有的Makefile编译。
</p>
<p>
另外EDE还可以通过Speedbar显示整个project的目录树(见右边的Speedbar)：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-ede-tree.jpg" rel="lightbox"><img title="用Speedbar显示project的目录树" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/thumbs/thumbs_emacs-ede-tree.jpg" width="150" height="150" /></a><p class="wp-caption-text">用Speedbar显示project的目录树</p></div>
<p>
EDE可以支持四种类型的project：
</p>
<ul>
<li>
Automake
</li>
<li>
手工写的Makefile
</li>
<li>
C++ Root project
</li>
<li>
Simple project</p>
</li>
</ul>
<p>并且EDE能解析Autoconf/Automake，如果打开一个文件时在当前或者上级目录中能找到Makefile.am文件，EDE会自动解析文件(认为这是一个Automake的project)，识别出Makefile.am中定义的target和编译需用到的文件；打开目录树的话EDE能由Makefile.am中涉及到的文件生成目录树（上图的目录树就是EDE通过Makefile.am自动生成的）。
</p>
<p>
为了让semantic找到C/C++的头文件，前面是通过调用semantic-add-system-include把系统中可能出现的INCLUDE目录都告诉semantic的来实现的。其实semantic还可以通过EDE识别project中特定的INCLUDE目录，方法是在.emacs文件中定义C++ Root project，比如：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code53'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099053"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p40990code53"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> libutil-project
      <span style="color: #66cc66;">&#40;</span>ede-cpp-root-project <span style="color: #ff0000;">&quot;libutil&quot;</span>
                            <span style="color: #66cc66;">:</span><span style="color: #555;">file</span> <span style="color: #ff0000;">&quot;~/projects/libutil/configure.in&quot;</span>
                            <span style="color: #66cc66;">:</span><span style="color: #555;">system-include-path</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;/home/meteor1113/projects/include&quot;</span>
                                                   <span style="color: #ff0000;">&quot;/home/meteor1113/projects/common&quot;</span>
                                                   <span style="color: #ff0000;">&quot;/home/meteor1113/projects/libutil/pub&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> test-project
      <span style="color: #66cc66;">&#40;</span>ede-cpp-root-project <span style="color: #ff0000;">&quot;test&quot;</span>
                            <span style="color: #66cc66;">:</span><span style="color: #555;">file</span> <span style="color: #ff0000;">&quot;~/test/Makefile&quot;</span>
                            <span style="color: #66cc66;">:</span><span style="color: #555;">system-include-path</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;/test/include&quot;</span>
                                                   <span style="color: #ff0000;">&quot;/usr/include/boost-1.42&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
上面定义了两个project，并且设定了各个project各自的INCLUDE目录。
</p>
<p>
不过这种方式有两个缺点：
</p>
<ul>
<li>
不能支持常见的Makefile/Makefile.am型project。
</li>
<li>
我不愿意为每个project都定义这样一个project，对于每天都要自己写代码的项目生成个C++ Root project还可以接受，有时候只是临时阅读一下其它项目，要是还要为它写个EDE的project配置就太麻烦了。</p>
</li>
</ul>
<p>所以这个功能我也一直没用过，有问题的请参考官方文档。我觉得把所有可能的目录都加进system-include里更方便。
</p>
</div>
</div>
<div id="outline-container-6" class="outline-2">
<h3 id="sec-6">6 其它 </h3>
<div id="text-6">
</div>
<div id="outline-container-6.1" class="outline-3">
<h4 id="sec-6.1">6.1 可视化书签 </h4>
<div id="text-6.1">
<p>
emacs有自带的书签功能(c-x r m, c-x r b, c-x r l)，不过对于用了多年VC6的我来说还是更习惯让一个书签能高亮显示出来。cedet里就带了一个可视化的书签，通过下面的语句可以启用它：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code54'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099054"><td class="code" id="p40990code54"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>enable-visual-studio-bookmarks<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
之后就可以通过下面几个按键操作书签了：
</p>
<ul>
<li>
F2     在当前行设置或取消书签
</li>
<li>
C-F2   查找下一个书签
</li>
<li>
S-F2   查找上一个书签
</li>
<li>
C-S-F2 清空当前文件的所有书签</p>
</li>
</ul>
<p>看这个效果：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-eieio-visual-bookmarks.jpg" rel="lightbox"><img title="cedet的可视化标签" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/thumbs/thumbs_emacs-eieio-visual-bookmarks.jpg" width="150" height="150" /></a><p class="wp-caption-text">cedet的可视化标签</p></div>
<p>
有点遗憾的是这个书签功能只能在当前buffer的书签间跳转。
</p>
</div>
</div>
<div id="outline-container-6.2" class="outline-3">
<h4 id="sec-6.2">6.2 pluse </h4>
<div id="text-6.2">
<p>
使用semantic-ia-fast-jump跳转时，cedet有个很酷的效果：在跳转到的行上实现一个淡入淡出的效果。具体的分析和使用看<a href="http://emacser.com/pulse.htm" target="_blank">这儿</a>。
</p>
</div>
</div>
<div id="outline-container-6.3" class="outline-3">
<h4 id="sec-6.3">6.3 h/cpp切换 </h4>
<div id="text-6.3">
<p>
cedet的contrib目录下有一些实用的小功能，比如eassist.el就提供了一个在C++的头文件和实现文件间跳转的小功能。
</p>
<p>
要使用这个功能首先要load它：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code55'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099055"><td class="code" id="p40990code55"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'eassist <span style="color: #b1b100;">nil</span> 'noerror<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
之后就可以通过命令M-x eassist-switch-h-cpp来切换了，我喜欢把它绑定到M-F12上：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code56'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099056"><td class="code" id="p40990code56"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span>M-f12<span style="color: #66cc66;">&#93;</span> 'eassist-switch-h-cpp<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
这个功能是依赖semantic的，也就是说通过cpp找头文件时它也会上配置好的INCLUDE路径中去查找，不过如果通过头文件找cpp文件，好像只能找和头文件所在的同一目录了。
</p>
<p>
eassist-switch-h-cpp有个BUG：它是通过文件扩展名来匹配的(通过eassist-header-switches可配置)，默认它能识别h/hpp/cpp/c/C/H/cc这几个扩展名的文件；但是C++的扩展名还可能会有别的，比如c++,cxx等，对一个扩展名为cxx的文件调用eassist-switch-h-cpp的话，它会创建一个新buffer显示错误信息。所以我把eassist-header-switches配置为：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code57'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099057"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p40990code57"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> eassist-header-switches
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;h&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;cpp&quot;</span> <span style="color: #ff0000;">&quot;cxx&quot;</span> <span style="color: #ff0000;">&quot;c++&quot;</span> <span style="color: #ff0000;">&quot;CC&quot;</span> <span style="color: #ff0000;">&quot;cc&quot;</span> <span style="color: #ff0000;">&quot;C&quot;</span> <span style="color: #ff0000;">&quot;c&quot;</span> <span style="color: #ff0000;">&quot;mm&quot;</span> <span style="color: #ff0000;">&quot;m&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;hh&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;cc&quot;</span> <span style="color: #ff0000;">&quot;CC&quot;</span> <span style="color: #ff0000;">&quot;cpp&quot;</span> <span style="color: #ff0000;">&quot;cxx&quot;</span> <span style="color: #ff0000;">&quot;c++&quot;</span> <span style="color: #ff0000;">&quot;C&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;hpp&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;cpp&quot;</span> <span style="color: #ff0000;">&quot;cxx&quot;</span> <span style="color: #ff0000;">&quot;c++&quot;</span> <span style="color: #ff0000;">&quot;cc&quot;</span> <span style="color: #ff0000;">&quot;CC&quot;</span> <span style="color: #ff0000;">&quot;C&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;hxx&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;cxx&quot;</span> <span style="color: #ff0000;">&quot;cpp&quot;</span> <span style="color: #ff0000;">&quot;c++&quot;</span> <span style="color: #ff0000;">&quot;cc&quot;</span> <span style="color: #ff0000;">&quot;CC&quot;</span> <span style="color: #ff0000;">&quot;C&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;h++&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;c++&quot;</span> <span style="color: #ff0000;">&quot;cpp&quot;</span> <span style="color: #ff0000;">&quot;cxx&quot;</span> <span style="color: #ff0000;">&quot;cc&quot;</span> <span style="color: #ff0000;">&quot;CC&quot;</span> <span style="color: #ff0000;">&quot;C&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;H&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;C&quot;</span> <span style="color: #ff0000;">&quot;CC&quot;</span> <span style="color: #ff0000;">&quot;cc&quot;</span> <span style="color: #ff0000;">&quot;cpp&quot;</span> <span style="color: #ff0000;">&quot;cxx&quot;</span> <span style="color: #ff0000;">&quot;c++&quot;</span> <span style="color: #ff0000;">&quot;mm&quot;</span> <span style="color: #ff0000;">&quot;m&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;HH&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;CC&quot;</span> <span style="color: #ff0000;">&quot;cc&quot;</span> <span style="color: #ff0000;">&quot;C&quot;</span> <span style="color: #ff0000;">&quot;cpp&quot;</span> <span style="color: #ff0000;">&quot;cxx&quot;</span> <span style="color: #ff0000;">&quot;c++&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;cpp&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;hpp&quot;</span> <span style="color: #ff0000;">&quot;hxx&quot;</span> <span style="color: #ff0000;">&quot;h++&quot;</span> <span style="color: #ff0000;">&quot;HH&quot;</span> <span style="color: #ff0000;">&quot;hh&quot;</span> <span style="color: #ff0000;">&quot;H&quot;</span> <span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;cxx&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;hxx&quot;</span> <span style="color: #ff0000;">&quot;hpp&quot;</span> <span style="color: #ff0000;">&quot;h++&quot;</span> <span style="color: #ff0000;">&quot;HH&quot;</span> <span style="color: #ff0000;">&quot;hh&quot;</span> <span style="color: #ff0000;">&quot;H&quot;</span> <span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;c++&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;h++&quot;</span> <span style="color: #ff0000;">&quot;hpp&quot;</span> <span style="color: #ff0000;">&quot;hxx&quot;</span> <span style="color: #ff0000;">&quot;HH&quot;</span> <span style="color: #ff0000;">&quot;hh&quot;</span> <span style="color: #ff0000;">&quot;H&quot;</span> <span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;CC&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;HH&quot;</span> <span style="color: #ff0000;">&quot;hh&quot;</span> <span style="color: #ff0000;">&quot;hpp&quot;</span> <span style="color: #ff0000;">&quot;hxx&quot;</span> <span style="color: #ff0000;">&quot;h++&quot;</span> <span style="color: #ff0000;">&quot;H&quot;</span> <span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;cc&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;hh&quot;</span> <span style="color: #ff0000;">&quot;HH&quot;</span> <span style="color: #ff0000;">&quot;hpp&quot;</span> <span style="color: #ff0000;">&quot;hxx&quot;</span> <span style="color: #ff0000;">&quot;h++&quot;</span> <span style="color: #ff0000;">&quot;H&quot;</span> <span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;C&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;hpp&quot;</span> <span style="color: #ff0000;">&quot;hxx&quot;</span> <span style="color: #ff0000;">&quot;h++&quot;</span> <span style="color: #ff0000;">&quot;HH&quot;</span> <span style="color: #ff0000;">&quot;hh&quot;</span> <span style="color: #ff0000;">&quot;H&quot;</span> <span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;c&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;m&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;mm&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
基本上所有C/C++的扩展名都包含了，同时ObjectiveC也可以用了。
</p>
</div>
</div>
<div id="outline-container-6.4" class="outline-3">
<h4 id="sec-6.4">6.4 代码折叠 </h4>
<div id="text-6.4">
</div>
<div id="outline-container-6.4.1" class="outline-4">
<h4 id="sec-6.4.1">6.4.1 semantic-tag-folding </h4>
<div id="text-6.4.1">
<p>
从我开始用emacs开始就听大虾们说hs-minor-mode可以实现代码折叠，所以我的.emacs里一直把hs-minor-mode打开的，可是用了5年之后我发现还是不习惯它的按键，另外也不是很喜欢它显示的样子，5年来Hide/Show这个菜单对我来说基本上是个摆设。
</p>
<p>
我期待像eclipse那样可以通过鼠标在直接点击就可以打开和折叠代码，这个功能在cedet也实现了(可惜这么长时间一直没发现它)，就是semantic-tag-folding.el(也在cedet的contrib目录下)。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code58'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099058"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p40990code58"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'semantic-tag-folding <span style="color: #b1b100;">nil</span> 'noerror<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-semantic-tag-folding-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
看这个图：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-tag-folding.jpg" rel="lightbox"><img title="cedet的代码折叠" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/thumbs/thumbs_emacs-semantic-tag-folding.jpg" width="150" height="150" /></a><p class="wp-caption-text">cedet的代码折叠</p></div>
<p>
只要用鼠标点击左侧的小三角图标就可以打开或折叠代码了。箭头向下的空心三角表示这段代码可以被折叠，箭头向右的实心三角表示这段代码被打折过了。
</p>
<p>
为了方便键盘操作，我把按键绑定到了[C-c , -]和[C-c , +]上(绑定这么复杂的<br />
按键主要是为了和senator兼容，后面会讲到senator实现代码折叠)：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code59'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099059"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p40990code59"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-key semantic-tag-folding-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c , -&quot;</span><span style="color: #66cc66;">&#41;</span> 'semantic-tag-folding-fold-block<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key semantic-tag-folding-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c , +&quot;</span><span style="color: #66cc66;">&#41;</span> 'semantic-tag-folding-show-block<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
同时它还提供了两个函数可以同时打开和折叠整个buffer的所有代码，分别是<br />
semantic-tag-folding-fold-all和semantic-tag-folding-show-all，我把它们<br />
绑定到了[C-_]和[C-+]上：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code60'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099060"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p40990code60"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-key semantic-tag-folding-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-_&quot;</span><span style="color: #66cc66;">&#41;</span> 'semantic-tag-folding-fold-all<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key semantic-tag-folding-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-+&quot;</span><span style="color: #66cc66;">&#41;</span> 'semantic-tag-folding-show-all<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
打开semantic-tag-folding-mode后，用gdb调试时不能点左侧的fringe切换断点了，所以我把C-?定义为semantic-tag-folding-mode的切换键，在gdb调试时临时把semantic-tag-folding关掉：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code61'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099061"><td class="code" id="p40990code61"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-?&quot;</span><span style="color: #66cc66;">&#41;</span> 'global-semantic-tag-folding-mode<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
不过，semantic-tag-folding在终端下会有一点点小问题：终端下semantic-tag-folding在函数前面加了个“+”或“-”号，看下面这个图：
</p>
<div class="wp-caption alignnone" style="width: 610px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-tag-folding-console.jpg" rel="lightbox"><img title="终端下的semantic-tag-folding" src="https://dea.googlecode.com/svn/trunk/screenshots/cedet/emacs-semantic-tag-folding-console.jpg" width="600"/></a><p class="wp-caption-text">终端下的semantic-tag-folding</p></div>
<p>
虽然功能不受影响(除了不能用鼠标操作外，快捷键和GUI下是一样的)，不过代码不能对齐了还是令我有些不爽，所以终端下我是禁用semantic-tag-folding的，最终我的配置如下：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p40990code62'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4099062"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p40990code62"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> window-system <span style="color: #66cc66;">&#40;</span>require 'semantic-tag-folding <span style="color: #b1b100;">nil</span> 'noerror<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>global-semantic-tag-folding-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-?&quot;</span><span style="color: #66cc66;">&#41;</span> 'global-semantic-tag-folding-mode<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key semantic-tag-folding-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c , -&quot;</span><span style="color: #66cc66;">&#41;</span> 'semantic-tag-folding-fold-block<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key semantic-tag-folding-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c , +&quot;</span><span style="color: #66cc66;">&#41;</span> 'semantic-tag-folding-show-block<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key semantic-tag-folding-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-_&quot;</span><span style="color: #66cc66;">&#41;</span> 'semantic-tag-folding-fold-all<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key semantic-tag-folding-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-+&quot;</span><span style="color: #66cc66;">&#41;</span> 'semantic-tag-folding-show-all<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
需要注意的是，semantic-tag-folding依赖于语法解析，也就是说必须等semantic解析完文件之后才能使用。如果找开文件在fringe处找不到空心三角，可以[Force Tag Refresh]下，或者检查下semantic是否配置正确。
</p>
</div>
</div>
<div id="outline-container-6.4.2" class="outline-4">
<h4 id="sec-6.4.2">6.4.2 senator-fold-tag </h4>
<div id="text-6.4.2">
<p>
终端下不用semantic-tag-folding了，最好能有替代方案吧：首先可以用回hs-minor-mode，此外cedet的senator也提供了一种代码折叠方案。
</p>
<p>
只要启用了senator-minor-mode(emacs中会出现Senator菜单)，就可以通过M-x senator-fold-tag和M-x senator-unfold-tag来折叠和打开代码了，GUI和终端下都可以使用。
</p>
<p>
默认地，senator-fold-tag绑定到[C-c , -]，senator-unfold-tag绑定到[C-c , +]上(所以前面我把semantic折叠的快捷键也绑定到这两个键上，这样GUI和终端下快捷键就一致了)。不过senator里好像没有对应的fold-all和show-all方法。
</p>
</div>
</div>
</div>
</div>
<div id="outline-container-7" class="outline-2">
<h3 id="sec-7">7 Todo  </h3>
<div id="text-7">
<p>
以上只是cedet里我用到的一些功能，其实cedet还有很多优秀的功能，比如通过模板自动生成代码(SRecode)；通过代码画UML图以及通过UML图生成代码(Cogre)等；另外semantic除了可以自己解析代码外还可以借助ctags,global,ebrowse来解析。更多的功能需要进一步发掘。
</p>
<p>
最后，欢迎参观我的cedet配置: <a href="http://github.com/meteor1113/dotemacs/blob/master/init-site.el" target="_blank">http://github.com/meteor1113/dotemacs/blob/master/init-site.el</a>
</p>
</div>
</div>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/cedet.htm' t='用CEDET浏览和编辑C++代码' d='' tag='autoload,C/C++,calc,CEDET,cogre,company-mode,eclipse,ede,editor,eieio,Emacs,emacser,emacser.com,gdb,highlight,highlight-symbol,IDE,imenu,lambda,meteor,meteor1113,mode-line,org,pulse,screenshot,semantic,senator,snippet,speedbar,srecode,text,windows,yasnippet,代码折叠,代码补全,光标,插件,淡入淡出,补全,配色,颜色,鼠标' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/emacs.htm" title="Emacs长啥样 (2009年11月5日)">Emacs长啥样</a> (15)</li>
	<li><a href="http://emacser.com/built-in-cedet.htm" title="用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET (2010年05月10日)">用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET</a> (97)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (345)</li>
	<li><a href="http://emacser.com/emacs-cpp-dev.htm" title="在Emacs下用C/C++编程 (2010年10月25日)">在Emacs下用C/C++编程</a> (33)</li>
	<li><a href="http://emacser.com/highlight-symbol.htm" title="Emacs才是世界上最强的IDE － 高亮光标处单词 (2009年11月27日)">Emacs才是世界上最强的IDE － 高亮光标处单词</a> (23)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/cedet.htm/feed</wfw:commentRss>
		<slash:comments>185</slash:comments>
		</item>
		<item>
		<title>Emacs才是世界上最强的IDE － CEDET的安装</title>
		<link>http://emacser.com/install-cedet.htm</link>
		<comments>http://emacser.com/install-cedet.htm#comments</comments>
		<pubDate>Tue, 24 Nov 2009 18:52:54 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[CEDET]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[初级]]></category>
		<category><![CDATA[autoload]]></category>
		<category><![CDATA[buffer]]></category>
		<category><![CDATA[ede]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[lisp]]></category>
		<category><![CDATA[mode]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[semantic]]></category>
		<category><![CDATA[srecode]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[编译]]></category>

		<guid isPermaLink="false">http://ahei.yo2.cn/?p=37107</guid>
		<description><![CDATA[
在准备写Emacs才是世界上最强大的IDE系列文章时，由于以前用的是cedet1.0pre6版本，速度比较慢，而且精确度也不高，所以就没有打算写它，昨天晚上在水木群里听一位网友介绍说cedet的cvs版本速度很快，而且精确度不错，所以晚上就down下cvs的版本试了一把，越试越感觉不错，就有了写cedet的想法。从头开始，先说安装吧。
cedet的安装挺简单，只要仔细看好cedet的说明就可以了，不过我昨天晚上没仔细看好说明，安装的时候碰到一个问题，所以我还是准备写一下安装过程。(如果你用apt-get, 或者emerge安装，首先要看下它们的版本，1.0pre6和其之前的版本都不要安装，语法分析会很慢的。)
首先下载cedet的cvs版本：

?View Code BASH1
2
cvs -d:pserver:anonymous@cedet.cvs.sourceforge.net:/cvsroot/cedet login
cvs -z3 -d:pserver:anonymous@cedet.cvs.sourceforge.net:/cvsroot/cedet co -P cedet

然后编译：


linux下:

?View Code BASH1
2
3
4
5
6
7
8
9
10
11
12
13
cd cedet
touch `find . -name Makefile` &#40;非cvs版本不需要这个&#41;
a&#41; make
或
b&#41; make EMACS=&#60;your favorite emacs&#62;
或
c&#41; make MAKEINFO=/usr/local/bin/makeinfo
或
d&#41; make MAKEINFO=echo
如果编译过程中发生类似找不到loaddef文件，custom-autoload以及其他奇怪的错误，执行：
a&#41; make clean-autoloads
b&#41; make clean-all
然后再重新编译。编译错误还有可能是make版本引起的，请使用GNU make，或者使用windows下的安装方法。



windows下(当然linux下这样也可以)：

?View Code BASH1
2
3
4
5
6
emacs -q --no-site-file -l cedet-build.el -f cedet-build
或
在emacs中打开cedet-build.el文件，然后
M-x eval-buffer
M-x cedet-build-in-default-emacs
编译过程中如果发生超过emacs堆栈大小的错误，退出emacs再重新编译即可。



说完安装，再说一下简单的使用，把下面的代码贴到你的.emacs里面：

?View Code LISP1
2
3
4
5
6
7
8
9
10
11
12
&#40;add-to-list 'load-path &#34;path-of-cedet/common&#34;&#41;
&#40;require 'cedet&#41;
&#40;require 'semantic-ia&#41;
&#160;
;; Enable EDE (Project Management) features
&#40;global-ede-mode 1&#41;
&#160;
&#40;semantic-load-enable-excessive-code-helpers&#41;
&#40;semantic-load-enable-semantic-debugging-helpers&#41;
&#160;
;; [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" title="CEDET" src="screenshots/cedet/cedet-logo.png" width="200" height="90"/></p>
<p>在准备写<a href="emacs-ide.htm" target="_blank">Emacs才是世界上最强大的IDE</a>系列文章时，由于以前用的是cedet1.0pre6版本，速度比较慢，而且精确度也不高，所以就没有打算写它，昨天晚上在水木群里听一位网友介绍说cedet的cvs版本速度很快，而且精确度不错，所以晚上就down下cvs的版本试了一把，越试越感觉不错，就有了写cedet的想法。从头开始，先说安装吧。<span id="more-37107"></span></p>
<p>cedet的安装挺简单，只要仔细看好cedet的说明就可以了，不过我昨天晚上没仔细看好说明，安装的时候碰到一个问题，所以我还是准备写一下安装过程。(如果你用apt-get, 或者emerge安装，首先要看下它们的版本，1.0pre6和其之前的版本都不要安装，语法分析会很慢的。)</p>
<p>首先下载cedet的cvs版本：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p37107code67'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3710767"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p37107code67"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cvs</span> -d:pserver:anonymous<span style="color: #000000; font-weight: bold;">@</span>cedet.cvs.sourceforge.net:<span style="color: #000000; font-weight: bold;">/</span>cvsroot<span style="color: #000000; font-weight: bold;">/</span>cedet <span style="color: #c20cb9; font-weight: bold;">login</span>
<span style="color: #c20cb9; font-weight: bold;">cvs</span> <span style="color: #660033;">-z3</span> -d:pserver:anonymous<span style="color: #000000; font-weight: bold;">@</span>cedet.cvs.sourceforge.net:<span style="color: #000000; font-weight: bold;">/</span>cvsroot<span style="color: #000000; font-weight: bold;">/</span>cedet <span style="color: #c20cb9; font-weight: bold;">co</span> <span style="color: #660033;">-P</span> cedet</pre></td></tr></table></div>

<p>然后编译：</p>
<ul>
<li>
linux下:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p37107code68'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3710768"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p37107code68"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> cedet
<span style="color: #c20cb9; font-weight: bold;">touch</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">find</span> . <span style="color: #660033;">-name</span> Makefile<span style="color: #000000; font-weight: bold;">`</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>非<span style="color: #c20cb9; font-weight: bold;">cvs</span>版本不需要这个<span style="color: #7a0874; font-weight: bold;">&#41;</span>
a<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">make</span>
或
b<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #007800;">EMACS</span>=<span style="color: #000000; font-weight: bold;">&lt;</span>your favorite emacs<span style="color: #000000; font-weight: bold;">&gt;</span>
或
c<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #007800;">MAKEINFO</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>makeinfo
或
d<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #007800;">MAKEINFO</span>=<span style="color: #7a0874; font-weight: bold;">echo</span>
如果编译过程中发生类似找不到loaddef文件，custom-autoload以及其他奇怪的错误，执行：
a<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">make</span> clean-autoloads
b<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #c20cb9; font-weight: bold;">make</span> clean-all
然后再重新编译。编译错误还有可能是<span style="color: #c20cb9; font-weight: bold;">make</span>版本引起的，请使用GNU <span style="color: #c20cb9; font-weight: bold;">make</span>，或者使用windows下的安装方法。</pre></td></tr></table></div>

</li>
<li>
windows下(当然linux下这样也可以)：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p37107code69'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3710769"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p37107code69"><pre class="bash" style="font-family:monospace;">emacs <span style="color: #660033;">-q</span> <span style="color: #660033;">--no-site-file</span> <span style="color: #660033;">-l</span> cedet-build.el <span style="color: #660033;">-f</span> cedet-build
或
在emacs中打开cedet-build.el文件，然后
M-x eval-buffer
M-x cedet-build-in-default-emacs
编译过程中如果发生超过emacs堆栈大小的错误，退出emacs再重新编译即可。</pre></td></tr></table></div>

</li>
</ul>
<p>说完安装，再说一下简单的使用，把下面的代码贴到你的.emacs里面：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p37107code70'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p3710770"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code" id="p37107code70"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;path-of-cedet/common&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>require 'cedet<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>require 'semantic-ia<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Enable EDE (Project Management) features</span>
<span style="color: #66cc66;">&#40;</span>global-ede-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>semantic-load-enable-excessive-code-helpers<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>semantic-load-enable-semantic-debugging-helpers<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Enable SRecode (Template management) minor-mode.</span>
<span style="color: #66cc66;">&#40;</span>global-srecode-minor-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>现在开始享受cedet吧。</p>
<p>关于cedet的进一步使用，我会再写专门的文章介绍，敬请期待，:)。</p>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/install-cedet.htm' t='Emacs才是世界上最强的IDE － CEDET的安装' d='' tag='autoload,buffer,CEDET,ede,Emacs,IDE,linux,lisp,mode,org,screenshot,semantic,srecode,windows,安装,编译' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/emacs-ide.htm" title="Emacs才是世界上最强的IDE － 序言 (2009年11月11日)">Emacs才是世界上最强的IDE － 序言</a> (63)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (185)</li>
	<li><a href="http://emacser.com/emacs.htm" title="Emacs长啥样 (2009年11月5日)">Emacs长啥样</a> (15)</li>
	<li><a href="http://emacser.com/emacs-conf-system.htm" title="Emacs配置系统 (2010年03月4日)">Emacs配置系统</a> (36)</li>
	<li><a href="http://emacser.com/auto-complete.htm" title="Emacs才是世界上最强大的IDE － 用auto-complete实现自动补全 (2009年11月11日)">Emacs才是世界上最强大的IDE － 用auto-complete实现自动补全</a> (109)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/install-cedet.htm/feed</wfw:commentRss>
		<slash:comments>52</slash:comments>
		</item>
	</channel>
</rss>

