<?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; Emacs</title>
	<atom:link href="http://emacser.com/t-emacs.htm/feed" rel="self" type="application/rss+xml" />
	<link>http://emacser.com</link>
	<description>没有我做不到的，只有你想不到的</description>
	<lastBuildDate>Thu, 17 May 2012 14:05:14 +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>使用 Emacs 微博</title>
		<link>http://emacser.com/weibo.htm</link>
		<comments>http://emacser.com/weibo.htm#comments</comments>
		<pubDate>Thu, 17 May 2012 14:05:14 +0000</pubDate>
		<dc:creator>bigclean</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[好玩的]]></category>
		<category><![CDATA[配置]]></category>
		<category><![CDATA[Emacs]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41943</guid>
		<description><![CDATA[作者: Austin_____
简介
“使用 Emacs 的微博”（weibo.emacs)是一个在 Emacs 上使用的微博客户端。它使用 Elisp 语言编写，提供了察看时间线，察看微博及评论，察看图片，发表和转发微博，发表评论和回复的功能。它基于 Emacs，可以在 Windows, Linux 和 Mac 上使用。

功能
察看时间线
提供察看以下时间线的功能

我的关注
我的微博
提到我的
谁在说
我的评论
收到评论

察看微博和评论
提供察看某一条微博和评论的功能
发表微博，发表评论和回复评论
提供发表新微博，对某一条微薄发表评论及回复评论的功能
使用方法
安装
下载
从项目主页下载最新的安装包（或者通过 git 更新到最新）。
安装

将安装包解压到某一目录
将该目录添加到load-path:


?View Code LISP1
2
&#40;add-to-list 'load-path &#34;目录路径&#34;&#41;
&#40;require 'weibo&#41;

配置
不需要配置，可直接使用
使用
开始
通过命令 weibo-timeline 开始察看时间线: M-x weibo-timeline
授权
第一次使用时，将会自动跳转到微博应用授权的页面，登录后确认授权，然后将提示的 pin 码输回 Emacs 的 mini-buffer 即可。
时间线界面
屏幕的最顶端，会出现如下三排提示：
微博：我的关注(a) 我的微博(i) 提到我的(@) 谁在说(w) 我的评论(o) 收到评论(c)
命令：发表微博(P) 察看(L) 转发(T) 评论(C) 回复(R)
操作：新消息(g) 刷新(r) 下一条（空格) 帮助(h) 退出(q)
微博行包括了不同的时间线及它们的切换方法。括号内的按键将在当前窗口显示对应的时间线：如提到我的(@)，当按下@键时，将切换提到我的时间线。
命令行包括了可以在时间线中使用的命令。除了发表微博外，其他命令都应将光标移到对应的微博或者评论上使用。
操作行包括了可以在时间线中使用的其他命令，如获取新消息，移到下一条消息，以及退出等等。
切换时间线
使用微博行所提示的按键进行切换。
察看时间线
使用 Emacs 默认的组合键移动光标。此外p，n，b，f键可用来上下左右移动光标。当光标移动到某一条微博或评论时，可按L键察看其对应的微博和最新评论。当微博中有图片时，会在时间线中显示缩略图。将光标移到图片上，按Enter键，会在新窗口中打开原图（按q键退出图片察看）。其他命令如操作中所示。



发表微博
在时间线界面中按P，将出现名为“发表微博”的窗口。在此窗口中编辑你想要发表的微博。完成后，按\C-c\C-c(Ctrl-c, Ctrl-c)提交微博。如果在编辑中想取消发表，按\C-c\C-d将关闭发表窗口（注意：此时你所编辑的内容将消失）。



转发微博
在时间线中，将光标移至某一条微博，按T将出现名为“转发微博”的窗口。此时操作与发表微博类似，完成编辑后，按\C-c\C-c提交微博，按\C-c\C-d取消。
发表评论和回复
在时间线中，按&#8221;C&#8221;对当前光标所在的微博发表评论。此时将出现“发表评论”窗口，操作与发表微博相似：完成编辑后，按\C-c\C-c提交评论，按\C-c\C-d取消。在微博详情和评论时间线中，按R键可以对评论进行回复。



备注
注意并非所有命令都对所有时间线适用。比如你不能对微博进行回复和对评论进行转发。命令行将之包含当前时间线可用的命令。
问题和建议
如果发现 bug 和有任何建议，请在此处创建 bug 报告或者发邮件给我：austiny.cn(at)gmail.com


	相关日志
	
	在 emacs 中使用 bing translate [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://emacser.com/about.htm#austin" target="_blank"><span style="color: #0000ff;"><b>Austin_____</b></span></a></p>
<h3>简介</h3>
<p>“使用 Emacs 的微博”（weibo.emacs)是一个在 Emacs 上使用的微博客户端。它使用 Elisp 语言编写，提供了察看时间线，察看微博及评论，察看图片，发表和转发微博，发表评论和回复的功能。它基于 Emacs，可以在 Windows, Linux 和 Mac 上使用。</p>
<p><span id="more-41943"></span></p>
<h3>功能</h3>
<h4>察看时间线</h4>
<p>提供察看以下时间线的功能</p>
<ul>
<li>我的关注</li>
<li>我的微博</li>
<li>提到我的</li>
<li>谁在说</li>
<li>我的评论</li>
<li>收到评论</li>
</ul>
<h4>察看微博和评论</h4>
<p>提供察看某一条微博和评论的功能</p>
<h4>发表微博，发表评论和回复评论</h4>
<p>提供发表新微博，对某一条微薄发表评论及回复评论的功能</p>
<h3>使用方法</h3>
<h4>安装</h4>
<h5>下载</h5>
<p>从<a href="https://github.com/austin-----/weibo.emacs">项目主页</a>下载最新的安装包（或者通过 git 更新到最新）。</p>
<h5>安装</h5>
<ul>
<li>将安装包解压到某一目录</li>
<li>将该目录添加到load-path:</li>
</ul>

<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('p41943code2'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p419432"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41943code2"><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;目录路径&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>require 'weibo<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<h5>配置</h5>
<p>不需要配置，可直接使用</p>
<h4>使用</h4>
<h5>开始</h5>
<p>通过命令 weibo-timeline 开始察看时间线: <code>M-x weibo-timeline</code></p>
<h5>授权</h5>
<p>第一次使用时，将会自动跳转到微博应用授权的页面，登录后确认授权，然后将提示的 pin 码输回 Emacs 的 mini-buffer 即可。</p>
<h5>时间线界面</h5>
<p>屏幕的最顶端，会出现如下三排提示：</p>
<p><code>微博：我的关注(a) 我的微博(i) 提到我的(@) 谁在说(w) 我的评论(o) 收到评论(c)</code></p>
<p><code>命令：发表微博(P) 察看(L) 转发(T) 评论(C) 回复(R)</code></p>
<p><code>操作：新消息(g) 刷新(r) 下一条（空格) 帮助(h) 退出(q)</code></p>
<p><code>微博</code>行包括了不同的时间线及它们的切换方法。括号内的按键将在当前窗口显示对应的时间线：如<code>提到我的(@)</code>，当按下<code>@</code>键时，将切换提到我的时间线。</p>
<p><code>命令</code>行包括了可以在时间线中使用的命令。除了发表微博外，其他命令都应将光标移到对应的微博或者评论上使用。</p>
<p><code>操作</code>行包括了可以在时间线中使用的其他命令，如获取新消息，移到下一条消息，以及退出等等。</p>
<h5>切换时间线</h5>
<p>使用<code>微博</code>行所提示的按键进行切换。</p>
<h5>察看时间线</h5>
<p>使用 Emacs 默认的组合键移动光标。此外<code>p</code>，<code>n</code>，<code>b</code>，<code>f</code>键可用来上下左右移动光标。当光标移动到某一条微博或评论时，可按<code>L</code>键察看其对应的微博和最新评论。当微博中有图片时，会在时间线中显示缩略图。将光标移到图片上，按<code>Enter</code>键，会在新窗口中打开原图（按<code>q</code>键退出图片察看）。其他命令如<code>操作</code>中所示。</p>
<p><center><br />
<img src="http://i56.tinypic.com/15nac8i.png"/><br />
</center></p>
<h5>发表微博</h5>
<p>在时间线界面中按<code>P</code>，将出现名为“发表微博”的窗口。在此窗口中编辑你想要发表的微博。完成后，按<code>\C-c\C-c</code>(Ctrl-c, Ctrl-c)提交微博。如果在编辑中想取消发表，按<code>\C-c\C-d</code>将关闭发表窗口（注意：此时你所编辑的内容将消失）。</p>
<p><center><br />
<img src="http://i53.tinypic.com/2is9r3c.png"/><br />
</center></p>
<h5>转发微博</h5>
<p>在时间线中，将光标移至某一条微博，按<code>T</code>将出现名为“转发微博”的窗口。此时操作与发表微博类似，完成编辑后，按<code>\C-c\C-c</code>提交微博，按<code>\C-c\C-d</code>取消。</p>
<h5>发表评论和回复</h5>
<p>在时间线中，按&#8221;C&#8221;对当前光标所在的微博发表评论。此时将出现“发表评论”窗口，操作与发表微博相似：完成编辑后，按<code>\C-c\C-c</code>提交评论，按<code>\C-c\C-d</code>取消。在微博详情和评论时间线中，按<code>R</code>键可以对评论进行回复。</p>
<p><center><br />
<img src="http://i56.tinypic.com/2dvvm2s.png"/><br />
</center></p>
<h5>备注</h5>
<p>注意并非所有命令都对所有时间线适用。比如你不能对微博进行回复和对评论进行转发。<code>命令</code>行将之包含当前时间线可用的命令。</p>
<h3>问题和建议</h3>
<p>如果发现 bug 和有任何建议，请在<a href="https://github.com/austin-----/weibo.emacs/issues">此处</a>创建 bug 报告或者发邮件给我：austiny.cn(at)gmail.com</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/weibo.htm' t='使用 Emacs 微博' d='' tag='Emacs,中级,配置' 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/bing.htm" title="在 emacs 中使用 bing translate api 实现高效翻译 (2012年05月12日)">在 emacs 中使用 bing translate api 实现高效翻译</a> (6)</li>
	<li><a href="http://emacser.com/to-emacs-beginner.htm" title="致Emacs初学者 (2009年11月30日)">致Emacs初学者</a> (121)</li>
	<li><a href="http://emacser.com/highlight-tail.htm" title="用性感的尾巴highlight-tail标记最近的修改 (2010年02月26日)">用性感的尾巴highlight-tail标记最近的修改</a> (45)</li>
	<li><a href="http://emacser.com/weblogger.htm" title="用weblogger写WordPress博客 (2010年03月3日)">用weblogger写WordPress博客</a> (101)</li>
	<li><a href="http://emacser.com/pulse.htm" title="用pulse实现Emacs的淡入淡出效果 (2010年02月25日)">用pulse实现Emacs的淡入淡出效果</a> (22)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/weibo.htm/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>在 emacs 中使用 bing translate api 实现高效翻译</title>
		<link>http://emacser.com/bing.htm</link>
		<comments>http://emacser.com/bing.htm#comments</comments>
		<pubDate>Sat, 12 May 2012 11:12:19 +0000</pubDate>
		<dc:creator>bigclean</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[好玩的]]></category>
		<category><![CDATA[配置]]></category>
		<category><![CDATA[Elisp]]></category>
		<category><![CDATA[Emacs]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41928</guid>
		<description><![CDATA[作者: coordinate
本文介绍如何在 Emacs 中使用 Bing translate api实现高效翻译。之所以使用 bing translate api，一方面因为 bing translate api 翻译效果很好，另一方面是因为 google translate api 总是提示说今天的访问超量了(dailyLimitExceeded)。

所需工具

emacs
translate-emacs-toolkit

安装

将 emacs 解压。
克隆 translate-emacs-toolkit 最新版本，或者下载压缩包解压。
在 bing 开发者申请appId。
启动 emacs。
在 .emacs 文件中加入下列代码，配置 appengine-emacs-toolkit。

?View Code LISP1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
&#40;add-to-list 'load-path &#40;concat git-path &#34;translate-emacs-toolkit&#34;&#41;&#41;
&#160;
;; Your appId. Application at http://www.bing.com/toolbox/bingdeveloper/
&#40;defvar bingtranslate-appId &#34;your-appId&#34;&#41; 
&#160;
;; Your priority language to translate from.
&#40;defvar bingtranslate-from-priority &#34;en&#34;&#41;
&#160;
;; Your priority language to translate [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://coordinate.sinaapp.com/" target="_blank"><span style="color: #0000ff;"><b>coordinate</b></span></a></p>
<p>本文介绍如何在 Emacs 中使用 Bing translate api实现高效翻译。之所以使用 bing translate api，一方面因为 bing translate api 翻译效果很好，另一方面是因为 google translate api 总是提示说今天的访问超量了(dailyLimitExceeded)。</p>
<p><span id="more-41928"></span></p>
<h3>所需工具</h3>
<ol>
<li><a href="http://www.gnu.org/software/emacs/">emacs</a></li>
<li><a href="https://code.google.com/p/translate-emacs-toolkit/">translate-emacs-toolkit</a></li>
</ol>
<h3>安装</h3>
<ol>
<li>将 emacs 解压。</li>
<li>克隆 translate-emacs-toolkit 最新版本，或者下载压缩包解压。</li>
<li>在 <a href="http://www.bing.com/toolbox/bingdeveloper/">bing 开发者</a>申请appId。</li>
<li>启动 emacs。</li>
<li>在 .emacs 文件中加入下列代码，配置 appengine-emacs-toolkit。

<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('p41928code4'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p419284"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p41928code4"><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: #66cc66;">&#40;</span>concat git-path <span style="color: #ff0000;">&quot;translate-emacs-toolkit&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Your appId. Application at http://www.bing.com/toolbox/bingdeveloper/</span>
<span style="color: #66cc66;">&#40;</span>defvar bingtranslate-appId <span style="color: #ff0000;">&quot;your-appId&quot;</span><span style="color: #66cc66;">&#41;</span> 
&nbsp;
<span style="color: #808080; font-style: italic;">;; Your priority language to translate from.</span>
<span style="color: #66cc66;">&#40;</span>defvar bingtranslate-from-priority <span style="color: #ff0000;">&quot;en&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Your priority language to translate to.</span>
<span style="color: #66cc66;">&#40;</span>defvar bingtranslate-to-priority <span style="color: #ff0000;">&quot;zh-CHS&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>require 'bing-translate-api<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; key bounding</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span>M-f1<span style="color: #66cc66;">&#93;</span> 'bingtranslate-region-or-input<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; add a pair of language</span>
<span style="color: #808080; font-style: italic;">;; Parameters: &quot;pair name&quot; &quot;from language&quot; &quot;to language&quot;</span>
<span style="color: #66cc66;">&#40;</span>bingtranslate-add-pair <span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #ff0000;">&quot;zh-CHS&quot;</span> <span style="color: #ff0000;">&quot;en&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>其中 plugin-path 是你存放 translate-emacs-toolkit 文件夹的路径（如d:/home/emacs-23/site-lisp/)。最后一句的意思给“简体中文”到“英文”的翻译设置快捷方式。</li>
<li>重启 emacs。</li>
<li>调用命令 bingtranslate-region-or-input(M-x bingtranslate-region-or-input)。输入翻译文本、原始语言（或快捷方式）、翻译语言。在 minibuffer 中会出现翻译结果。并且翻译结果会自动加载在剪切板中。</li>
<li>调用命令 bingtranslate-show-history(M-x bingtranslate-show-history)可以调出翻译历史记录。</li>
</ol>
<h3>实例</h3>
<p><center><img src="http://coordinate-wordpress.stor.sinaapp.com/uploads/2012/03/wpid-translate.gif" title="Bing example" /></center></p>
<p><center>Bing example</center></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/bing.htm' t='在 emacs 中使用 bing translate api 实现高效翻译' d='' tag='Elisp,Emacs,中级,配置' 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/to-emacs-beginner.htm" title="致Emacs初学者 (2009年11月30日)">致Emacs初学者</a> (121)</li>
	<li><a href="http://emacser.com/svn-status-mode-line.htm" title="在mode-line上标记svn状态 (2010年01月28日)">在mode-line上标记svn状态</a> (30)</li>
	<li><a href="http://emacser.com/weibo.htm" title="使用 Emacs 微博 (2012年05月17日)">使用 Emacs 微博</a> (8)</li>
	<li><a href="http://emacser.com/mode-line.htm" title="Emacs的状态栏 － mode-line (2009年11月17日)">Emacs的状态栏 － mode-line</a> (21)</li>
	<li><a href="http://emacser.com/w3m.htm" title="Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页 (2009年11月23日)">Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页</a> (46)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/bing.htm/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Emacs 自动填充头文件</title>
		<link>http://emacser.com/include_files_helper.htm</link>
		<comments>http://emacser.com/include_files_helper.htm#comments</comments>
		<pubDate>Tue, 03 Apr 2012 14:22:39 +0000</pubDate>
		<dc:creator>bigclean</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Elisp]]></category>
		<category><![CDATA[自动补全]]></category>
		<category><![CDATA[配置]]></category>
		<category><![CDATA[高级]]></category>
		<category><![CDATA[Emacs]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41916</guid>
		<description><![CDATA[作者: 杨英超
目标

写 C/C++ 代码时候，可以根据自动补全头文件。注意，是补全，也就是说至少我们需要输入几个字符让它帮忙补全。
如果头文件存放在搜索路径的子目录中，可以自动列出子目录中的文件，并将这些文件添加到用于补齐的候选名单中。
补齐完成之后，可以自动判断到底应该使用 #include  还是 #include &#8220;FILE&#8221; 。


方案
emacser.org 上有一篇文章，其中提到了这个解决方法，主要是利用了 abbrev-mode 和 skeleton-mode 来实现，通过这个方法，我们输入 inc, 然后按空格, 会提示输入文件名称。
代码如下：

?View Code LISP1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
;; 安装 abbrev
&#40;mapc
 &#40;lambda &#40;mode&#41;
   &#40;define-abbrev-table mode '&#40;
                           [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://www.cnblogs.com/yangyingchao/" target="_blank"><span style="color: #0000ff;"><b>杨英超</b></span></a></p>
<h3>目标</h3>
<ol>
<li>写 C/C++ 代码时候，可以根据自动补全头文件。注意，是补全，也就是说至少我们需要输入几个字符让它帮忙补全。</li>
<li>如果头文件存放在搜索路径的子目录中，可以自动列出子目录中的文件，并将这些文件添加到用于补齐的候选名单中。</li>
<li>补齐完成之后，可以自动判断到底应该使用 #include <FILE> 还是 #include &ldquo;FILE&rdquo; 。</li>
</ol>
<p><span id="more-41916"></span></p>
<h3>方案</h3>
<p>emacser.org 上有一篇文章，其中提到了这个<a href="http://emacser.com/include-sys-header.htm">解决方法</a>，主要是利用了 abbrev-mode 和 skeleton-mode 来实现，通过这个方法，我们输入 inc, 然后按空格, 会提示输入文件名称。</p>
<p>代码如下：</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('p41916code7'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p419167"><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
</pre></td><td class="code" id="p41916code7"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; 安装 abbrev</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>mode<span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">&#40;</span>define-abbrev-table mode '<span style="color: #66cc66;">&#40;</span>
                               <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;inc&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> skeleton-include <span style="color: #cc66cc;">1</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>c-mode-abbrev-table c++-mode-abbrev-table<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; 输入 inc , 可以自动提示输入文件名称,可以自动补全.</span>
<span style="color: #66cc66;">&#40;</span>define-skeleton skeleton-include
  <span style="color: #ff0000;">&quot;generate include&lt;&gt;&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;#include &lt;&quot;</span>
  <span style="color: #66cc66;">&#40;</span>completing-read <span style="color: #ff0000;">&quot;Include File:&quot;</span>
                   <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span> #'<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>f<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> f <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span> '<span style="color: #b1b100;">append</span>
                                  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</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>directory-files dir<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                                   <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;/usr/include&quot;</span>
                                         <span style="color: #ff0000;">&quot;/usr/local/include&quot;</span>
                                         <span style="color: #ff0000;">&quot;/usr/include/g++-3&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><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;&gt;&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>该方法有若干局限性：</p>
<ul>
<li>头文件的搜索路径是写死的，如果某个目录不存在，上面的代码会报错，不能补全。</li>
<li>无法补全搜索路径的子目录下的文件 （ 即前面的 AIM 2）。</li>
<li>没有判断在 #include 一个文件的时候，是应该使用符号 &lt;> 还是符号 &ldquo;&rdquo; （即前面的 AIM 3）</li>
</ul>
<p>解决方法并不复杂，对应如下：</p>
<ul>
<li>通过某种方法来从系统中自动获取 include 的搜索路径。比如 CEDET 提供的： semantic-gcc-get-include-paths 函数。</li>
<li>重定义 minibuffer-mode 下的按键 &ldquo;/&#8221;。将其绑定到一个用于搜索和展开某个目录，并更新 minibuffer-completion-table 的函数(minibuffer-completion-table 是 minibuffer-mode 中补全的候选 list)。</li>
<li>在 skeleton-include 中不使用 &lt;> 或者 &ldquo;。我们可以使用一个特殊的标记，然后在 skeleton-include 的结尾，根据头文件的路径判断到底应该使用什么符号。</li>
</ul>
<p>整理以后的代码实现如下：</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('p41916code8'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p419168"><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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
</pre></td><td class="code" id="p41916code8"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; 输入 inc , 可以自动提示输入文件名称,可以自动补全.</span>
<span style="color: #808080; font-style: italic;">;; Provided by yangyingchao@gmail.com</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>mode<span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">&#40;</span>define-abbrev-table mode '<span style="color: #66cc66;">&#40;</span>
                               <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;inc&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> skeleton-include <span style="color: #cc66cc;">1</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>c-mode-abbrev-table c++-mode-abbrev-table<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defconst yc/inc-dir-<span style="color: #b1b100;">list</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> <span style="color: #66cc66;">&#40;</span>semantic-gcc-get-include-paths <span style="color: #ff0000;">&quot;c++&quot;</span><span style="color: #66cc66;">&#41;</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;./&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;nil&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defvar inc-minibuffer-compl-<span style="color: #b1b100;">list</span> <span style="color: #b1b100;">nil</span> <span style="color: #ff0000;">&quot;nil&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> yc/update-minibuffer-complete-table <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Complete minibuffer&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<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>prompt <span style="color: #66cc66;">&#40;</span>minibuffer-prompt<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>comp-part <span style="color: #66cc66;">&#40;</span>minibuffer-contents-no-properties<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;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;Include File:&quot;</span> prompt<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;">length</span> comp-part<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">0</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> minibuffer-completion-table
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> minibuffer-completion-table
                    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>inc-files <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
                          <span style="color: #66cc66;">&#40;</span>dirname <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
                          <span style="color: #66cc66;">&#40;</span>tmp-<span style="color: #b1b100;">name</span> <span style="color: #b1b100;">nil</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>d<span style="color: #66cc66;">&#41;</span>
                         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> dirname <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;%s/%s&quot;</span> d comp-part<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>file-exists-p dirname<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>x<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;">not</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">or</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;.&quot;</span> x<span style="color: #66cc66;">&#41;</span>
                                             <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;..&quot;</span> x<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> tmp-<span style="color: #b1b100;">name</span> <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;%s/%s&quot;</span> comp-part x<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                                <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'inc-files tmp-<span style="color: #b1b100;">name</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>directory-files dirname<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                       yc/inc-dir-<span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span>
                      inc-files<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>insert <span style="color: #ff0000;">&quot;/&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>map minibuffer-local-completion-map<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key map <span style="color: #ff0000;">&quot;/&quot;</span> 'yc/update-minibuffer-complete-table<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> yc/update-inc-marks <span style="color: #66cc66;">&#40;</span> <span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;description&quot;</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>statement <span style="color: #66cc66;">&#40;</span>buffer-substring-no-properties
                      <span style="color: #66cc66;">&#40;</span>point-at-bol<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>point-at-eol<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>inc-file <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>to-begin <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>to-end <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>yc/re-include
           <span style="color: #66cc66;">&#40;</span>rx <span style="color: #ff0000;">&quot;#include&quot;</span> <span style="color: #66cc66;">&#40;</span>+ ascii<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;|XXX|&quot;</span> <span style="color: #66cc66;">&#40;</span>group <span style="color: #66cc66;">&#40;</span>+ ascii<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;|XXX|&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;">when</span> <span style="color: #66cc66;">&#40;</span>string-match yc/re-include statement<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> inc-file <span style="color: #66cc66;">&#40;</span>match-string <span style="color: #cc66cc;">1</span> statement<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>file-exists-p <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;./%s&quot;</span> inc-file<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> to-begin <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span> to-end <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> to-begin <span style="color: #ff0000;">&quot;&lt;&quot;</span> to-end <span style="color: #ff0000;">&quot;&gt;&quot;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>move-beginning-of-line <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>kill-line<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>insert <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;#include %s%s%s&quot;</span> to-begin inc-file to-end<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>move-end-of-line <span style="color: #cc66cc;">1</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>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton skeleton-include
  <span style="color: #ff0000;">&quot;generate include&lt;&gt;&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #66cc66;">&gt;</span> <span style="color: #ff0000;">&quot;#include |XXX|&quot;</span>
  <span style="color: #66cc66;">&#40;</span>completing-read
   <span style="color: #ff0000;">&quot;Include File:&quot;</span>
   <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>f<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> f <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">apply</span>
     '<span style="color: #b1b100;">append</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</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>directory-files
         dir <span style="color: #b1b100;">nil</span>
         <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>(<span style="color: #000099; font-weight: bold;">\\</span>.h<span style="color: #000099; font-weight: bold;">\\</span>)?&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      yc/inc-dir-<span style="color: #b1b100;">list</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: #ff0000;">&quot;|XXX|&quot;</span>
  <span style="color: #66cc66;">&#40;</span>yc/update-inc-marks<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<h3>使用和效果</h3>
<p>使用方法很简单：</p>
<ol>
<li>将上述的代码添加到 Emacs 的配置文件后，打开一个 C/C++ 程序，</li>
<li>输入 inc 然后按下空格，然后在 minibuffer 中输入部分头文件的名字，并通过 TAB 来补全。</li>
<li>如果头文件位于子目录中，则输入目录名后输入 &ldquo;/&rdquo; 。这样子目录中的内容也会添加到补齐的候选名单中，然后就又可以继续他过 TAB 补全了。</li>
<li>确认 minibuffer 中填写的内容无误后，回车， skeleton-include 将自动更新标记符号。</li>
</ol>
<h3>截图：</h3>
<p>下面是几张截图：</p>
<p><center><img src="https://dea.googlecode.com/svn/trunk/screenshots/include_files_helper-01.png" title="Include 系统文件" /></center></p>
<p><center>Include 系统文件</center></p>
<p><center><img src="https://dea.googlecode.com/svn/trunk/screenshots/include_files_helper-02.png" title="Include 自定义文件" /></center></p>
<p><center>Include 自定义文件</center></p>
<p><center><img src="https://dea.googlecode.com/svn/trunk/screenshots/include_files_helper-03.png" title="全部完成后截图" /></center></p>
<p><center>全部完成后截图</center></p>
<p></body><br />
</html></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/include_files_helper.htm' t='Emacs 自动填充头文件' d='' tag='C/C++,Elisp,Emacs,配置,高级' 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/auto-complete.htm" title="Emacs才是世界上最强大的IDE － 用auto-complete实现自动补全 (2009年11月11日)">Emacs才是世界上最强大的IDE － 用auto-complete实现自动补全</a> (114)</li>
	<li><a href="http://emacser.com/emacs-beginner-must-know.htm" title="Emacs初学者必知必会 (2010年01月24日)">Emacs初学者必知必会</a> (9)</li>
	<li><a href="http://emacser.com/to-emacs-beginner.htm" title="致Emacs初学者 (2009年11月30日)">致Emacs初学者</a> (121)</li>
	<li><a href="http://emacser.com/svn-status-mode-line.htm" title="在mode-line上标记svn状态 (2010年01月28日)">在mode-line上标记svn状态</a> (30)</li>
	<li><a href="http://emacser.com/bing.htm" title="在 emacs 中使用 bing translate api 实现高效翻译 (2012年05月12日)">在 emacs 中使用 bing translate api 实现高效翻译</a> (6)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/include_files_helper.htm/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>用 Emacs Org 撰写博客</title>
		<link>http://emacser.com/org2blog.htm</link>
		<comments>http://emacser.com/org2blog.htm#comments</comments>
		<pubDate>Thu, 22 Mar 2012 09:09:44 +0000</pubDate>
		<dc:creator>bigclean</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[好玩的]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[org2blog]]></category>
		<category><![CDATA[wordpress]]></category>
		<category><![CDATA[安装]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[配置]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41897</guid>
		<description><![CDATA[作者: wd
org2blog 是什么
org2blog 是用来把 org-mode 格式的文章发布到 wordpress 的工具。其实之前使用 webloger.el 也可以发布到 wordpress，不过是 webloger.el 已经基本没人维护了，这个 org2blog 作者支持还很积极，另外 org-mode 还提供了一些额外的方便编辑的方法，所以其实是个不错的东东。

安装
其实按照上面地址的内容，安装很简单。

git clone http://github.com/punchagan/org2blog.git
(setq load-path (cons "~/.emacs.d/org2blog/" load-path))
(require 'org2blog-autoloads)


依赖 xml-rpc ，添加到 load-path
需要最新版本的 org-mode，我使用的是 emacs 24 里面的 7.7，之前使用 7.5(?) 的时候，遇到了发布的时候会在文章结尾附加  导致 blog 的展现挂掉的问题。

使用
配置

;;
;; org2blog
;;

(require 'org2blog-autoloads)
(setq org2blog/wp-blog-alist
      `(("abc"
         [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://wdicc.com/" target="_blank"><span style="color: #0000ff;"><b>wd</b></span></a></p>
<h3>org2blog 是什么</h3>
<p><a href="https://github.com/punchagan/org2blog">org2blog</a> 是用来把 org-mode 格式的文章发布到 wordpress 的工具。其实之前使用 webloger.el 也可以发布到 wordpress，不过是 webloger.el 已经基本没人维护了，这个 org2blog 作者支持还很积极，另外 org-mode 还提供了一些额外的方便编辑的方法，所以其实是个不错的东东。</p>
<p><span id="more-41897"></span></p>
<h3>安装</h3>
<p>其实按照上面地址的内容，安装很简单。</p>
<pre>
git clone <a href="http://github.com/punchagan/org2blog.git">http://github.com/punchagan/org2blog.git</a>
(setq load-path (cons "~/.emacs.d/org2blog/" load-path))
(require 'org2blog-autoloads)
</pre>
<ol>
<li>依赖 <a href="http://launchpad.net/xml-rpc-el">xml-rpc</a> ，添加到 load-path</li>
<li>需要最新版本的 org-mode，我使用的是 emacs 24 里面的 7.7，之前使用 7.5(?) 的时候，遇到了发布的时候会在文章结尾附加 </body></html> 导致 blog 的展现挂掉的问题。</li>
</ol>
<h3>使用</h3>
<h4>配置</h4>
<pre>
;;
;; org2blog
;;

(require 'org2blog-autoloads)
(setq org2blog/wp-blog-alist
      `(("abc"
         :url "<a href="http://abc.com/xmlrpc.php">http://abc.com/xmlrpc.php</a>"
         :username "admin"
         :password PWD
         :keep-new-lines t
         :confirm t
         :wp-code nil
         :tags-as-categories nil)
        ))

(setq org2blog/wp-buffer-template
  "#+DATE: %s
#+OPTIONS: toc:nil num:nil todo:nil pri:nil tags:nil ^:nil TeX:nil
#+CATEGORY: Heart
#+TAGS:
#+PERMALINK:
#+TITLE:
\n")
</pre>
<p>我不使用 wordpress 的 code 格式，所以设置了 wp-code 为 nil。可以定义多个 blog。</p>
<h4>登陆，发帖</h4>
<p>M-x org2blog/wp-login 会提示你要登陆哪个 blog<br />
M-x org2blog/wp-new-entry 会使用设置的 template 打开一个 buffer<br />
M-x org2blog/wp-post-buffer 保存成 draft<br />
M-x org2blog/wp-post-buffer-and-publish 真实发布</p>
<p>另外，还可以发布一个 tree 而不是整个 org 文件，以及一些其他的操作就不多说了。</p>
<p>发布源代码可以使用 BEGIN_SRC END_SRC 块，或者冒号开头的行会被当作源代码。</p>
<p>我使用的是 wp-syntax，所以发布源代码使用 BEGIN_HTML 在里面使用 pre 标签，这样出来的代码会加上格式高亮。</p>
<pre><code>#+BEGIN_HTML
&lt;pre lang="lisp"&gt;
(setq a 1)
&lt;/pre&gt;
#+END_HTML
</code></pre>
<h4>其他</h4>
<p>使用 org2blog 只能从 org 发布到 wordpress，不能从 wordpress 回到 org 文件再进行编辑，不过我看到有人已经提供了一个解决方法，或许将来也会支持这个功能。</p>
<p>使用 org2blog 发布很讨厌的一点是，他会把你的 org 加上很多的 html 代码，再编辑的时候比较讨厌。</p>
<p>org2blog 在 github 的页面 <a href="https://github.com/punchagan/org2blog">https://github.com/punchagan/org2blog</a> 上面有不少有用的东西，建议看看。</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/org2blog.htm' t='用 Emacs Org 撰写博客' d='' tag='Emacs,org,org2blog,wordpress,安装,插件,配置' 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/weblogger.htm" title="用weblogger写WordPress博客 (2010年03月3日)">用weblogger写WordPress博客</a> (101)</li>
	<li><a href="http://emacser.com/to-emacs-beginner.htm" title="致Emacs初学者 (2009年11月30日)">致Emacs初学者</a> (121)</li>
	<li><a href="http://emacser.com/emacs-beginner-must-know.htm" title="Emacs初学者必知必会 (2010年01月24日)">Emacs初学者必知必会</a> (9)</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/w3m.htm" title="Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页 (2009年11月23日)">Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页</a> (46)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/org2blog.htm/feed</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>使用graphviz画数据结构</title>
		<link>http://emacser.com/emacs_graphviz_ds.htm</link>
		<comments>http://emacser.com/emacs_graphviz_ds.htm#comments</comments>
		<pubDate>Tue, 14 Jun 2011 23:52:08 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[ann]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[CEDET]]></category>
		<category><![CDATA[ctrl]]></category>
		<category><![CDATA[ede]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[face]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[semantic]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[配色]]></category>

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

今天下午用了些时间写了个小的函数，该函数配合 autoinsert + graphviz-dot-mode ，可以很方便的将 C 语言中指定的 struct 结构画出来。这样，画了多个数据结构之后，再手动添加几条线， 数据结构之间的关系就一目了然了。




1 Graphviz &#38; graphviz-dot-mode 

1.1 What is Graphviz? 
1.2 Graphviz 的安装 
1.3 Graphviz 的使用 
1.4 graphviz-dot-mode 


2 小函数登场 

2.1 elisp 代码 
2.2 使用方法 


3 autoinert 配置 
4 用法示例 
5 后记 




1 Graphviz &#38; graphviz-dot-mode 



1.1 What is Graphviz? 


简单的说， graphviz 是一个开源的自动图形绘制工具, 可以很方便的可视化结构信息，把抽象的图和网络用几何的方式表现出来。


Graphviz is open source [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://blog.163.com/vic_kk/blog/static/49470524201010180715177/" target="_blank"><span style="color: #0000ff;"><b>tubo</b></span></a></p>
<p>
今天下午用了些时间写了个小的函数，该函数配合 autoinsert + graphviz-dot-mode ，可以很方便的将 C 语言中指定的 struct 结构画出来。这样，画了多个数据结构之后，再手动添加几条线， 数据结构之间的关系就一目了然了。<span id="more-41868"></span>
</p>
<div id="table-of-contents">
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 Graphviz &amp; graphviz-dot-mode </a>
<ul>
<li><a href="#sec-1_1">1.1 What is Graphviz? </a></li>
<li><a href="#sec-1_2">1.2 Graphviz 的安装 </a></li>
<li><a href="#sec-1_3">1.3 Graphviz 的使用 </a></li>
<li><a href="#sec-1_4">1.4 graphviz-dot-mode </a></li>
</ul>
</li>
<li><a href="#sec-2">2 小函数登场 </a>
<ul>
<li><a href="#sec-2_1">2.1 elisp 代码 </a></li>
<li><a href="#sec-2_2">2.2 使用方法 </a></li>
</ul>
</li>
<li><a href="#sec-3">3 autoinert 配置 </a></li>
<li><a href="#sec-4">4 用法示例 </a></li>
<li><a href="#sec-5">5 后记 </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-3">
<h3 id="sec-1"><span class="section-number-3">1</span> Graphviz &amp; graphviz-dot-mode </h3>
<div class="outline-text-3" id="text-1">
</div>
<div id="outline-container-1_1" class="outline-4">
<h4 id="sec-1_1"><span class="section-number-4">1.1</span> What is Graphviz? </h4>
<div class="outline-text-4" id="text-1_1">
<p>
简单的说， graphviz 是一个开源的自动图形绘制工具, 可以很方便的可视化结构信息，把抽象的图和网络用几何的方式表现出来。
</p>
<p>
Graphviz is open source graph visualization software. Graph visualization is a way of representing structural information as diagrams of abstract graphs and networks. It has important applications in networking, bioinformatics, software engineering, database and web design, machine learning, and in visual interfaces for other technical domains.
</p>
<p>
更多信息请参考其主页：<a href="http://www.graphviz.org/" target="_blank">http://www.graphviz.org/</a>
</p>
</div>
</div>
<div id="outline-container-1_2" class="outline-4">
<h4 id="sec-1_2"><span class="section-number-4">1.2</span> Graphviz 的安装 </h4>
<div class="outline-text-4" id="text-1_2">
<p>
Linux 下几乎所有的发行版都有这个工具，如果没有默认安装的话，也可以通过发行版自带的软件管理工具来或者去其下载页面上下载相应的二进制包或者源码包。同时该软件也提供了 windows 下的安装文件，参见： <a href="http://www.graphviz.org/Download..php" target="_blank">http://www.graphviz.org/Download..php</a>
</p>
<p>
gentoo 下安装 graphviz ， 一如既往的简单：</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('p41868code14'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186814"><td class="code" id="p41868code14"><pre class="bash" style="font-family:monospace;">emerge <span style="color: #660033;">-av</span> graphviz</pre></td></tr></table></div>

</p>
</div>
</div>
<div id="outline-container-1_3" class="outline-4">
<h4 id="sec-1_3"><span class="section-number-4">1.3</span> Graphviz 的使用 </h4>
<div class="outline-text-4" id="text-1_3">
<p>这个话题比较大，离本文的目的有点偏，而且有网上也很多的教程，所以不多言了，可以参考这里：<a href="http://www.google.com/search?hl=en&amp;source=hp&amp;biw=1278&amp;bih=898&amp;q=graphviz+%25E6%2595%2599%25E7%25A8%258B" target="_blank">http://www.google.com/search?hl=en&amp;source=hp&amp;biw=1278&amp;bih=898&amp;q=graphviz+%E6%95%99%E7%A8%8B</a>
</p>
</div>
</div>
<div id="outline-container-1_4" class="outline-4">
<h4 id="sec-1_4"><span class="section-number-4">1.4</span> graphviz-dot-mode </h4>
<div class="outline-text-4" id="text-1_4">
<p>用过 Emacs 的人一看就知道：这肯定是为 emacs 写的、编写 dot 文件（graphviz 的输入文件）的模式，提供了文件的编译、预览、快速注释等等的相应功能。gentoo 下有现成的 ebuild ， 只要 emerge 一下就可以了：</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('p41868code15'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186815"><td class="code" id="p41868code15"><pre class="c" style="font-family:monospace;">emerge <span style="color: #339933;">-</span>av graphivz<span style="color: #339933;">-</span>dot<span style="color: #339933;">-</span>mode</pre></td></tr></table></div>

<p>如果是其他发行版的话，从其 <a href="http://users.skynet.be/ppareit/projects/graphviz-dot-mode/graphviz-dot-mode.html" target="_blank">主页</a> 上下载该文件，然后放到 emacs 的 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('p41868code16'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186816"><td class="code" id="p41868code16"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;graphviz-dot-mode.el&quot;</span> <span style="color: #b1b100;">nil</span> t t<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>add-hook 'find-file-hook <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><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;dot&quot;</span> <span style="color: #66cc66;">&#40;</span>file-name-extension
                                                buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                                <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span>
                                  <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;Enabling Setings for dot-mode&quot;</span><span style="color: #66cc66;">&#41;</span>
                                  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> fill-column <span style="color: #cc66cc;">1000</span><span style="color: #66cc66;">&#41;</span>
                                  <span style="color: #66cc66;">&#40;</span>base-auto-pair<span style="color: #66cc66;">&#41;</span>
                                  <span style="color: #66cc66;">&#40;</span>local-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-f6&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'compile<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></pre></td></tr></table></div>

<p>graphviz-mode 为编辑 dot 文件提供了下面的快捷键：
</p>
<ul>
<li>
<b>C-cc</b> 快速编译
</li>
<li>
<b>C-cp</b> 预览图像
</li>
<li>
<b>M-;</b> 注释或者取消注释
</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> 小函数登场 </h3>
<div class="outline-text-3" id="text-2">
</div>
<div id="outline-container-2_1" class="outline-4">
<h4 id="sec-2_1"><span class="section-number-4">2.1</span> elisp 代码 </h4>
<div class="outline-text-4" id="text-2_1">
<p>主要思想是解析 buffer 中选中的文本，通过正则表达式来匹配，从中找到 struct name 以及其中的各个 fields， 最后根据 dot 语法将其组成一个 subgraph。其实应该有更好的方法（比如通过 CEDET 的 Semantic 解析结果来做），但对 CEDET 的代码实在不熟，所以现在就只能这样了。<br />
代码如下：</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('p41868code17'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186817"><td class="code" id="p41868code17"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; Function used to add fields of struct into a dot file (for Graphviz).</span>
<span style="color: #66cc66;">&#40;</span>defconst yyc/dot-head <span style="color: #ff0000;">&quot;subgraph cluster_%s {
    node [shape=record fontsize=12 fontname=Courier style=filled];
    color = lightgray;
    style=filled;
    label = <span style="color: #000099; font-weight: bold;">\&quot;</span>Struct %s<span style="color: #000099; font-weight: bold;">\&quot;</span>;
    edge[color=<span style="color: #000099; font-weight: bold;">\&quot;</span>#2e3436<span style="color: #000099; font-weight: bold;">\&quot;</span>];&quot;</span>
  <span style="color: #ff0000;">&quot;Header part of dot file.&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defconst yyc/dot-tail <span style="color: #ff0000;">&quot;
}&quot;</span>
  <span style="color: #ff0000;">&quot;Tail part of dot&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defconst yyc/dot-node-head
  <span style="color: #ff0000;">&quot;
        node_%s[shape=record label=<span style="color: #000099; font-weight: bold;">\&quot;</span>&lt;f0&gt;*** STRUCT %s ***|<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span>
  <span style="color: #ff0000;">&quot;Format of node.&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defconst yyc/dot-node-tail <span style="color: #ff0000;">&quot;
<span style="color: #000099; font-weight: bold;">\&quot;</span>];&quot;</span>
  <span style="color: #ff0000;">&quot;Format of node.&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defconst r_attr_str <span style="color: #ff0000;">&quot;[ <span style="color: #000099; font-weight: bold;">\t</span>]+<span style="color: #000099; font-weight: bold;">\\</span>(.*+<span style="color: #000099; font-weight: bold;">\\</span>)[ <span style="color: #000099; font-weight: bold;">\t</span>]+<span style="color: #000099; font-weight: bold;">\\</span>(.*<span style="color: #000099; font-weight: bold;">\\</span>)?;&quot;</span>
  <span style="color: #ff0000;">&quot;Regular expression for matching struct fields.&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defconst r_name <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>_&lt;<span style="color: #000099; font-weight: bold;">\\</span>(typedef[ <span style="color: #000099; font-weight: bold;">\t</span>]+<span style="color: #000099; font-weight: bold;">\\</span>)?struct[ <span style="color: #000099; font-weight: bold;">\t</span>]+<span style="color: #000099; font-weight: bold;">\\</span>(.*<span style="color: #000099; font-weight: bold;">\\</span>)?[ <span style="color: #000099; font-weight: bold;">\t</span>]*{&quot;</span>
  <span style="color: #ff0000;">&quot;Regular expression for mating struct name&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defconst attr_str <span style="color: #ff0000;">&quot;
&lt;f%d&gt;%s %s<span style="color: #000099; font-weight: bold;">\\</span>l|<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span> <span style="color: #ff0000;">&quot;nil&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> yyc/datastruct-to-dot <span style="color: #66cc66;">&#40;</span>start end<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;generate c++ function definition and insert it into `buffer'&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;rp&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> var-defination <span style="color: #66cc66;">&#40;</span>buffer-substring-no-properties start end<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>tmp_str <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>var-<span style="color: #b1b100;">name</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>var-type <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>counter <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>struct-<span style="color: #b1b100;">name</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>header-str <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> iter <span style="color: #66cc66;">&#40;</span>pos<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> counter <span style="color: #66cc66;">&#40;</span>+ counter <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>message <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;Counter: %d, pos: %d&quot;</span>
                       counter pos<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>string-match r_name var-defination pos<span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span>
            <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;A&quot;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> struct-<span style="color: #b1b100;">name</span>
                  <span style="color: #66cc66;">&#40;</span>match-string <span style="color: #cc66cc;">2</span> var-defination<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> header-str
                  <span style="color: #66cc66;">&#40;</span>format yyc/dot-head struct-<span style="color: #b1b100;">name</span> struct-<span style="color: #b1b100;">name</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> tmp_str
                  <span style="color: #66cc66;">&#40;</span>format yyc/dot-node-head struct-<span style="color: #b1b100;">name</span> struct-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span>iter <span style="color: #66cc66;">&#40;</span>match-end <span style="color: #cc66cc;">0</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>string-match r_attr_str var-defination pos<span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span>
              <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;B&quot;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> var-type
                    <span style="color: #66cc66;">&#40;</span>match-string <span style="color: #cc66cc;">1</span> var-defination<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> var-<span style="color: #b1b100;">name</span>
                    <span style="color: #66cc66;">&#40;</span>match-string <span style="color: #cc66cc;">2</span> var-defination<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> tmp_str
                    <span style="color: #66cc66;">&#40;</span>concat tmp_str
                            <span style="color: #66cc66;">&#40;</span>format attr_str counter var-type var-<span style="color: #b1b100;">name</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>iter <span style="color: #66cc66;">&#40;</span>match-end <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #b1b100;">nil</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>save-excursion
      <span style="color: #66cc66;">&#40;</span>iter <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>set-buffer <span style="color: #66cc66;">&#40;</span>get-buffer-create <span style="color: #ff0000;">&quot;tmp.dot&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>graphviz-dot-mode<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> pos <span style="color: #66cc66;">&#40;</span>point-<span style="color: #b1b100;">max</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>insert  header-str tmp_str <span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>point-<span style="color: #b1b100;">max</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>delete-char -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>insert <span style="color: #ff0000;">&quot;&lt;f999&gt;<span style="color: #000099; font-weight: bold;">\\</span>&quot;</span>yyc/dot-node-tail yyc/dot-tail<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>one-window-p<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>split-window-vertically<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>switch-to-buffer-other-window <span style="color: #ff0000;">&quot;tmp.dot&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>point-<span style="color: #b1b100;">min</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>message <span style="color: #ff0000;">&quot;Finished, please see *tmp.dot* buffer.&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
</div>
</div>
<div id="outline-container-2_2" class="outline-4">
<h4 id="sec-2_2"><span class="section-number-4">2.2</span> 使用方法 </h4>
<div class="outline-text-4" id="text-2_2">
<p>用起来很简单：找到一个 C 代码，标记整个 struct 定义，然后M-x 输入： yyc/datastruct-to-dot 即可。命令执行完毕后，会打开一个新的 tmp.dot buffer，其中包含了用于绘制该 struct 的代码。前面也提到了，这生成的仅仅是个 subgraph，需要将这个 subgraph 添加到真正的 graph 下，才能生成图像。我通过 autoinsert 来自动创建用于放置 subgraph 的 graph 。
</p>
</div>
</div>
</div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3"><span class="section-number-3">3</span> autoinert 配置 </h3>
<div class="outline-text-3" id="text-3">
<p>auto-insert 是 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('p41868code18'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186818"><td class="code" id="p41868code18"><pre class="lisp" style="font-family:monospace;"> <span style="color: #808080; font-style: italic;">;; ************** Autoinsert templates *****************</span>
<span style="color: #66cc66;">&#40;</span>require 'autoinsert<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-insert-mode t<span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">;;; Adds hook to find-files-hook</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-insert-directory <span style="color: #ff0000;">&quot;~/.emacs.d/templates/auto-insert/&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-insert 'other<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-insert-query <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; auto-insert stuff</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'find-file-hooks 'auto-insert<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> auto-insert-alist
      '<span style="color: #66cc66;">&#40;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.cpp$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.cpp&quot;</span> auto-update-c-source-file<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.h$&quot;</span>   <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;header.h&quot;</span> auto-update-header-file<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.c$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.c&quot;</span> auto-update-c-source-file<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.org$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.org&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.sh$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.sh&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.lisp$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.lisp&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.el$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.el&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.dot$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.dot&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.erl$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.err&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.py$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.py&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.tex$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.tex&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.html$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.html&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.devhelp2$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.devhelp2&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.ebuild$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.ebuild&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.sh$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.sh&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Doxyfile$&quot;</span> <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;insert.doxyfile&quot;</span> auto-update-defaults<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; function replaces the string '@@@' by the current file</span>
<span style="color: #808080; font-style: italic;">;; name. You could use a similar approach to insert name and date into</span>
<span style="color: #808080; font-style: italic;">;; your file.</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> auto-update-header-file <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>save-excursion
    <span style="color: #66cc66;">&#40;</span>while <span style="color: #66cc66;">&#40;</span>search-forward <span style="color: #ff0000;">&quot;@@@&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>save-restriction
        <span style="color: #66cc66;">&#40;</span>narrow-to-region <span style="color: #66cc66;">&#40;</span>match-beginning <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>match-end <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>replace-match <span style="color: #66cc66;">&#40;</span>upcase <span style="color: #66cc66;">&#40;</span>file-name-nondirectory buffer-file-<span style="color: #b1b100;">name</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>subst-char-in-region <span style="color: #66cc66;">&#40;</span>point-<span style="color: #b1b100;">min</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>point-<span style="color: #b1b100;">max</span><span style="color: #66cc66;">&#41;</span> ?<span style="color: #66cc66;">.</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;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> insert-today <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Insert today's date into buffer&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert <span style="color: #66cc66;">&#40;</span>format-time-string <span style="color: #ff0000;">&quot;%m-%e-%Y&quot;</span> <span style="color: #66cc66;">&#40;</span>current-time<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> auto-update-c-source-file <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>save-excursion
    <span style="color: #808080; font-style: italic;">;; Replace HHHH with file name sans suffix</span>
    <span style="color: #66cc66;">&#40;</span>while <span style="color: #66cc66;">&#40;</span>search-forward <span style="color: #ff0000;">&quot;HHHH&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>save-restriction
        <span style="color: #66cc66;">&#40;</span>narrow-to-region <span style="color: #66cc66;">&#40;</span>match-beginning <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>match-end <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>replace-match <span style="color: #66cc66;">&#40;</span>concat <span style="color: #66cc66;">&#40;</span>file-name-sans-extension <span style="color: #66cc66;">&#40;</span>file-name-nondirectory buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;.h&quot;</span><span style="color: #66cc66;">&#41;</span> t
                       <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>save-excursion
    <span style="color: #808080; font-style: italic;">;; Replace @@@ with file name</span>
    <span style="color: #66cc66;">&#40;</span>while <span style="color: #66cc66;">&#40;</span>search-forward <span style="color: #ff0000;">&quot;@@@&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>save-restriction
        <span style="color: #66cc66;">&#40;</span>narrow-to-region <span style="color: #66cc66;">&#40;</span>match-beginning <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>match-end <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>replace-match <span style="color: #66cc66;">&#40;</span>file-name-nondirectory buffer-file-<span style="color: #b1b100;">name</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;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>save-excursion
    <span style="color: #808080; font-style: italic;">;; replace DDDD with today's date</span>
    <span style="color: #66cc66;">&#40;</span>while <span style="color: #66cc66;">&#40;</span>search-forward <span style="color: #ff0000;">&quot;DDDD&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>save-restriction
        <span style="color: #66cc66;">&#40;</span>narrow-to-region <span style="color: #66cc66;">&#40;</span>match-beginning <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>match-end <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>replace-match <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>insert-today<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>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> auto-replace-file-<span style="color: #b1b100;">name</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>save-excursion
    <span style="color: #808080; font-style: italic;">;; Replace @@@ with file name</span>
    <span style="color: #66cc66;">&#40;</span>while <span style="color: #66cc66;">&#40;</span>search-forward <span style="color: #ff0000;">&quot;(&gt;&gt;FILE&lt;&lt;)&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>save-restriction
        <span style="color: #66cc66;">&#40;</span>narrow-to-region <span style="color: #66cc66;">&#40;</span>match-beginning <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>match-end <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>replace-match <span style="color: #66cc66;">&#40;</span>file-name-nondirectory buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span> t<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>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> auto-update-defaults <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>auto-replace-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>auto-replace-file-name-no-ext<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>auto-replace-date-time<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> auto-replace-file-name-no-ext <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>save-excursion
    <span style="color: #808080; font-style: italic;">;; Replace @@@ with file name</span>
    <span style="color: #66cc66;">&#40;</span>while <span style="color: #66cc66;">&#40;</span>search-forward <span style="color: #ff0000;">&quot;(&gt;&gt;FILE_NO_EXT&lt;&lt;)&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>save-restriction
        <span style="color: #66cc66;">&#40;</span>narrow-to-region <span style="color: #66cc66;">&#40;</span>match-beginning <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>match-end <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>replace-match <span style="color: #66cc66;">&#40;</span>file-name-sans-extension <span style="color: #66cc66;">&#40;</span>file-name-nondirectory buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> t<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>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> auto-replace-date-time <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>save-excursion
    <span style="color: #66cc66;">&#40;</span>while <span style="color: #66cc66;">&#40;</span>search-forward <span style="color: #ff0000;">&quot;(&gt;&gt;DATE&lt;&lt;)&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>save-restriction
        <span style="color: #66cc66;">&#40;</span>narrow-to-region <span style="color: #66cc66;">&#40;</span>match-beginning <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>match-end <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>replace-match <span style="color: #ff0000;">&quot;&quot;</span> t<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>insert-today<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></pre></td></tr></table></div>

<p>模板文件存放于 &#8220;~/.emacs.d/templates/auto-insert/&#8221; 中，其中， insert.dot 的内容如下：
</p>
<pre class="src src-graphviz-dot-mode">// $Id: (&gt;&gt;FILE&lt;&lt;), (&gt;&gt;DATE&lt;&lt;)
digraph Name {
    node [shape=record fontsize=12 fontname=Courier style=filled];
    edge[color=blue];
    rankdir=LR;

// XXX: place to put subgraph

}
</pre>
</div>
</div>
<div id="outline-container-4" class="outline-3">
<h3 id="sec-4"><span class="section-number-3">4</span> 用法示例 </h3>
<div class="outline-text-3" id="text-4">
<p>一个简单的使用示例，有如下步骤：
</p>
<ul>
<li>
<b>1:</b> 打开一个 C 文件<br/></p>
<p>
如内核代码中的 drivers/usb/storage/usb.h
</p>
</li>
<li>
<b>2:</b> 打开一个 dot 文件(/tmp/usb.dot)<br/></p>
<p>
auto-insert 会自动插入一些文件内容.
</p>
</li>
<li>
<b>3:</b> 选中 struct us_data 的定义，并执行 yyc/datastruct-to-dot。<br/></p>
<p>
执行完成后， us_data 的数据填写到了 tmp.dot 中，将该 buffer 中的所有内容 kill 掉，并 yank 到 usb.dot 中 XXX 这一行的下面。此时，保存 sub.dot ， 并按下快捷键 : C-cc ， 然后按下 Enter ， 就会自动编译。然后再按下 C-cp 就可以在另外一个 buffer 中预览它了。
</p>
<p>
其实到这里，一个 C 语言的 struct 数据结构就已经被画出来了，后面的两个步骤，是为了介绍怎样将多个数据结构联系起来。
</p>
</li>
<li>
<b>4:</b> 添加其他的 subgraph <br/></p>
<p>
我们可以继续添加其他的 subgraph ， 例如 struct usb_ctrlrequest *cr ，以及 struct usb_sg_request， 并全部做为 subgraph 添加到 usb.dot 中。
</p>
</li>
<li>
<b>5:</b> 为 subgraph 建立关联<br/></p>
<p>
很简单，通过 &#8220;-&gt;&#8221; 画两条线就可以了。
</p>
<p>
最后生成的文件如下：
</p>
<pre class="src src-graphviz-dot-mode">digraph USB {
    node [shape=record fontsize=12 fontname=Courier style=filled];
    edge[color=blue];
    rankdir=LR;

subgraph cluster_us_data  {
    node [shape=record fontsize=12 fontname=Courier style=filled];
    color = lightgray;
    style=filled;
    label = <span style="color: #ff00ff;">"Struct us_data "</span>;
    edge[color=<span style="color: #ff00ff;">"#2e3436"</span>];
        node_us_data [shape=record label=<span style="color: #ff00ff;">"&lt;f0&gt;*** STRUCT us_data  ***|\
&lt;f2&gt;struct mutex     dev_mutex\l|\
&lt;f3&gt;struct usb_device *pusb_dev\l|\
&lt;f4&gt;struct usb_interface *pusb_intf\l|\
&lt;f5&gt;struct us_unusual_dev   *unusual_dev\l|\
&lt;f6&gt;unsigned long    fflags\l|\
&lt;f7&gt;unsigned long    dflags\l|\
&lt;f8&gt;unsigned int     send_bulk_pipe\l|\
&lt;f9&gt;unsigned int     recv_bulk_pipe\l|\
&lt;f10&gt;unsigned int    send_ctrl_pipe\l|\
&lt;f11&gt;unsigned int    recv_ctrl_pipe\l|\
&lt;f12&gt;unsigned int    recv_intr_pipe\l|\
&lt;f13&gt;char        *transport_name\l|\
&lt;f14&gt;char        *protocol_name\l|\
&lt;f15&gt;__le32      bcs_signature\l|\
&lt;f16&gt;u8      subclass\l|\
&lt;f17&gt;u8      protocol\l|\
&lt;f18&gt;u8      max_lun\l|\
&lt;f19&gt;u8      ifnum\l|\
&lt;f20&gt;u8      ep_bInterval\l|\
&lt;f21&gt;trans_cmnd  transport\l|\
&lt;f22&gt;trans_reset     transport_reset\l|\
&lt;f23&gt;proto_cmnd  proto_handler\l|\
&lt;f24&gt;struct scsi_cmnd *srb\l|\
&lt;f25&gt;unsigned int    tag\l|\
&lt;f26&gt;char        scsi_name[32]\l|\
&lt;f27&gt;struct urb  *current_urb\l|\
&lt;f28&gt;struct usb_ctrlrequest *cr\l|\
&lt;f29&gt;struct usb_sg_request current_sg\l|\
&lt;f30&gt;unsigned char   *iobuf\l|\
&lt;f31&gt;dma_addr_t  iobuf_dma\l|\
&lt;f32&gt;struct task_struct *ctl_thread\l|\
&lt;f33&gt;struct completion cmnd_ready\l|\
&lt;f34&gt;struct completion notify\l|\
&lt;f35&gt;wait_queue_head_t delay_wait\l|\
&lt;f36&gt;struct completion scanning_done\l|\
&lt;f37&gt;void        *extra\l|\
&lt;f38&gt;extra_data_destructor extra_destructor\l|\
&lt;f39&gt;pm_hook         suspend_resume_hook\l|\
&lt;f40&gt;int         use_last_sector_hacks\l|\
&lt;f41&gt;int         last_sector_retries\l|&lt;f999&gt;\
"</span>];
}

subgraph cluster_usb_ctrlrequest  {
    node [shape=record fontsize=12 fontname=Courier style=filled];
    color = lightgray;
    style=filled;
    label = <span style="color: #ff00ff;">"Struct usb_ctrlrequest "</span>;
    edge[color=<span style="color: #ff00ff;">"#2e3436"</span>];
        node_usb_ctrlrequest [shape=record label=<span style="color: #ff00ff;">"&lt;f0&gt;*** STRUCT usb_ctrlrequest  ***|\
&lt;f2&gt;__u8 bRequestType\l|\
&lt;f3&gt;__u8 bRequest\l|\
&lt;f4&gt;__le16 wValue\l|\
&lt;f5&gt;__le16 wIndex\l|\
&lt;f6&gt;__le16 wLength\l|&lt;f999&gt;\
"</span>];
}

subgraph cluster_usb_sg_request  {
    node [shape=record fontsize=12 fontname=Courier style=filled];
    color = lightgray;
    style=filled;
    label = <span style="color: #ff00ff;">"Struct usb_sg_request "</span>;
    edge[color=<span style="color: #ff00ff;">"#2e3436"</span>];
        node_usb_sg_request [shape=record label=<span style="color: #ff00ff;">"&lt;f0&gt;*** STRUCT usb_sg_request  ***|\
&lt;f2&gt;int      status\l|\
&lt;f3&gt;size_t       bytes\l|\
&lt;f4&gt;spinlock_t   lock\l|\
&lt;f5&gt;struct usb_device *dev\l|\
&lt;f6&gt;int      pipe\l|\
&lt;f7&gt;int      entries\l|\
&lt;f8&gt;struct urb   **urbs\l|\
&lt;f9&gt;int      count\l|\
&lt;f10&gt;struct completion complete\l|&lt;f999&gt;\
"</span>];
}

node_us_data:f28 -&gt; node_usb_ctrlrequest:f0;
node_us_data:f29 -&gt; node_usb_sg_request:f0[color=brown];
node_us_data:f29 -&gt; node_usb_sg_request:f999[color=brown];

}
</pre>
<p>
生成的图下如下：<br />
    <div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/graphviz-ds.png" rel="lightbox"><img src="https://dea.googlecode.com/svn/trunk/screenshots/thumbs/thumbs_graphviz-ds.png" height="150"/></a><p class="wp-caption-text">graphviz ds</p></div>
</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-5" class="outline-3">
<h3 id="sec-5"><span class="section-number-3">5</span> 后记 </h3>
<div class="outline-text-3" id="text-5">
<p>功能上还有很多地方可以改进，比如通过 CEDET 的 Semantic 进行语义分析，参考 corge 代码，支持 C++ 中的 class 等等。以后有时间在改改。PS: 貌似写这个 blog 用的时间比写那个 elisp 代码更费时间 ……
</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/emacs_graphviz_ds.htm' t='使用graphviz画数据结构' d='' tag='ann,c++,CEDET,ctrl,ede,Emacs,face,lambda,org,screenshot,semantic,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/built-in-cedet.htm" title="用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET (2010年05月10日)">用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET</a> (99)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</li>
	<li><a href="http://emacser.com/emacs-gdb.htm" title="在Emacs中使用gdb调试程序 (2010年03月29日)">在Emacs中使用gdb调试程序</a> (48)</li>
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (45)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (198)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs_graphviz_ds.htm/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>在Emacs中使用twitter/新浪微博</title>
		<link>http://emacser.com/twittering-mode.htm</link>
		<comments>http://emacser.com/twittering-mode.htm#comments</comments>
		<pubDate>Tue, 10 May 2011 14:33:34 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[好玩的]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[状态栏]]></category>
		<category><![CDATA[配色]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41840</guid>
		<description><![CDATA[作者: xwl
想在 Emacs 里登录 twitter, weibo&#8230; 吗？试一下 twittering-mode.el 吧！它目前支持同时登录
twitter, sina weibo, douban&#8230;(这里指的是我 fork 的版本），先上图：

* 新手上路


require it, 下载链接在最后面
(require &#8216;twittering-mode)


避免每次都需要输入密码 (需要安装 gpg )
(setq twittering-use-master-password t)


一些网站（如 sina）不喜欢 SSL.
(setq twittering-allow-insecure-server-cert t)
(setq twittering-oauth-use-ssl nil)
(setq twittering-use-ssl nil)


状态栏上显示未读推数；显示头像
(twittering-enable-unread-status-notifier)
(setq-default twittering-icon-mode t)


启动时默认打开的 timeline.
(setq twittering-initial-timeline-spec-string `(&#8220;:home@sina&#8221;
                    [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="about.htm#xwl" target="_blank"><span style="color: #0000ff;"><b>xwl</b></span></a></p>
<p>想在 Emacs 里登录 twitter, weibo&#8230; 吗？试一下 twittering-mode.el 吧！它目前支持同时登录<br />
twitter, sina weibo, douban&#8230;(这里指的是我 fork 的版本），先上图：<span id="more-41840"></span></p>
<div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/twittering-mode.png" rel="lightbox"><img src="https://dea.googlecode.com/svn/trunk/screenshots/thumbs/thumbs_twittering-mode.png" height="150"/></a><p class="wp-caption-text">cflow</p></div>
<h1>* 新手上路</h1>
<ol>
<li>
<p>require it, 下载链接在最后面</p>
<p>(require &#8216;twittering-mode)</p>
</li>
<li>
<p>避免每次都需要输入密码 (需要安装 gpg )</p>
<p>(setq twittering-use-master-password t)</p>
</li>
<li>
<p>一些网站（如 sina）不喜欢 SSL.</p>
<p>(setq twittering-allow-insecure-server-cert t)<br />
(setq twittering-oauth-use-ssl nil)<br />
(setq twittering-use-ssl nil)</p>
</li>
<li>
<p>状态栏上显示未读推数；显示头像</p>
<p>(twittering-enable-unread-status-notifier)<br />
(setq-default twittering-icon-mode t)</p>
</li>
<li>
<p>启动时默认打开的 timeline.</p>
<p>(setq twittering-initial-timeline-spec-string `(&#8220;:home@sina&#8221;<br />
                                                 ; &#8220;:home@douban&#8221;<br />
                                                 ))</p>
</li>
<li>
<p>来吧: M-x twit</p>
</li>
</ol>
<h1>* 玩转推特</h1>
<p>以下是一些基本操作, 相關快捷鍵可參閱 mode help (F1 m) 或自行定義:</p>
<ol>
<li>
<p>发推：M-x twittering-update-status-interactive</p>
</li>
<li>
<p>轉發: M-x twittering-retweet</p>
</li>
<li>
<p>加評論轉發: M-x twittering-organic-retweet</p>
</li>
<li>
<p>評論: M-x twittering-reply-to-user</p>
</li>
<li>
<p>查看某個 timeline: M-x twittering-other-user-timeline 或 twittering-visit-timeline</p>
</li>
<li>
<p>Follow/Unfollow: M-x twittering-follow, M-x twittering-unfollow</p>
</li>
<li>
<p>收藏: M-x twittering-favorite</p>
</li>
</ol>
<p>代码位于：<a href="https://github.com/xwl/twittering-mode">https://github.com/xwl/twittering-mode</a>, 欢迎上 #<a href="mailto:emacs-cn@irc.debian.org">emacs-cn@irc.debian.org</a> 来讨论。</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/twittering-mode.htm' t='在Emacs中使用twitter/新浪微博' d='' tag='Emacs,irc,org,screenshot,状态栏,配色' 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/svn-status-mode-line.htm" title="在mode-line上标记svn状态 (2010年01月28日)">在mode-line上标记svn状态</a> (30)</li>
	<li><a href="http://emacser.com/erc.htm" title="ERC使用简介 (2010年03月22日)">ERC使用简介</a> (41)</li>
	<li><a href="http://emacser.com/emacs.htm" title="Emacs长啥样 (2009年11月5日)">Emacs长啥样</a> (16)</li>
	<li><a href="http://emacser.com/emacs-ditaa.htm" title="Emacs中绘图 － ditaa篇 (2010年08月4日)">Emacs中绘图 － ditaa篇</a> (34)</li>
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (45)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/twittering-mode.htm/feed</wfw:commentRss>
		<slash:comments>87</slash:comments>
		</item>
		<item>
		<title>Emacs中的Evernote: evernote-mode</title>
		<link>http://emacser.com/evernote-mode.htm</link>
		<comments>http://emacser.com/evernote-mode.htm#comments</comments>
		<pubDate>Mon, 25 Apr 2011 08:00:00 +0000</pubDate>
		<dc:creator>fangzhzh</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[ann]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[c++]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[ede]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[Email]]></category>
		<category><![CDATA[erc]]></category>
		<category><![CDATA[evernote]]></category>
		<category><![CDATA[evernote-mode]]></category>
		<category><![CDATA[face]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[notetaking]]></category>
		<category><![CDATA[onenote]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[windows]]></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=41831</guid>
		<description><![CDATA[曾经有一段信息摆到我眼前,可是我没有珍惜.直到失去我才后悔莫及.
如果上天能给我一个重来的机会,我希望将那段信息记为笔记,如果非要在这条笔记上加个期限,我希望是一万年.

  

表格修改: @2011/08/05 17:39:59
简单的英文翻译就不会标出，标出内容变动。

 我这人向来不喜欢凑热闹,大家都喜欢的姑娘我从来都不会去追,大家都说好的电影我从来不去看,按现在流行语说,就是zhuangbility. 哈哈. 但是,最近很火1的Evernote  ,我确实很是喜爱,忍不住也来说分享一下自己使用Evernote  的经验. 
 本文会先介绍Evernote  是什么,Evernote  与其它主流笔记软件的比较并说明其优点,然后讨论一些记录Evernote  笔记的方法,然后介绍将Evernote  和Emacs两大神器结合起来的方法,最后介绍Evernote  强大的搜索功能. 
   

Evernote 
   

Evernote  是什么 

Evernote  是一套用来记笔记和查询笔记的软件和服务.Evernote  中的笔记可以是一段文字,一个网页或网页片断,一幅图片,声音,或者手绘墨迹,而且笔记可以有PDF之类的附件. 已有笔记可以支持以下搜索方式:文件夹,标签,是否有附件,是否有图片,是否email发送,是否是todo,据说,搜索还可以支持搜索图片内的文字. 可谓,功能强大,同时,方便易用,实乃是居家旅行,看书学习必备之工具. 
 Evernote  有免费版和专业版.Evernote  免费版每个月提供60M上传流量(即上传的笔记总大小不能超过60M),如果需要更多上传流量可以考虑付费版.不过就我个人经验,对于普通用户来说,60M的流量,内容大都为纯文字和图片的话,足足够用.此外,我认为笔记的内容最好只有文字和图片,不要使用doc和pdf之类的附件:第一,Evernote  比较强大的搜索功能对此类附件无效,使用附件的话既浪费了Evernote  最强大的搜索功能,又占据了大部分的上传流量,所以如果这些文档比较多,我建议此类附件还是放到Dropbox或者Sugarsync;第二个,也是更重要的不要使用附件的原因就是云存储,具体见下节. 
 因为我使用的是Window XP,所以手头只有evernote windows版的尊容,欢迎其它平台的用户截图发给我:) [...]]]></description>
			<content:encoded><![CDATA[<pre class="example">曾经有一段信息摆到我眼前,可是我没有珍惜.直到失去我才后悔莫及.
如果上天能给我一个重来的机会,我希望将那段信息记为笔记,如果非要在这条笔记上加个期限,我希望是一万年.
</pre>
<p> <img src="https://dea.googlecode.com/svn/trunk/screenshots/evernote/evernote-logo.jpg" align="right" alt="https://dea.googlecode.com/svn/trunk/screenshots/evernote/evernote-logo.jpg" /> </p>
<p>
<b>表格修改: @2011/08/05 17:39:59</b><br />
<b>简单的英文翻译就不会标出，标出内容变动。</b>
</p>
<p> 我这人向来不喜欢凑热闹,大家都喜欢的姑娘我从来都不会去追,大家都说好的电影我从来不去看,按现在流行语说,就是zhuangbility. 哈哈. 但是,最近很火<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup>的<a href="http://www.evernote.com/" target="_blank">Evernote</a>  ,我确实很是喜爱,忍不住也来说分享一下自己使用<a href="http://www.evernote.com/" target="_blank">Evernote</a>  的经验. </p>
<p> 本文会先介绍<a href="http://www.evernote.com/" target="_blank">Evernote</a>  是什么,<a href="http://www.evernote.com/" target="_blank">Evernote</a>  与其它主流笔记软件的比较并说明其优点,然后讨论一些记录<a href="http://www.evernote.com/" target="_blank">Evernote</a>  笔记的方法,然后介绍将<a href="http://www.evernote.com/" target="_blank">Evernote</a>  和<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>两大神器结合起来的方法,最后介绍<a href="http://www.evernote.com/" target="_blank">Evernote</a>  强大的搜索功能. </p>
<p>   <span id="more-41831"></span>
<div id="outline-container-1" class="outline-3">
<h3 id="sec-1"><a href="http://www.evernote.com/" target="_blank">Evernote</a> </h3>
<div class="outline-text-3" id="text-1">   </div>
<div id="outline-container-1_1" class="outline-4">
<h4 id="sec-1_1"><a href="http://www.evernote.com/" target="_blank">Evernote</a>  是什么 </h4>
<div class="outline-text-4" id="text-1_1">
<p><a href="http://www.evernote.com/" target="_blank">Evernote</a>  是一套用来记笔记和查询笔记的软件和服务.<a href="http://www.evernote.com/" target="_blank">Evernote</a>  中的笔记可以是一段文字,一个网页或网页片断,一幅图片,声音,或者手绘墨迹,而且笔记可以有PDF之类的附件. 已有笔记可以支持以下搜索方式:文件夹,标签,是否有附件,是否有图片,是否email发送,是否是todo,据说,搜索还可以支持搜索图片内的文字. 可谓,功能强大,同时,方便易用,实乃是居家旅行,看书学习必备之工具. </p>
<p> <a href="http://www.evernote.com/" target="_blank">Evernote</a>  有免费版和专业版.<a href="http://www.evernote.com/" target="_blank">Evernote</a>  免费版每个月提供60M上传流量(即上传的笔记总大小不能超过60M),如果需要更多上传流量可以考虑付费版.不过就我个人经验,对于普通用户来说,60M的流量,内容大都为纯文字和图片的话,足足够用.此外,我认为笔记的内容最好只有文字和图片,不要使用doc和pdf之类的附件:第一,<a href="http://www.evernote.com/" target="_blank">Evernote</a>  比较强大的搜索功能对此类附件无效,使用附件的话既浪费了<a href="http://www.evernote.com/" target="_blank">Evernote</a>  最强大的搜索功能,又占据了大部分的上传流量,所以如果这些文档比较多,我建议此类附件还是放到<a href="http://www.dropbox.com/" target="_blank">Dropbox</a>或者<a href="https://www.sugarsync.com/" target="_blank">Sugarsync</a>;第二个,也是更重要的不要使用附件的原因就是云存储,具体见下节. </p>
<p> 因为我使用的是Window XP,所以手头只有evernote windows版的尊容,欢迎其它平台的用户截图发给我:) <img src="http://emacser.com/uploads/wpid-evernote-notes1.png"  alt="http://emacser.com/uploads/wpid-evernote-notes1.png" /> </p>
</p></div>
</p></div>
<div id="outline-container-1_2" class="outline-4">
<h4 id="sec-1_2">为什么选择<a href="http://www.evernote.com/" target="_blank">Evernote</a> </h4>
<div class="outline-text-4" id="text-1_2">
<p>为什么<a href="http://www.evernote.com/" target="_blank">Evernote</a>  是优秀的?首先,我们先看一组数据<sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup>.下表是笔记相关的软件们特性的对比. </p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption></caption>
<colgroup>
<col align="left" />
<col align="left" />
<col align="left" />
<col align="left" />
<col align="left" />
<col align="left" />
<col align="left" />
<col align="left" />
</colgroup>
<thead>
<tr>
<th scope="col">名称</th>
<th scope="col">遵循协议</th>
<th scope="col">平台</th>
<th scope="col">同步</th>
<th scope="col">键盘输入</th>
<th scope="col">支持笔和电子墨迹</th>
<th scope="col">打印</th>
<th scope="col">格式</th>
</tr>
</thead>
<tbody>
<tr>
<td>纸笔</td>
<td>无</td>
<td>纸笔,人肉记录</td>
<td>人肉</td>
<td>无</td>
<td>无</td>
<td>无</td>
<td>纸张</td>
</tr>
<tr>
<td>A.nnotate</td>
<td>免费和收费版本</td>
<td>基于网页</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>PDF, .doc, .docx, images, web pages</td>
</tr>
<tr>
<td>Adobe Reader</td>
<td>免费软件, <del>需要600法郎买一个专业版才能记笔记</del> 免费版Adobe Reader X已经可以记笔记和高亮</td>
<td>Linux, Windows, and Mac OS X</td>
<td>?</td>
<td>是</td>
<td>是, 但是需要插件： AutoInk plugin</td>
<td>是</td>
<td>PDF</td>
</tr>
<tr>
<td>AllMyNotes Organizer</td>
<td>免费版和收费版</td>
<td>Windows 2000/XP/Vista/Windows 7</td>
<td>?</td>
<td>是</td>
<td>否</td>
<td>是</td>
<td>专利，加密，支持从文本格式，RTF，图片的导入，支持导出为文本，html，rtf.</td>
</tr>
<tr>
<td>BasKet Note Pads</td>
<td>遵循GPL协议</td>
<td>Linux</td>
<td>否</td>
<td>是</td>
<td>否</td>
<td>否</td>
<td>富文本，可以到处为html</td>
</tr>
<tr>
<td>Bluebeam PDF Revu</td>
<td>proprietary (专利)</td>
<td>Windows XP, Windows Vista</td>
<td>?</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>保存为 PDF, 导出为 BMP, PNG, JPEG, GIF, TIFF, 文本</td>
</tr>
<tr>
<td>DéjàClick</td>
<td>专利</td>
<td>Linux, Unix, Windows, and Mac OS X</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>XML</td>
</tr>
<tr>
<td>emacs org-mode</td>
<td>遵循GPL协议</td>
<td>Linux, Windows, Mac OS X, Unix</td>
<td>是, Andorid和Iphone存在第三方程序</td>
<td>是</td>
<td>否                            &lt;</td>
<td>是</td>
<td>LaTeX, HTML, DocBook, Taskjuggler, PDF, Freemind, XOXO, iCalendar</td>
</tr>
<tr>
<td>eNoteFile</td>
<td>免费使用，付费注册</td>
<td>Windows XP/Vista/Windows 7</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>一键同步，分享， 密码保护，自动备份，远程访问，可视化搜索</td>
</tr>
<tr>
<td>Evernote</td>
<td>免费和付费版</td>
<td>Android, Mac OS X, iPhone OS, Windows XP, Windows Vista, Windows 7, Windows Mobile, Palm Pre, IMAP (read-only), WWW.</td>
<td>是</td>
<td>是</td>
<td>也行。mac的桌面版不支持不支持。文本和电子墨迹不允许混合。</td>
<td>是</td>
<td>XML保存，买南非版可以导入和显示 HTML, PDF, JPG, WAV, PNG, MP3, GIF, AMR. 付费版可以加入任何文件类型为附件.</td>
</tr>
<tr>
<td>Exstora organiser</td>
<td>免费和付费版</td>
<td>Windows 2000 &#8211; Vista</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>文本</td>
</tr>
<tr>
<td>FileIt.in</td>
<td>免费+广告</td>
<td>基于网页</td>
<td>否</td>
<td>是</td>
<td>否</td>
<td>是</td>
<td>Html</td>
</tr>
<tr>
<td>Gnote</td>
<td>遵循GPL协议 3</td>
<td>Linux</td>
<td>是</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>NoteXmlFormat, HTML, PDF</td>
</tr>
<tr>
<td>Google Notebook</td>
<td>web service</td>
<td>基于网页</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>基于网页; 导出为 ODF, Microsoft Word, PDF etc.</td>
</tr>
<tr>
<td>Gournal</td>
<td>遵循GPL协议</td>
<td>Linux</td>
<td>?</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>SVG</td>
</tr>
<tr>
<td>iAnnotate PDF</td>
<td>专利</td>
<td>iPad, iPod, iPhone</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>PDF</td>
</tr>
<tr>
<td>Idea Rover</td>
<td>免费试用</td>
<td>Windows</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>导入 HTM, HTML, PDF, and TXT, 到处为 RTF, DOC</td>
</tr>
<tr>
<td>Jarnal</td>
<td>遵循GPL协议</td>
<td>Any Java capable platform, including Linux, Windows, and Mac OS X</td>
<td>?</td>
<td>是</td>
<td>是,但是没有压力感应</td>
<td>是</td>
<td>ad-hoc 能够导出为 txt, html, jpg, pdf.</td>
</tr>
<tr>
<td>KNote</td>
<td>免费</td>
<td>Windows</td>
<td>是,</td>
<td>是</td>
<td>否</td>
<td>是</td>
<td>xml, 可以添加任何文件或文件夹为附件。 支持从 tiddlywiki 导入，也支持从浏览器保留格式的复制粘贴</td>
</tr>
<tr>
<td>Knowledge NoteBook</td>
<td>商业版，30天使用.</td>
<td>Window XP / Vista / 7</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>Text, image, pdf 或其他的多媒体文件</td>
</tr>
<tr>
<td>KeepNote</td>
<td>遵循GPL协议</td>
<td>Windows, Linux, Mac OS X</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>XHTML, XML, PNG, JPG, GIF</td>
</tr>
<tr>
<td>Linked Notes Basic</td>
<td>免费</td>
<td>Windows XP, Windows Vista</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>专利，导出为 RTF and TXT</td>
</tr>
<tr>
<td>MagicView</td>
<td>专利</td>
<td>Windows</td>
<td>是</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>HTML, RTF, TXT, HTA, XHTML, XML, PNG, JPG, GIF, BMP, MHT, PDF, DjVu (到处为HTML，导入微软的WORD (DOC))</td>
</tr>
<tr>
<td>Microsoft Windows Journal</td>
<td>专利</td>
<td>Windows XP Tablet PC edition</td>
<td>?</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>专利</td>
</tr>
<tr>
<td>Microsoft Office OneNote</td>
<td>专利</td>
<td>Windows XP, Windows Vista, Windows 7, Windows Phone 7, Windows Mobile, web;</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>专利</td>
</tr>
<tr>
<td>MyNotex</td>
<td>遵循GPL协议</td>
<td>Linux</td>
<td>是</td>
<td>是</td>
<td>否</td>
<td>否</td>
<td>基于Sqlite, 压缩附件，到处为HTML</td>
</tr>
<tr>
<td>My Yellow Notepad</td>
<td>专利</td>
<td>Windows</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>XML, 专利 compressed</td>
</tr>
<tr>
<td>Circus Ponies NoteBook</td>
<td>专利</td>
<td>Mac OS X</td>
<td>?</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>专利, 导出: html, opml, rtf, txt, doc, pdf</td>
</tr>
<tr>
<td>NoteCase Pro</td>
<td>免费和收费版本</td>
<td>跨平台</td>
<td>是</td>
<td>是</td>
<td>否</td>
<td>是</td>
<td>基于html和sqlite</td>
</tr>
<tr>
<td>NoteLab</td>
<td>遵循GPL协议</td>
<td>Linux, Windows, and Mac OS X</td>
<td>?</td>
<td>?</td>
<td>?</td>
<td>是</td>
<td>另存为SVG, 到处为 PNG, JPG, BMP</td>
</tr>
<tr>
<td>NotePub</td>
<td>免费的web 服务</td>
<td>基于网页</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>基于网页, HTML</td>
</tr>
<tr>
<td>NoteScribe</td>
<td>专利</td>
<td>Windows</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>保存为 .NSE (NoteScribe), 到处为 .rtf</td>
</tr>
<tr>
<td>Okular</td>
<td>遵循GPL协议</td>
<td>Linux/Unix</td>
<td>否</td>
<td>是</td>
<td>否</td>
<td>是</td>
<td>PDF, PS, TIFF, CHM, DjVu, DVI, XPS, ODF, various others</td>
</tr>
<tr>
<td>PDF Annotator</td>
<td>专利, 基本协议50刀（^_^!）</td>
<td>Windows</td>
<td>?</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>只能保存在pdf，不能导出</td>
</tr>
<tr>
<td>PDF Studio</td>
<td>专利</td>
<td>Windows, Linux, Mac OS X. Also available 基于网页.</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>PDF</td>
</tr>
<tr>
<td>Personal Knowbase</td>
<td>专利</td>
<td>Windows</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>导出为 RTF, HTML, TXT, CSV</td>
</tr>
<tr>
<td>RightNote</td>
<td>专利，免费试用</td>
<td>Windows (2K/XP/2K3/Vista)</td>
<td>否</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>专利 (sqlite);可以导入和导出以下文件格式： txt, csv, html (webclips) &amp; xls</td>
</tr>
<tr>
<td>Springnote</td>
<td>web服务</td>
<td>基于网页</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>基于网页; 导入word， OpenDocument text (ODT), Text files (TXT), HTML;导出为blog.</td>
</tr>
<tr>
<td>Swarm Doc</td>
<td>基于网页, 遵循GPL协议</td>
<td>基于网页, Linux, Windows, Mac OSX</td>
<td>是</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>基于网页; Html, wiki, local storage in sqlite database</td>
</tr>
<tr>
<td>threetags.com</td>
<td>web service</td>
<td>基于网页, iPhone app</td>
<td>是</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>HTML</td>
</tr>
<tr>
<td>TiddlyWeb</td>
<td>BSD</td>
<td>cross-platform (Python / 基于网页)</td>
<td>是</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>TiddlyWiki, HTML, TXT, JSON etc.</td>
</tr>
<tr>
<td>TiddlyWiki</td>
<td>BSD</td>
<td>cross-platform (browser-/ 基于网页)</td>
<td>是</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>HTML</td>
</tr>
<tr>
<td>Tomboy</td>
<td>L遵循GPL协议</td>
<td>cross-platform</td>
<td>是</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>NoteXmlFormat, HTML, PDF, wiki-formats</td>
</tr>
<tr>
<td>TreeDBNotes</td>
<td>免费软件，共享软件</td>
<td>Windows</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>文件格式 .treedb ，到处为 html, doc, txt, rtf, rvf.</td>
</tr>
<tr>
<td>WhizFolders</td>
<td>专利</td>
<td>Windows</td>
<td>否</td>
<td>是</td>
<td>否</td>
<td>是</td>
<td>Database, 专利 compressed</td>
</tr>
<tr>
<td>Typhoeus Stickies</td>
<td>免费</td>
<td>Windows XP, Vista and 7</td>
<td>?</td>
<td>是</td>
<td>否</td>
<td>是</td>
<td>.RTF and .TXT</td>
</tr>
<tr>
<td>xl Notes</td>
<td>免费和收费版本</td>
<td>Windows</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>xls, xlsx formats</td>
</tr>
<tr>
<td>Xournal</td>
<td>遵循GPL协议</td>
<td>Linux, Windows</td>
<td>?</td>
<td>是</td>
<td>是</td>
<td>是</td>
<td>XML, export to PDF</td>
</tr>
<tr>
<td>Zim</td>
<td>Artistic, 遵循GPL协议</td>
<td>Linux, Windows</td>
<td>?</td>
<td>是</td>
<td>?</td>
<td>是</td>
<td>wiki-format, export to HTML and Txt2Tags</td>
</tr>
</tbody>
</table>
<p> 下面根据数据来说明为什么应该选用<a href="http://www.evernote.com/" target="_blank">Evernote</a>  ： </p>
<p> 第一,<a href="http://www.evernote.com/" target="_blank">Evernote</a>  有免费版本,免费,功能受限,但是是足够用. 附合it just works原则. </p>
<p> 第二,跨平台绝对给力,秒杀所有同类软件.大部份同类软件能够支持到linux,mac,windows三个已经能够给人惊喜了,<a href="http://www.evernote.com/" target="_blank">Evernote</a>  呢,支持的平台包括：Android, Mac OS X, iPhone OS, Windows XP, Windows Vista, Windows 7, Windows Mobile, Palm Pre, IMAP (read-only), WWW,这意味着什么：首先,<a href="http://www.evernote.com/" target="_blank">Evernote</a>  的笔记才是真正的 <a href="http://en.wikipedia.org/wiki/Write_once,_run_anywhere" target="_blank">write once,run everwhere</a>,身为一个程序猿,对这种特性简直爱到死;其次,<a href="http://www.evernote.com/" target="_blank">Evernote</a>  彻底重新定义了记笔记这个活动：纸笔,电脑,几乎所有智能手机：iphone,windows mobile, palm, android,都有客户端,feature phone只要支持imap的mail客户端,或者拥有一个浏览器,就都可以完成记笔记这个行为.移动设备,可以让记笔记无处不在. </p>
<p> 第三,支持的笔记类型：键盘输入,语音输入,照片,手写的电子墨迹,等等,从此笔记不再是冷电脑前,书前冷冰冰的文字知识,而可以是任意的领悟,待办事项,绝妙主意,路过的一个美女(是的,支持照片),帐本,钱的花销,记录时间花销,等等.<a href="http://www.evernote.com/" target="_blank">Evernote</a>  让记笔记成为了艺术. </p>
<p> 第四,强大的搜索功能<sup><a class="footref" name="fnr.3" href="#fn.3">3</a></sup>：<a href="http://www.evernote.com/" target="_blank">Evernote</a>  的搜索按照关键字搜索文本,标题,图片中文字内容,等等,关键字支持正则表达式.但是,这并不是<a href="http://www.evernote.com/" target="_blank">Evernote</a>  搜索的全部,<a href="http://www.evernote.com/" target="_blank">Evernote</a>  的搜索强大还在于其支持以下搜索标准：tag,创建日期,修改日期,是否有附件,是否发自email,notebook,作者,经度,纬度,todo.笔记不但找得到,而且找的准. </p>
<p> 简要说明了<a href="http://www.evernote.com/" target="_blank">Evernote</a>  的强大,下面来介绍什么时候应该使用<a href="http://www.evernote.com/" target="_blank">Evernote</a>  和如何使用<a href="http://www.evernote.com/" target="_blank">Evernote</a>  来记笔记. </p>
</div></div>
</p></div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><a href="http://www.evernote.com/" target="_blank">Evernote</a>  记笔记的一些方法 </h3>
<div class="outline-text-3" id="text-2">    </div>
<div id="outline-container-2_1" class="outline-4">
<h4 id="sec-2_1">读书笔记 &#8211; Kindle + twitter + evernote </h4>
<div class="outline-text-4" id="text-2_1">
<p>对于传统的读书笔记,一般是发生在看书时,而现在更多的发生在电脑旁,下面我们介绍下读书笔记和<a href="http://www.evernote.com/" target="_blank">Evernote</a>  结合的方法. </p>
<ul>
<li> 看书时
<p> 对于传统纸书,一般还是记在纸上,然后输入电脑,或者就在笔记本上.可惜,这种纸质方法记下的笔记有两个很严重的问题：书和笔记本的存放,书籍,纸质笔记本的丢失是经常发生的事情;二,笔记的搜索：好像读过某本书,记过什么想法,但是需要的时候,翻遍所有笔记本偏偏找不到更是经常遇到的情况. </p>
<p> 所以,读书我推荐<a href="https://kindle.amazon.com/" target="_blank">Kindle</a> <sup><a class="footref" name="fnr.4" href="#fn.4">4</a></sup>,<a href="https://kindle.amazon.com/" target="_blank">Kindle</a> 可以完美克服这两个缺点：便携,<a href="https://kindle.amazon.com/" target="_blank">Kindle</a> 6寸屏幕,可以放到一般衣服的兜里:易搜索,将<a href="https://kindle.amazon.com/" target="_blank">Kindle</a> 和<a href="http://www.evernote.com/" target="_blank">Evernote</a>  进行绑定,将<a href="https://kindle.amazon.com/" target="_blank">Kindle</a> 记录下的读书笔记交给<a href="http://www.evernote.com/" target="_blank">Evernote</a>  来保存,得以充分利用<a href="http://www.evernote.com/" target="_blank">Evernote</a>  的强大搜索功能,LOL～～～～.绑定方法是<a href="https://kindle.amazon.com/" target="_blank">Kindle</a> 绑定<a href="http://twitter.com/" target="_blank">Twitter</a>,<a href="http://twitter.com/" target="_blank">Twitter</a>绑定<a href="http://www.evernote.com/" target="_blank">Evernote</a>  :  (kindle+twit)+(twit+evernote)=kindle -&gt; evernote,具体方法见 <a href="http://blog.evernote.com/2009/04/14/evernote_twitter/" target="_blank">http://blog.evernote.com/2009/04/14/evernote\_twitter/</a>. </p>
<p> 绑定后,在<a href="https://kindle.amazon.com/" target="_blank">Kindle</a> 上记笔记时,使用以下语法,即可将笔记传送到<a href="http://www.evernote.com/" target="_blank">Evernote</a>  数据库中,下面是我建议的一种记笔记的方式： </p>
<p> @myen 110122  my kindle example notes for <a href="http://www.evernote.com/" target="_blank">Evernote</a>   #aat. </p>
<p> @myen是evernote的<a href="http://twitter.com/" target="_blank">Twitter</a>帐号,在绑定<a href="http://twitter.com/" target="_blank">Twitter</a>和<a href="http://www.evernote.com/" target="_blank">Evernote</a>  后,所有@myen的内容都会记录到你的<a href="http://www.evernote.com/" target="_blank">Evernote</a>  数据库,100122是记笔记的日期,供日后查询用,my kindle example notes for <a href="http://www.evernote.com/" target="_blank">Evernote</a>  是笔记内容,#notes是标签,标记了是看哪本书,也是为了查询时能够单独查询出看某一本书时的笔记,比如我现在看的一本书是&lt;American Accent Trainning&gt;<sup><a class="footref" name="fnr.5" href="#fn.5">5</a></sup>,我给所有这本书的笔记用的标签#aat,这个标签起名全在个人品味,只要保持前后一致,并且好记即可. </p>
</li>
<li> 电脑旁
<p> 电脑旁看书的话,Windows和Mac有相应的Evernote版本,Linux有一个移植Nevernote<sup><a class="footref" name="fnr.6" href="#fn.6">6</a></sup>,客户端功能强大,使用方法可以参考<sup><a class="footref" name="fnr.1.2" href="#fn.1">1</a></sup>中各种介绍. </p>
</li>
</ul></div>
</p></div>
<div id="outline-container-2_2" class="outline-4">
<h4 id="sec-2_2">浏览网页,保存雄文 &ndash; evernote for firefox and chrome </h4>
<div class="outline-text-4" id="text-2_2">
<p> 浏览网页时,难免会有些雄文,看过一遍不爽,于是会想保存下来日后阅读.一般可以选择保存为google bookmark, google reader中共享, google reader中标记星号. </p>
<p> 那么<a href="http://www.evernote.com/" target="_blank">Evernote</a>  提供一种新的,我认为更好的方法,将雄文保存为自己的笔记.毕竟内容再好,网上的内容属于网上的,即使在google reader中标记为了星号,google reader上从来没有下1000的未阅读也会让阅读星号文章成为一种美好的愿望.但是,保存为笔记,闲暇时分,自然而然的打开evernote,看一下tag为todo,同时tag为algortithm的文章,那是多么的惬意.笔记,随着时时温习让知识纳入自己的知识网络那才是王道. </p>
<p> <a href="http://www.evernote.com/" target="_blank">Evernote</a>  提供<a href="http://www.mozilla.com/firefox/fx/" target="_blank">Firefox</a>和<a href="http://google.com/chrome/" target="_blank">Chrome</a>r两个浏览器的插件<sup><a class="footref" name="fnr.7" href="#fn.7">7</a></sup>,如果是安装了Windows的客户端,默认的会在IE上安装<a href="http://www.evernote.com/" target="_blank">Evernote</a>  插件.插件的作用是抓取网页内容,简单易用,功能强大,谁用谁知道. </p>
</p></div>
</p></div>
<div id="outline-container-2_3" class="outline-4">
<h4 id="sec-2_3">时间,任务管理,想法,绝妙主意: email + mobile phone 客户端 </h4>
<div class="outline-text-4" id="text-2_3">
<p> 记得当时听李敖讲当年刚上大学军训的时候,用塑料布将笔和笔记本绑到腰上,有什么想法赶紧用纸笔记下来,塑料布绑着也不怕笔记本被汗水浸湿. </p>
<p> 二十一世纪的我们,如果再有如此强大的求知欲,需要记笔记时当然不再用如此虐待自己了.手机,社会人的标配,在借助了<a href="http://www.evernote.com/" target="_blank">Evernote</a>  的东风后,也能够在加强沟通以外的领域开花结果. </p>
<p> <a href="http://www.evernote.com/" target="_blank">Evernote</a>  提供以下平台的客户端,iPhone / iPod Touch,iPad, Android, BlackBerry, Palm Pre / Palm Pixi, Windows Mobile, 下载地址：    <a href="http://www.evernote.com/about/download/?btn=grey" target="_blank">http://www.evernote.com/about/download/?btn=grey</a>. </p>
<p> 如果手机不是以上几种,不是智能手机,也没有问题,只要支持email,通过email记笔记也很是方便,方法见： <a href="http://blog.evernote.com/2010/03/16/emailing-into-evernote-just-got-better/" target="_blank">http://blog.evernote.com/2010/03/16/emailing-into-evernote-just-got-better/</a>. </p>
<p> 好吧,如果手机连email都不支持,最后的办法就是web.现在的feture phone全部都支持java,安装一个opera,用opera访问<a href="http://www.evernote.com/" target="_blank">Evernote</a>  的主页,在其主页上进行记笔记的操作即可.只是,如果记笔记需要如此繁琐的步骤：1.打开浏览器,2.登陆<a href="http://www.evernote.com/" target="_blank">Evernote</a>  主页,3.新建,4.写内容,5.提交,6,记笔记完成.这繁琐的步骤让手机失去了记笔记的方便快捷性,那么失去了快捷性的手机记笔记也就没有必要了.这种情况下,使用纸笔也许是更好的方法. </p>
<p> 如果你是一位潮人,果粉,那么恭喜,苹果的所有产品都有相应的app,而且据说是最好用的<a href="http://www.evernote.com/" target="_blank">Evernote</a>  app,羡慕妒嫉啊. </p>
</p></div>
</p></div>
</p></div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3">evernote-mode </h3>
<div class="outline-text-3" id="text-3">
<p>作为一个emacser,总是会有一种狂热,那就是看到任何好软件,都会下意识的去问,这个功能emacs中能有吗？对于<a href="http://www.evernote.com/" target="_blank">Evernote</a>  ,答案是也是YES. </p>
<p> emacs中evernote的名字叫evernote-你懂的-mode,项目地址：<a href="http://code.google.com/p/emacs-evernote-mode/" target="_blank">http://code.google.com/p/emacs-evernote-mode/</a>. evernote-mode是用ruby写的,截止2011.4.14,最新的版本是0.30. </p>
<p> evernote-mode的功能包括：打开笔记,创建笔记,支持对已有笔记的内容、标题、标签的修改,支持为<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>中选中区域内容创建笔记,搜索笔记.最新版的支持本地的笔记内容Cache,读写笔记和标签速度比当时我用的0.10版本变快了不少. </p>
<p> 下面简要介绍下evernote-mode的安装,设置,使用流程. </p>
</p></div>
<div id="outline-container-3_1" class="outline-4">
<h4 id="sec-3_1">evernote-mode的安装 </h4>
<div class="outline-text-4" id="text-3_1">
<ul>
<li> download代码到本地
<p> svn checkout <a href="http://emacs-evernote-mode.googlecode.com/svn/trunk/" target="_blank">http://emacs-evernote-mode.googlecode.com/svn/trunk/</a> emacs-evernote-mode-read-only </p>
</li>
<li> 安装ruby脚本   </li>
</ul>
<pre class="src src-bash">cd evernote-mode/ruby
ruby setup.rb
</pre>
<ul>
<li> 将evernote-mode.el加入到load path  </li>
<li> 为evernote-enml-formatter-command 安装w3m（可选） 如果你的linux/Unix用户,从这里取<a href="http://w3m.sourceforge.net/index.en.html" target="_blank">w3m</a> 或者使用你发行版的包管理工具安装;如果你是Windows用户,安装<a href="http://www.cygwin.com/" target="_blank">cygwin</a>并在安装过程中选中w3m包.  </li>
<li> 将evernote-mode的配置文件加入.emacs  </li>
</ul>
<pre class="src src-elisp">(setq evernote-enml-formatter-command '(<span style="color: #cd8162;">"w3m"</span> <span style="color: #cd8162;">"-dump"</span> <span style="color: #cd8162;">"-I"</span> <span style="color: #cd8162;">"UTF8"</span> <span style="color: #cd8162;">"-O"</span> <span style="color: #cd8162;">"UTF8"</span>)) <span style="color: #cd4f39;">; </span><span style="color: #cd4f39;">option
</span>(add-to-list 'load-path <span style="color: #cd8162;">"&lt;your load path&gt;"</span>)
(require 'evernote-mode)
(global-set-key <span style="color: #cd8162;">"\C-cec"</span> 'evernote-create-note)
(global-set-key <span style="color: #cd8162;">"\C-ceo"</span> 'evernote-open-note)
(global-set-key <span style="color: #cd8162;">"\C-ces"</span> 'evernote-search-notes)
(global-set-key <span style="color: #cd8162;">"\C-ceS"</span> 'evernote-do-saved-search)
(global-set-key <span style="color: #cd8162;">"\C-cew"</span> 'evernote-write-note)
(global-set-key <span style="color: #cd8162;">"\C-cep"</span> 'evernote-post-region)
(global-set-key <span style="color: #cd8162;">"\C-ceb"</span> 'evernote-browser)
</pre>
<p> 如果使用cygwin来安装的ruby的话,需要cygwin-mount.el(<a href="http://www.emacswiki.org/cgi-bin/wiki/cygwin-mount.el" target="_blank">http://www.emacswiki.org/cgi-bin/wiki/cygwin-mount.el</a>). </p>
<p> 将cygwin-mount.el放至load path中,并在.emacs中加入以下代码 </p>
<pre class="src src-elisp">(require 'cygwin-mount)
(cygwin-mount-activate)
</pre>
<p> 安装完毕. </p>
</p></div>
</p></div>
<div id="outline-container-3_2" class="outline-4">
<h4 id="sec-3_2">evernote-mode的使用 </h4>
<div class="outline-text-4" id="text-3_2">
<p>简要介绍evernote-mode提供的命令和功能. </p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption></caption>
<colgroup>
<col align="left" />
<col align="left" /> </colgroup>
<thead>
<tr>
<th scope="col">命令</th>
<th scope="col">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td>evernote-open-note</td>
<td>在Emacs的一个Buffer中打开一个已存在的笔记</td>
</tr>
<tr>
<td>evernote-save-note(\C-x\C-s)</td>
<td>保存修改过的笔记</td>
</tr>
<tr>
<td>evernote-create-note</td>
<td>创建一个笔记</td>
</tr>
<tr>
<td>evernote-write-note</td>
<td>从当前buffer创建新笔记</td>
</tr>
<tr>
<td>evernote-post-region</td>
<td>使用当前选中的区域的内容创建笔记</td>
</tr>
<tr>
<td>evernote-edit-tags(\C-cet)</td>
<td>修改当前笔记的标签</td>
</tr>
<tr>
<td>evernote-change-edit-mode(\C-cee)</td>
<td>改变编辑模式 (TEXT,XHTML可选)</td>
</tr>
<tr>
<td>evernote-rename-note(\C-cer)</td>
<td>重命名当前笔记</td>
</tr>
<tr>
<td>evernote-delete-note (\C-ced)</td>
<td>删除当前笔记</td>
</tr>
<tr>
<td>evernote-search-notes</td>
<td>搜索</td>
</tr>
<tr>
<td>evernote-do-saved-search</td>
<td>使用已保存的搜索条件进行笔记搜索</td>
</tr>
<tr>
<td>evernote-create-search</td>
<td>为一个搜索分配一个名字,以备后用</td>
</tr>
<tr>
<td>evernote-edit-search</td>
<td>编辑已保存搜索的搜索条件</td>
</tr>
<tr>
<td>evernote-toggle-read-only (\C-x\C-q)</td>
<td>设置笔记的只读属性</td>
</tr>
<tr>
<td>evernote-enml-formatter-command</td>
<td>格式化XHTML笔记</td>
</tr>
<tr>
<td>evernote-browser</td>
<td>打开evernote-browser,evernote browser提供强大的功能</td>
</tr>
</tbody>
</table>
<ul>
<li> everntoe-broswer
<p> Evernote Browser可以打开以下四种页面：标签列表页面,已保存搜索列表页面,笔记列表页面,笔记本列表页面. </p>
<p> 标签列表页面以层次图的形式列出Evernote服务中的标签列表,在标签名字上\C-m会打开符合此tag的笔记列表页. </p>
<p> <img src="https://dea.googlecode.com/svn/trunk/screenshots/evernote/broswer.png"  alt="https://dea.googlecode.com/svn/trunk/screenshots/evernote/broswer.png" /> </p>
<p> 已保存搜索是在Evernote中已创建的一系列搜索条件,在某个搜索上按键\C-m会打开符合相应的搜索结果的笔记. </p>
<p> <img src="https://dea.googlecode.com/svn/trunk/screenshots/evernote/single.png"  alt="https://dea.googlecode.com/svn/trunk/screenshots/evernote/single.png" /> </p>
<p> 笔记列表页面,符合某个搜索条件的笔记. </p>
<p> <img src="https://dea.googlecode.com/svn/trunk/screenshots/evernote/tagcourse.png"  alt="https://dea.googlecode.com/svn/trunk/screenshots/evernote/tagcourse.png" /> </p>
<p> 笔记本列表页面是Evernote上创建的所有笔记本的列表. </p>
<p> 下表是所有在Evernote Browser上可用的其它键命令. </p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption></caption>
<colgroup>
<col align="left" />
<col align="left" /> </colgroup>
<thead>
<tr>
<th scope="col">按键</th>
<th scope="col">动作</th>
</tr>
</thead>
<tbody>
<tr>
<td>b</td>
<td>移动到前一页</td>
</tr>
<tr>
<td>f</td>
<td>移动到后一页</td>
</tr>
<tr>
<td>t</td>
<td>创建一个标签列表页面并显示.如果已存在标签页面,直接将其打开.</td>
</tr>
<tr>
<td>S</td>
<td>创建一个搜索列表页面并显示.如果已存在,将其打开.</td>
</tr>
<tr>
<td>s</td>
<td>输入搜索条件,并显示符合搜索结果的笔记列表.</td>
</tr>
<tr>
<td>N</td>
<td>创建一个笔记本列表页面.如果笔记本列表已经存在,将其打开.</td>
</tr>
<tr>
<td>o</td>
<td>等同\C-m,但是光标并不移动到打开的笔记buffer.</td>
</tr>
<tr>
<td>n</td>
<td>如果在笔记列表,打开当前笔记,并移动到下一行.</td>
</tr>
<tr>
<td>p</td>
<td>如果在笔记列表,打开当前笔记,并移动到前一行</td>
</tr>
<tr>
<td>d</td>
<td>从Evernote Browser删除当前页面.</td>
</tr>
</tbody>
</table>
</li>
</ul></div>
</p></div>
</p></div>
<div id="outline-container-4" class="outline-3">
<h3 id="sec-4">org-mode + evernote-mode </h3>
<div class="outline-text-3" id="text-4">
<p> 因为我现在正在使用org-mode+remember来记笔记,org+remember的快捷和org-mode的显示都给我带来很好的使用体验. </p>
<p> org-mode的搜索功能比较不给力,那么是否可以将具有强大的搜索功能的<a href="http://www.evernote.com/" target="_blank">Evernote</a>  结合进来,使org-mode+remember+evernote-mode组成完美笔记三剑客呢？好吧,此处的答案仍然是YES. </p>
<p> 下面是我的解决方案.<b>代码 last edited: [fangzhzh@2011/08/12 20:46:20]</b> </p>
<pre class="src src-elisp"><span style="color: #cd4f39;">;;</span><span style="color: #cd4f39;">+evernote-mode+org-mode
</span><span style="color: #cd4f39;">;;</span><span style="color: #cd4f39;">&#22522;&#26412;&#24819;&#27861;&#26159;&#65306;&#22312;org-remember&#23436;&#25104;&#26102;,&#35843;&#29992;&#19968;&#20989;&#25968;&#26469;&#22788;&#29702;&#27492;remember&#30340;&#20869;&#23481;,&#23558;&#27492;&#20869;&#23481;&#36716;&#21270;&#20026;&#19968;&#20010;evernote&#30340;&#31508;&#35760;.
</span>
<span style="color: #cd4f39;">;;</span><span style="color: #cd4f39;">&#28155;&#21152;&#22788;&#29702;&#20989;&#25968;&#21040;rememer&#30340;hook
</span>(add-hook 'org-remember-before-finalize-hook 'evernote-this-org-note)

<span style="color: #cd4f39;">;;</span><span style="color: #cd4f39;">&#24403;&#35843;&#29992;&#21040;hook&#26102;,&#35843;&#29992;&#27492;&#20989;&#25968;,&#22788;&#29702;remember&#30340;&#20869;&#23481;,
</span>(<span style="color: #00ffff;">defun</span> <span style="color: #63b8ff;">evernote-this-org-note</span>(&amp;optional arg)
  <span style="color: #cd8162;">"select note"</span>
  (interactive <span style="color: #cd8162;">"P"</span>)
  (beginning-of-buffer)
  (re-search-forward <span style="color: #cd8162;">"^\*.*"</span>)
  (backward-word 1)
  (beginning-of-line )
  (copy-line)
  (forward-line)
  (evernote-post-region-4-org-mode (point) (point-max) <span style="color: #cd8162;">"test"</span>)
)

<span style="color: #cd4f39;">;;</span><span style="color: #cd4f39;">&#27492;&#20989;&#25968;&#23558;remember&#30340;&#20869;&#23481;&#20570;&#20026;evernote&#31508;&#35760;&#20869;&#23481;,&#26631;&#39064;&#30340;remember&#26159;&#26631;&#39064;,&#21516;&#26102;,&#20250;&#22312;minibuffer&#20013;&#35810;&#38382;tag,tag&#20197;&#8220;,&#8221;&#38388;&#38548;
</span>(<span style="color: #00ffff;">defun</span> <span style="color: #63b8ff;">evernote-post-region-4-org-mode</span> (begin end arg)
  <span style="color: #cd8162;">"Post the region as a note"</span>
  (interactive <span style="color: #cd8162;">"r\np"</span>)
  (enh-command-with-auth
   (save-excursion
     (save-restriction
       (narrow-to-region begin end)
       (if (and (enutil-neq arg nil) (enutil-neq arg 1))

<span style="color: #cd4f39;">;           </span><span style="color: #cd4f39;">(pop-to-buffer (enh-base-create-note-common (buffer-name) t t t))
</span>         (enh-base-create-note-common (current-kill 0) nil nil
nil t))))))
</pre>
<p> <img src="http://emacser.com/uploads/wpid-evernote-org-overview.png"  alt="http://emacser.com/uploads/wpid-evernote-org-overview.png" /> </p>
</p></div>
</p></div>
<div id="outline-container-5" class="outline-3">
<h3 id="sec-5"><a href="http://www.evernote.com/" target="_blank">Evernote</a>  搜索的一些例子 </h3>
<div class="outline-text-3" id="text-5">
<p> evernote的搜索功能相当强大：搜索条件多样,而且速度相当快. </p>
<p> 可以做为搜索条件的有：笔记本,任意表达式,标签,标题,创建日期,包含音频,包含图片,作者,创建笔记时的经纬度,笔记来源&hellip; </p>
<p> 下面给出一些例子. </p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption></caption>
<colgroup>
<col align="left" />
<col align="left" /> </colgroup>
<tbody>
<tr>
<td>例子</td>
<td>解释</td>
</tr>
<tr>
<td>tag:todo -tag:done created:day-1</td>
<td>今天所有有有标签todo,同时没有标签done的笔记</td>
</tr>
<tr>
<td>tag:money create:month</td>
<td>近一个月内所有有标签money的笔记</td>
</tr>
<tr>
<td>resource:image/*  tag:beauty</td>
<td>所有有标签beauty,同时笔记中有图片的笔记</td>
</tr>
<tr>
<td>tag:time tag:travel</td>
<td>所有符合有标签travel和time的笔记</td>
</tr>
<tr>
<td>tag:english     created:day-1 -created:day</td>
<td>有标签english,同时创建于昨天的不逑</td>
</tr>
<tr>
<td>source:mail.smtp</td>
<td>所有从邮件客户端发表的笔记</td>
</tr>
</tbody>
</table></div>
</p></div>
<div id="outline-container-6" class="outline-3">
<h3 id="sec-6">小结,缺点 </h3>
<div class="outline-text-3" id="text-6">
<p> <a href="http://www.evernote.com/" target="_blank">Evernote</a>  的缺点,就像它的优点一样明显,它的保存方式不是<a href="http://en.wikipedia.org/wiki/Plain_text" target="_blank">Plain text</a>的,尽管<a href="http://www.evernote.com/" target="_blank">Evernote</a>  的笔记可以导出多种格式,但是因为其使用私有格式,使版本管理工具对其不同版本之间内容比较无效,也就是版本管理这种功能失去了其存在的必要性.而没有版本管理的话,一个误操作就是万劫不复啊:一旦笔记内容因某些操作全部消失,那真是辛辛苦苦好多年,一下回到解放前, </p>
<p> <a href="http://www.evernote.com/" target="_blank">Evernote</a>  安全问题 <a href="http://xbeta.info/evernote-04.htm" target="_blank">http://xbeta.info/evernote-04.htm</a>, <a href="http://www.evernote.com/" target="_blank">Evernote</a>  的悲惨事迹 <a href="http://blog.est.im/archives/3723" target="_blank">http://blog.est.im/archives/3723</a>, 话说,其实我也出现过数据全部丢失的状况,幸亏我<a href="http://www.dropbox.com/" target="_blank">Dropbox</a>备份<a href="http://www.evernote.com/" target="_blank">Evernote</a>  数据库文件夹~~~~~,所有使用<a href="http://www.evernote.com/" target="_blank">Evernote</a>  记得备份,备份,备份,人肉备份,<a href="http://www.dropbox.com/" target="_blank">Dropbox</a>,各种方式只要是备份就行. </p>
</p></div>
</p></div>
<div id="outline-container-7" class="outline-3">
<h3 id="sec-7">形而上 </h3>
<div class="outline-text-3" id="text-7">
<p>形而上者谓之道,形而下者谓之器.我们前边说够了器,下边来说一下道:为什么记笔记? </p>
<p> 子曾经曰过:好记性不如烂笔头.李敖童鞋在某集&lt;李敖有话说&gt;中曾提到过自己超变态的记笔记的行为和方法,有兴趣的可以去Google搜一下. </p>
<p> 笑来的&lt;把时间当作朋友&gt;<sup><a class="footref" name="fnr.8" href="#fn.8">8</a></sup>一书中多次提到做笔记的必要性<sup><a class="footref" name="fnr.9" href="#fn.9">9</a></sup>,在此推荐&lt;把时间当作朋友&gt;,并极力推荐书中关于&lt;时间账本&gt;一章.另一本书&lt;每个人都能用英语&gt;中,提到自己的父亲博文强记,每每引经据典,无不精确让人佩服,最后发现原来也是系统记笔记的结果. </p>
<p> <a href="http://book.douban.com/subject/4159753/" target="_blank">&lt;Your brain at works&gt;</a>一书中在提到如何更好的使用大脑有限的能量时说道:努力地长时间将一个突如其来的想法或者todo事项记在大脑中非常的耗费大脑的资源,同时,干扰到大脑当前的工作状态,降低其工作效率.此时,最好的办法就是当想法突然蹦到你的脑海时,用任意方式(录音笔,纸笔,照片等等)将其快速记录下来,有时间来整理,然后马上转回到当前工作状态:此举一来记录下可能转瞬即逝的想法,二来,不打断大脑当前所处的状态,提高大脑的使用效率. </p>
<p> 最后,推荐刘未鹏的博客&lt;为什么你应该（从现在开始就）写博客 &gt; <a href="http://mindhacks.cn/2009/02/15/why-you-should-start-blogging-now/" target="_blank">http://mindhacks.cn/2009/02/15/why-you-should-start-blogging-now/</a>, 将笔记认为是一种未发表的博客,一种发表于博客前的自我反刍.那么,除去社会性功效,此篇博客的道理都适用于记笔记的行为,也就是&lt;为什么你应该(从现在开始就)记笔记&gt;. </p>
<p> Time-stamp: <span class="timestamp-wrapper"> <span class="timestamp">2011-05-06 17:47:28 fangzhzh</span></span> </p>
</p></div>
</p></div>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<p class="footnote"><sup><a class="footnum" name="fn.1" href="#fnr.1">1</a></sup> 各种<a href="http://www.evernote.com/" target="_blank">Evernote</a>  使用 <a href="http://linuxtoy.org/archives/%E5%85%A8è%83%BDç%9A%84ç%AC%94è%AE%B0è%BD%AF%E4%BB%B6â%80%94â%80%94evernote-%EF%BC%8830-beta%EF%BC%89.html" target="_blank">http://linuxtoy.org/archives/%E5%85%A8%E8%83%BD%E7%9A%84%E7%AC%94%E8%AE%B0%E8%BD%AF%E4%BB%B6%E2%80%94%E2%80%94evernote-%EF%BC%8830-beta%EF%BC%89.html</a>, <a href="http://www.biaodianfu.com/evernote.html" target="_blank">http://www.biaodianfu.com/evernote.html</a>, <a href="http://www.geekonomics10000.com/437" target="_blank">http://www.geekonomics10000.com/437</a>, <a href="http://www.williamlong.info/archives/2227.html" target="_blank">http://www.williamlong.info/archives/2227.html</a>, <a href="http://xbeta.info/evernote-03.htm" target="_blank">http://xbeta.info/evernote-03.htm</a>, <a href="http://blog.est.im/archives/3226" target="_blank">http://blog.est.im/archives/3226</a> 哈哈,一下子给出这么多链结,可见我的喜欢程度~~~LOL </p>
<p class="footnote"><sup><a class="footnum" name="fn.2" href="#fnr.2">2</a></sup> wordpress的模板可能无法显示完整的表格,完整,原始表格请移步 <a href="http://en.wikipedia.org/wiki/Comparison_of_notetaking_software" target="_blank">http://en.wikipedia.org/wiki/Comparison\_of\_notetaking\_software</a> </p>
<p class="footnote"><sup><a class="footnum" name="fn.3" href="#fnr.3">3</a></sup> 搜索语法介绍 <a href="http://www.evernote.com/about/developer/api/evernote-api.htm#_Toc277181469">http://www.evernote.com/about/developer/api/evernote-api.htm#\_Toc277181469</a> </p>
<p class="footnote"><sup><a class="footnum" name="fn.4" href="#fnr.4">4</a></sup> 大部分<a href="http://www.douban.com/doulist/137839/" target="_blank">经典的计算机的著作</a>基本上都有作者允许的pdf版本流传在外,google下基本可获得,将书传到<a href="https://kindle.amazon.com/" target="_blank">Kindle</a> 上阅读. </p>
<p class="footnote"><sup><a class="footnum" name="fn.5" href="#fnr.5">5</a></sup> American Accent Trainning <a href="http://book.douban.com/subject/1755336/" target="_blank">http://book.douban.com/subject/1755336/</a> </p>
<p class="footnote"><sup><a class="footnum" name="fn.6" href="#fnr.6">6</a></sup> NeverNote主页 <a href="http://nevernote.sourceforge.net/" target="_blank">http://nevernote.sourceforge.net/</a> </p>
<p class="footnote"><sup><a class="footnum" name="fn.7" href="#fnr.7">7</a></sup> firefox的evernote插件 <a href="https://addons.mozilla.org/zh-CN/firefox/addon/evernote-web-clipper/" target="_blank">https://addons.mozilla.org/zh-CN/firefox/addon/evernote-web-clipper/</a> chrome的evernote插件 <a href="https://chrome.google.com/extensions/detail/pioclpoplcdbaefihamjohnefbikjilc" target="_blank">https://chrome.google.com/extensions/detail/pioclpoplcdbaefihamjohnefbikjilc</a> </p>
<p class="footnote"><sup><a class="footnum" name="fn.8" href="#fnr.8">8</a></sup> &lt;把时间当作朋友&gt;pdf下载地址: <a href="http://www.lixiaolai.com/index.php/archives/9456.html" target="_blank">http://www.lixiaolai.com/index.php/archives/9456.html</a> </p>
<p class="footnote"><sup><a class="footnum" name="fn.9" href="#fnr.9">9</a></sup> &lt;把时间当作朋友&gt;中力推的记笔记工具是纸笔,但是作为一个挨踢从业者,我的经历使我更习惯电子产品,如手机,而且手机具备了&lt;把时间当作朋友&gt;中笑来提到的录音笔和纸笔两个功能. 工具的使用,主要关注点是舒服,哪个工具能够让你更投入到记笔记这个活动中,就应该使用哪个工具,而不要纠结于选择工具这个活动本身,更不要纠结于怎样学习适应一种别人认为好的工具.由此选用的工具一定要附合it just works原则.工具让你记笔记的行为成为一种享受,而不是痛苦. </p>
</p></div>
</p></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/evernote-mode.htm' t='Emacs中的Evernote: evernote-mode' d='' tag='ann,browser,c++,control,ede,Emacs,emacser,emacser.com,Email,erc,evernote,evernote-mode,face,IDE,irc,notetaking,onenote,org,plugin,python,screenshot,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/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</li>
	<li><a href="http://emacser.com/from-vi-to-emacs.htm" title="我是如何从vim转向Emacs的 (2010年04月27日)">我是如何从vim转向Emacs的</a> (55)</li>
	<li><a href="http://emacser.com/emacs-cpp-dev.htm" title="在Emacs下用C/C++编程 (2010年10月25日)">在Emacs下用C/C++编程</a> (37)</li>
	<li><a href="http://emacser.com/w3m.htm" title="Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页 (2009年11月23日)">Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页</a> (46)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (198)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/evernote-mode.htm/feed</wfw:commentRss>
		<slash:comments>67</slash:comments>
		</item>
		<item>
		<title>非程序员的Emacs使用心得</title>
		<link>http://emacser.com/non-programmer.htm</link>
		<comments>http://emacser.com/non-programmer.htm#comments</comments>
		<pubDate>Mon, 27 Dec 2010 03:33:42 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[ahei]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[hippie-expand]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[配色]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41783</guid>
		<description><![CDATA[作者: 杨博华David Young

这个标题本来是我的个人博客的标题，ahei老大偶然看见了之后觉得这个主意不错，问我说为什么不干脆就写写这个话题呢？ 好吧，这个要从为什么会有这个标题说起。话说世界上有两种人，一种是程序员，一种是非程序员。（呵呵，这是一个典型的程序员思维。如果当初不是二进制胜出的话，也许程序员也不这么想） 。至于我自己为什么要用这样一个标题呢？主要是因为，当我开始正式的使用 Emacs的时候，基本上已经不太是一个程序员了。而等我把 Emacs用的比较顺手，可以写一点什么和大家分享的时候，我已经不是程序员很久了。这就是这个标题的来历。




1 关于写字 
2 关于 Shell 
3 关于七日 
4 后记 &#8211; 关于 CopyWithoutSelection 

4.1 Copy Word 
4.2 Copy Line 
4.3 Copy Paragraph 
4.4 Copy String 
4.5 Copy Parenthesis 
4.6 the base functions 






1 关于写字 


那么非程序员在使用 Emacs上面和程序员有什么不同呢？最根本的区别来源于他们做的事情不一样。程序员用 Emacs，基本上会用来写程序。那么非程序员用 Emacs做什么呢？呃…… 他们，基本上用来…… 写字 。当然了，写程序也是在写字，但是从技术层面来说，编写程序代码的不确定性会少很多。这样不仅仅对 Emacs来说处理难度相对减小了，并且在用户群体之间的技术交流和技术共享也变得容易许多了。至少比较容易找到比你还牛的人也想解决相同的问题。非程序员面临的状况可就完全不同了，因为成为非程序员，限制条件非常简单——你只要不是“程序员”，对吧？所以虽然从各种角度来说，非程序员的数量都要远远大于程序员，由于人员组成非常的广泛，人员之间的共同点就变得相当的渺茫。更何况如此众多的非程序员还分为“用 Emacs的”和“不用 Emacs的”呵呵。所以技术交流和技术共享就面临着非常大的困难。比如说我所面临的技术难题，有可能根本就没有人在意过。


这就是我体会到的第一个心得。在刚一开始的时候，一切真的只有靠自己。


比如说一个日常的拷贝粘贴的操作。这曾经是一个完全没有人在意的事情。现在对谁来说拷贝粘贴这种事儿不是自己身体的一部分了？这个还需要思考吗？但是，在一些“惨绝人寰”的环境里，即便是如此简单的事情也会把人逼疯的。曾经有那么一段的岁月里，我需要把成百上千条信息，每天，从一个程序贴到另一个程序里面，一条接一条。相信我，我没有在编故事，这世上有一种东西叫“不兼容”，你们懂得。比如说从 Word里面贴到 Lotus Notes里面，或者从 Lotus Notes 里面贴到 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: 杨博华</span><a href="http://www.cnblogs.com/doveyoung/" target="_blank"><span style="color: #0000ff;"><b>David Young</b></span></a></p>
<p>
这个标题本来是我的个人博客的标题，ahei老大偶然看见了之后觉得这个主意不错，问我说为什么不干脆就写写这个话题呢？ 好吧，这个要从为什么会有这个标题说起。话说世界上有两种人，一种是程序员，一种是非程序员。（呵呵，这是一个典型的程序员思维。如果当初不是二进制胜出的话，也许程序员也不这么想） 。至于我自己为什么要用这样一个标题呢？主要是因为，当我开始正式的使用 Emacs的时候，基本上已经不太是一个程序员了。而等我把 Emacs用的比较顺手，可以写一点什么和大家分享的时候，我已经不是程序员很久了。这就是这个标题的来历。<span id="more-41783"></span>
</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 关于 Shell </a></li>
<li><a href="#sec-3">3 关于七日 </a></li>
<li><a href="#sec-4">4 后记 &#8211; 关于 CopyWithoutSelection </a>
<ul>
<li><a href="#sec-4_1">4.1 Copy Word </a></li>
<li><a href="#sec-4_2">4.2 Copy Line </a></li>
<li><a href="#sec-4_3">4.3 Copy Paragraph </a></li>
<li><a href="#sec-4_4">4.4 Copy String </a></li>
<li><a href="#sec-4_5">4.5 Copy Parenthesis </a></li>
<li><a href="#sec-4_6">4.6 the base functions </a></li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-3">
<h3 id="sec-1"><span class="section-number-3">1</span> 关于写字 </h3>
<div class="outline-text-3" id="text-1">
<p>
那么非程序员在使用 Emacs上面和程序员有什么不同呢？最根本的区别来源于他们做的事情不一样。程序员用 Emacs，基本上会用来写程序。那么非程序员用 Emacs做什么呢？呃…… 他们，基本上用来…… <b>写字</b> 。当然了，写程序也是在写字，但是从技术层面来说，编写程序代码的不确定性会少很多。这样不仅仅对 Emacs来说处理难度相对减小了，并且在用户群体之间的技术交流和技术共享也变得容易许多了。至少比较容易找到比你还牛的人也想解决相同的问题。非程序员面临的状况可就完全不同了，因为成为非程序员，限制条件非常简单——你只要不是“程序员”，对吧？所以虽然从各种角度来说，非程序员的数量都要远远大于程序员，由于人员组成非常的广泛，人员之间的共同点就变得相当的渺茫。更何况如此众多的非程序员还分为“用 Emacs的”和“不用 Emacs的”呵呵。所以技术交流和技术共享就面临着非常大的困难。比如说我所面临的技术难题，有可能根本就没有人在意过。
</p>
<p>
这就是我体会到的第一个心得。在刚一开始的时候，一切真的只有靠自己。
</p>
<p>
比如说一个日常的拷贝粘贴的操作。这曾经是一个完全没有人在意的事情。现在对谁来说拷贝粘贴这种事儿不是自己身体的一部分了？这个还需要思考吗？但是，在一些“惨绝人寰”的环境里，即便是如此简单的事情也会把人逼疯的。曾经有那么一段的岁月里，我需要把成百上千条信息，每天，从一个程序贴到另一个程序里面，一条接一条。相信我，我没有在编故事，这世上有一种东西叫“不兼容”，你们懂得。比如说从 Word里面贴到 Lotus Notes里面，或者从 Lotus Notes 里面贴到 Excel 里，等等等等。这个时候我通常会先把一方的内容抓到 Emacs里面，然后再从 Emacs 里面一条一条的贴到另一个程序里面。实际上通过 Emacs中转一下也只能让事情变得稍好一点而已。Emacs 也并没有在频繁的拷贝粘贴方面做什么优化的设计。所以我就自己编写了专门针对拷贝粘贴的扩展函数。你们知道拷贝粘贴过程当中最复杂的操作是哪个部分吗？是选中！对，答对了。所以在 EmacsWiki.org 上面的 CopyWithoutSelection 是我写的。是疯以前写的。（所以因此也就终于没有疯） 有没有程序员也觉得拷贝粘贴是一件孰不可忍的事情呢？一起来握个爪吧。
</p>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> 关于 Shell </h3>
<div class="outline-text-3" id="text-2">
<p>
除了用来辅助其他程序的工作，我也在 Emacs里面干一些正事儿。主要的事情是使用 Shell。最初跑的 Emacs里面来使用 Shell的主要原因是因为字体问题。随着显示器分辨率的突然变大（我从 Dell Inspire 换到了 Thinkpad），那 X Window 里面的默认字体也突然变得无法忍受了。回想那些日子里我还在 Windows XP 上面跑 Cygwin，我可真不知道怎么样能把 FVWM 里面的字体调到合我心意。最简单的办法当然就是用 Emacs，这个东西很方便就可以调大字体。不过说到吸引力也就仅此而已了。因为那个时候 Emacs 22里面跑 Shell可是相当的不稳定，一不留神就在你的眼前崩溃给你看，是整个 Emacs都会崩掉。更何况还有 X Window，那可是 Cygwin环境。每次离开或回到座位，拔下或接上外接显示器，都必须得重启 X Window ……
</p>
<p>
但是在 Emacs里面的 Shell还是美丽的让人欲罢不能。
</p>
<p>
你们知道，在 Shell操作里面绝大多数时候都是在重复的使用各种各样的信息块儿。例如说某几条命令的参数，某几个输出的结果，总之就是拷来拷去的“拼”命令，这就是最常做的事情。虽然会有各种各样的 complete，但是基本上登录到别的机器上的时候，大多数 complete 基本就不灵了，（当然，我也在用 hippie-expand，不过那个东西在 Shell当中有点儿麻烦。） 所以以前大多数时候都是在从 Shell本身的 history机制入手，直到我把 CopyWithoutSelection 也用到了 shell-mode 上面，从此各种各样的参数复制都变得前所未有的舒服了。但即便是这样，每天成百上千次的去操作也会变得让人不堪忍受的，所以我后来把 CopyWithoutSelection 改写成了在 shell-mode 里面可以连粘贴的步骤都省掉的状态。你只需要把光标放在上面，他会知道要把那些内容粘贴到什么地方去的。不是吗？那不就是粘贴到最后那条命令的最后那个参数后面吗？
</p>
</div>
</div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3"><span class="section-number-3">3</span> 关于七日 </h3>
<div class="outline-text-3" id="text-3">
<p>
但是呢，人一旦懒了起来，就很难再变勤快了。所以后来干脆就把所有地方的粘贴动作都省掉了，操作之前先放一个 mark，然后该要的内容自动发到 mark 那里，这样是不是清爽多了呢？ 直到……直到某一天我梦想着能够随便选择一段文字，然后就能把它发送过去。呃…… 就是这个念头的产生，带来了一个更大的问题—— mark！Mark 被重置了，对吧，就在我选择那段文字的时候…… 罪过，罪过，应该无欲，无欲无求才会到达西方极乐…… 好了，不乱想了， Emacs 的 mark 是 ring 的，就像我们都熟悉的 kill-ring 一样，mark 也有一个 ring 的。我把被重置的那个 mark 弹出去就好了，之前自己设置的那个 mark 就浮上来了。好了，好了，这个世界清净了。
</p>
</div>
</div>
<div id="outline-container-4" class="outline-3">
<h3 id="sec-4"><span class="section-number-3">4</span> 后记 &#8211; 关于 CopyWithoutSelection </h3>
<div class="outline-text-3" id="text-4">
<p>
这里是 <a href="http://www.emacswiki.org/emacs/CopyWithoutSelection">CopyWithoutSelection</a> 的经济适用房。
</p>
<p>
这个东西一开始的时候其实很简单。我就想偷懒让 Emacs 帮我把想要的东西拷贝到 kill-ring 里面。作为一个杰出的编辑器来说 Emacs应该知道所谓的“字”、“词”、“句”、“段落”都是什么东西，那么就完全没有道理再让我去操心这些细节了。所以我就编写了一些代码，非常简单的代码，其实就是告诉 Emacs 去做他原本就应该做的事情。
</p>
</div>
<div id="outline-container-4_1" class="outline-4">
<h4 id="sec-4_1"><span class="section-number-4">4.1</span> Copy Word </h4>
<div class="outline-text-4" id="text-4_1">

<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('p41783code30'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178330"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code30"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> copy-word <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #ff0000;">&quot;Copy words at point into kill-ring&quot;</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>copy-thing 'backward-word 'forward-word arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>paste-to-mark arg<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
Key binding
</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('p41783code31'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178331"><td class="code" id="p41783code31"><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-c w&quot;</span><span style="color: #66cc66;">&#41;</span>         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> copy-word<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-4_2" class="outline-4">
<h4 id="sec-4_2"><span class="section-number-4">4.2</span> Copy Line </h4>
<div class="outline-text-4" id="text-4_2">

<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('p41783code32'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178332"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code32"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> copy-line <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #ff0000;">&quot;Save current line into Kill-Ring without mark the line &quot;</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>copy-thing 'beginning-of-line 'end-of-line arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>paste-to-mark arg<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
Key binding
</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('p41783code33'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178333"><td class="code" id="p41783code33"><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-c l&quot;</span><span style="color: #66cc66;">&#41;</span>         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> copy-line<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"><span class="section-number-4">4.3</span> Copy Paragraph </h4>
<div class="outline-text-4" id="text-4_3">

<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('p41783code34'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178334"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code34"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> copy-paragraph <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #ff0000;">&quot;Copy paragraphes at point&quot;</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>copy-thing 'backward-paragraph 'forward-paragraph arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>paste-to-mark arg<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
Key binding
</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('p41783code35'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178335"><td class="code" id="p41783code35"><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-c p&quot;</span><span style="color: #66cc66;">&#41;</span>         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> copy-paragraph<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
弄完这三个最简单的部分之后，接下来的事情就比较复杂一些了。下面的函数一个是拷贝字符串的，另外一个是拷贝括号当中的内容的。
</p>
</div>
</div>
<div id="outline-container-4_4" class="outline-4">
<h4 id="sec-4_4"><span class="section-number-4">4.4</span> Copy String </h4>
<div class="outline-text-4" id="text-4_4">

<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('p41783code36'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178336"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p41783code36"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> beginning-of-string<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;  &quot;</span>
       <span style="color: #66cc66;">&#40;</span>re-search-backward <span style="color: #ff0000;">&quot;[ <span style="color: #000099; font-weight: bold;">\t</span>]&quot;</span> <span style="color: #66cc66;">&#40;</span>line-beginning-position<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">1</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>looking-at <span style="color: #ff0000;">&quot;[<span style="color: #000099; font-weight: bold;">\t</span> ]&quot;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</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><span style="color: #b1b100;">defun</span> end-of-string<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot; &quot;</span>
       <span style="color: #66cc66;">&#40;</span>re-search-forward <span style="color: #ff0000;">&quot;[ <span style="color: #000099; font-weight: bold;">\t</span>]&quot;</span> <span style="color: #66cc66;">&#40;</span>line-end-position<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">3</span> arg<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>looking-back <span style="color: #ff0000;">&quot;[<span style="color: #000099; font-weight: bold;">\t</span> ]&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>- <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</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>
&nbsp;
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> thing-copy-string-to-mark<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot; Try to copy a string and paste it to the mark
     When used in shell-mode, it will paste string on shell prompt by default &quot;</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>copy-thing 'beginning-of-string 'end-of-string arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>paste-to-mark arg<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
Key binding
</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('p41783code37'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178337"><td class="code" id="p41783code37"><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-c s&quot;</span><span style="color: #66cc66;">&#41;</span>         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> thing-copy-string-to-mark<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-4_5" class="outline-4">
<h4 id="sec-4_5"><span class="section-number-4">4.5</span> Copy Parenthesis </h4>
<div class="outline-text-4" id="text-4_5">
<p>
Similar with new copy string to mark
</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('p41783code38'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178338"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p41783code38"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> beginning-of-parenthesis<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;  &quot;</span>
       <span style="color: #66cc66;">&#40;</span>re-search-backward <span style="color: #ff0000;">&quot;[[&lt;(?<span style="color: #000099; font-weight: bold;">\&quot;</span>]&quot;</span> <span style="color: #66cc66;">&#40;</span>line-beginning-position<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">1</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>looking-at <span style="color: #ff0000;">&quot;[[&lt;(?<span style="color: #000099; font-weight: bold;">\&quot;</span>]&quot;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</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><span style="color: #b1b100;">defun</span> end-of-parenthesis<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot; &quot;</span>
       <span style="color: #66cc66;">&#40;</span>re-search-forward <span style="color: #ff0000;">&quot;[]&gt;)?<span style="color: #000099; font-weight: bold;">\&quot;</span>]&quot;</span> <span style="color: #66cc66;">&#40;</span>line-end-position<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">3</span> arg<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>looking-back <span style="color: #ff0000;">&quot;[]&gt;)?<span style="color: #000099; font-weight: bold;">\&quot;</span>]&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>- <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</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>
&nbsp;
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> thing-copy-parenthesis-to-mark<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot; Try to copy a parenthesis and paste it to the mark
     When used in shell-mode, it will paste parenthesis on shell prompt by default &quot;</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>copy-thing 'beginning-of-parenthesis 'end-of-parenthesis arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>paste-to-mark arg<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
Key binding
</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('p41783code39'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178339"><td class="code" id="p41783code39"><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-c a&quot;</span><span style="color: #66cc66;">&#41;</span>         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> thing-copy-parenthesis-to-mark<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
这个地方当初还有个故事呢。当我刚把代码贴上去的时候，那个时候还写的比较初级，EmacsWiki 上的 AndyStewart 老大居然还跑过来问我，为什么不去看一下 <a href="http://www.emacswiki.org/emacs/ThingAtPoint">Thing At Point</a> ? 其实这个原因不能再简单了——因为我不知道么。我前面说过，很多时候我都是靠自力更生的，哪里知道这么多老大啊？
</p>
<p>
当然，既然老大发话了，过去看一眼吧。我不仅去看了 Thing At Point，还把 Emacs 的 <code>thing-edit.el</code> 也翻出来看了一遍，然后把偶的代码用 <code>thing-edit.el</code> 的方法全部都重写了一遍，最后偶还是觉得对付字符串这种事情还是用我最初的办法解决起来比较舒坦。就又麻烦了一回又给改回来了。不幸就是在一些函数名字上不慎留下了一些 <code>thing-copy</code> 或者 <code>copy-thing</code> 这样的痕迹了。
</p>
<p>
所有以上几个函数，都依赖于下面这三个基础函数，由他们三个负责完成实际的工作。
</p>
</div>
</div>
<div id="outline-container-4_6" class="outline-4">
<h4 id="sec-4_6"><span class="section-number-4">4.6</span> the base functions </h4>
<div class="outline-text-4" id="text-4_6">

<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('p41783code40'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178340"><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
</pre></td><td class="code" id="p41783code40"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> get-point <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">symbol</span> <span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #ff0000;">&quot;get the point&quot;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> <span style="color: #b1b100;">symbol</span> arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span>
&nbsp;
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> copy-thing <span style="color: #66cc66;">&#40;</span>begin-of-thing end-of-thing <span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;copy thing between beg &amp; end into kill ring&quot;</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>beg <span style="color: #66cc66;">&#40;</span>get-point begin-of-thing <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>end <span style="color: #66cc66;">&#40;</span>get-point end-of-thing arg<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>copy-region-as-kill beg end<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span>
&nbsp;
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> paste-to-mark<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;Paste things to mark, or to the prompt in shell-mode&quot;</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>pasteMe 
         <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><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;shell-mode&quot;</span> major-mode<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span> <span style="color: #66cc66;">&#40;</span>comint-next-prompt <span style="color: #cc66cc;">25535</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>yank<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span> <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>mark<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>yank<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;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> arg
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> arg <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #b1b100;">nil</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> pasteMe<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> pasteMe<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>
实际上最终写成现在这个结构也是很多次重复之后才学会的。所以编写自己的扩展函数的时候也是很好的学习 Emacs，学习 eLisp 的时候。俗话说，生活就是一个星期日，接着另一个星期日…… Emacs 就是一个改变，接着另一个改变…… 基本上，每一个星期日，我的 Emacs 都在改变。
</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/non-programmer.htm' t='非程序员的Emacs使用心得' d='' tag='ahei,Emacs,hippie-expand,lambda,org,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/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</li>
	<li><a href="http://emacser.com/icicles-doremi-palette.htm" title="&#8220;色向胆边生&#8221; － 记Emacs配色的超级武器：Icicles，Color Palette和DoReMi (2009年11月19日)">&#8220;色向胆边生&#8221; － 记Emacs配色的超级武器：Icicles，Color Palette和DoReMi</a> (17)</li>
	<li><a href="http://emacser.com/to-emacs-beginner.htm" title="致Emacs初学者 (2009年11月30日)">致Emacs初学者</a> (121)</li>
	<li><a href="http://emacser.com/mew.htm" title="用Mew收发邮件 (2010年05月21日)">用Mew收发邮件</a> (86)</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> (99)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/non-programmer.htm/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Emacs － 普通人的编辑利器</title>
		<link>http://emacser.com/emacs-simple-use.htm</link>
		<comments>http://emacser.com/emacs-simple-use.htm#comments</comments>
		<pubDate>Wed, 24 Nov 2010 09:02:27 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[学习Emacs]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[Org Mode]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[代码折叠]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[鼠标]]></category>

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

现代生活中，文档越来越重要，电脑已经成为编辑文本最主要的工具，程序员的工作其实就是编辑文档，选择高效的文本工具，自然要考虑程序员用的工具。而 Emacs 就是一个是适合普通人使用的高效文档编写工具。
谈及 Emacs，很多人第一个感觉就是很复杂，随之而来就有一个疑问“很难用的吧？”。但是，我虽然不是程序员，现在使用 Emcas + Org-mode（Emcas 上的插件） 的组合，感觉行云流水，毫无碍难。心中想到，为什么就算是程序员也觉得 Emcas 难用，而我作为一介 非程序员 却觉得 Emacs 好用呢？我觉得，这不过是以讹传讹罢了。

为什么不是程序员的你也能运用 Emacs？

说实在话，就一个普通人而言，在没有接触过 Emacs 之前，是没法想像原来文本可以玩出这么多花样（Vim也很强，不过本文只谈 Emacs）。但是在网上，却有很多人在说 Emacs 难用，不得不说这是对 Emacs 的妖魔化。文本编辑器多种多样，Emacs 作为一个发展的40多年的编辑器，如果它真的要这么差的话，它早就应该成为历史的淘汰者，再不被人提起。而事实正正相反，Emacs 不但流传广泛，而且还被誉为世界两大编辑器之一，被人称之为“神的编辑器”。所以，以下的文字算是为 Emacs 辩解，要注意的是本文 并没有贬低别的编辑器 的意思。


不要妖魔化 Emacs ！


 妖魔化 Emacs 之①：Emacs 的操作效率不高。

 大多数这么说的人，都是使用 Vim 的程序员。也就是说，他们的这种评语，是从他们的职业特性出发，他们的判断并没有从其他的职业来出发考虑。事实上，就算 Emacs 的操作效率再怎么差，比起 Windows 下的记事本/Word 来说，那全键盘的操作下效率还是要高多了。


 妖魔化 Emacs 之②：Emcas 的操作复杂，不易学习。

 Emacs 没有“颠覆”人们的操作习惯，仅仅是增加了一些快捷键，使 Emacs 做到全键盘操作。对比起 Vim 来说，Emacs 的输入无需转换“模式”，上下左右还是上下左右，没有 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://www.gtdstudy.com" target="_blank"><span style="color: #0000ff;"><b>yibie</b></span></a></p>
<p><img class="alignright" title="Emacs" src="screenshots/emacs_logo_no_border.png" width="120" height="120"/></p>
<p>现代生活中，文档越来越重要，电脑已经成为编辑文本最主要的工具，程序员的工作其实就是编辑文档，选择高效的文本工具，自然要考虑程序员用的工具。而 Emacs 就是一个是适合普通人使用的高效文档编写工具。<span id="more-41723"></span></p>
<p>谈及 Emacs，很多人第一个感觉就是很复杂，随之而来就有一个疑问“很难用的吧？”。但是，我虽然不是程序员，现在使用 Emcas + Org-mode（Emcas 上的插件） 的组合，感觉行云流水，毫无碍难。心中想到，为什么就算是程序员也觉得 Emcas 难用，而我作为一介 <strong>非程序员</strong> 却觉得 Emacs 好用呢？我觉得，这不过是以讹传讹罢了。</p>
<div id="outline-container-1" class="outline-2">
<h3 id="sec-1">为什么不是程序员的你也能运用 Emacs？</h3>
<div id="text-1" class="outline-text-2">
<p>说实在话，就一个普通人而言，在没有接触过 Emacs 之前，是没法想像原来文本可以玩出这么多花样（Vim也很强，不过本文只谈 Emacs）。但是在网上，却有很多人在说 Emacs 难用，不得不说这是对 Emacs 的妖魔化。文本编辑器多种多样，Emacs 作为一个发展的40多年的编辑器，如果它真的要这么差的话，它早就应该成为历史的淘汰者，再不被人提起。而事实正正相反，Emacs 不但流传广泛，而且还被誉为世界两大编辑器之一，被人称之为“神的编辑器”。所以，以下的文字算是为 Emacs 辩解，要注意的是本文 <strong>并没有贬低别的编辑器</strong> 的意思。</p>
</div>
<div id="outline-container-1_1" class="outline-3">
<h4 id="sec-1_1">不要妖魔化 Emacs ！</h4>
<div id="text-1_1" class="outline-text-3">
<ul>
<li> 妖魔化 Emacs 之①：Emacs 的操作效率不高。
<ul>
<li> 大多数这么说的人，都是使用 Vim 的程序员。也就是说，他们的这种评语，是从他们的职业特性出发，他们的判断并没有从其他的职业来出发考虑。事实上，就算 Emacs 的操作效率再怎么差，比起 Windows 下的记事本/Word 来说，那全键盘的操作下效率还是要高多了。</li>
</ul>
</li>
<li> 妖魔化 Emacs 之②：Emcas 的操作复杂，不易学习。
<ul>
<li> Emacs 没有“颠覆”人们的操作习惯，仅仅是增加了一些快捷键，使 Emacs 做到全键盘操作。对比起 Vim 来说，Emacs 的输入无需转换“模式”，上下左右还是上下左右，没有 变化，不会让人在理解上发生困难。</li>
</ul>
</li>
<li> 妖魔化 Emacs 之③：Emcas 的配置复杂。
<ul>
<li>有很多人上网查看 Emacs 的配置文件，会被长长的配置文件吓倒。但是，不要忘了，写这些配置的人，都是一些程序员，他们对文本编辑器，由于他们要编写的文件，需要一些提示，免得他们在编写的过程中犯错，所以在给配置的时候，就会加入一些自已的要求。而经过我的实验，像我这样的普通人，如果没有特别的需求，Emacs 基本不用配置，而且就算要配置，只要通过 Emcas 的功能菜单就能配置好。所以，实际上并不复杂。</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-1_2" class="outline-3">
<h4 id="sec-1_2">总结</h4>
<div id="text-1_2" class="outline-text-3">
<ul>
<li> Emacs 没有“模式”之分，内容即敲即输符合人性直觉；</li>
<li> 有可视化的配置选项，没有特别要求无须修改配置文件。</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h3 id="sec-2">为什么你应该用 Emacs？</h3>
<div id="outline-container-2_1" class="outline-3">
<h4 id="sec-2_1">轻松进入“无念编辑”境界，编辑文档高效随心</h4>
<div id="text-2_1" class="outline-text-3">
<ul>
<li> “无念”是什么意思？
<ul>
<li> 对于佛经来说：&#8221;无念&#8221;就是，&#8221;于念而无念&#8221;，&#8221;于诸境上，心不杂&#8221;，即在一切境上、心不被外境所染，在自己的心念上。常能远离一切外境，不在所遇境上起妄念。但不是百物不思，不是无思维存在，不是心中一片死寂，而是&#8221;心不染境&#8221;，在念念之中排除一切杂念妄想、排除&#8221;尘劳邪见&#8221;。</li>
<li> 简单来说：“无念”是一种极度专心的状态，而人处于这种状态的时候可以最大限度的爆发出自身的潜能，自然而然的达到了自已目的。有的运动员在比赛中因极度的专心，会让人好似进入另外一个世界，而在这个世界中，他什么都感觉不到但又对一切变化都能了然于胸，什么也想不到但又对自已接下来要做的事十分笃定。最后，他就有如神助般，在不知不觉中打败对手。</li>
<li> 总而言之，“无念”就是一个人状态最好的时候。</li>
</ul>
</li>
<li> 为什么用 Emacs 可以帮助你进入“无念”境界？
<ul>
<li> 因为用 Emacs 来编写文档的时候，在编写文档的过程中 你不会考虑到除了文档内容之外的问题，你所要做的就是把眼前的文档编写完毕。你不会像使用 Word 那样要不停考虑排版问题。在编写文档的过程中，一会加粗一下这个字，一会搞搞标题，这样分心反而无法让你好好地完成眼前的工作。</li>
</ul>
</li>
</ul>
</div>
</div>
<div id="outline-container-2_2" class="outline-3">
<h4 id="sec-2_2">使用文本记录一切，最绿色便携、兼容性最最强的方案</h4>
<div id="text-2_2" class="outline-text-3">
<ul>
<li> “文本”是所有系统里面都可以使用的格式，在任何系统下你都可以读取/修改它</li>
<li> “文本”什么编辑器都可以读取/修改，不需要重新安装软件，不会向系统里面添加更多东西</li>
<li> “文本”的体积最小，里面只记录内容，没有多余的东西</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h3 id="sec-3">Org-Mode，令 Emacs 变成“文本魔法师”</h3>
<div id="text-3" class="outline-text-2">
<p>如果 Emacs 没有 Org-Mode 这个插件，我绝对不会推荐 Emcas 给大家使用。但是，由于有了 Org-Mode， Emacs 处理文本的能力得到了大幅度的提高，也使我可以从容的向大家推荐使用 Emacs 来编写文档。</p>
</div>
<div id="outline-container-3_1" class="outline-3">
<h4 id="sec-3_1">“设置标题”可以让你在编写文档的时候更显轻松</h4>
<div id="text-3_1" class="outline-text-3">
<ul>
<li> 有的人用 Word，会很怀念里面的大纲视图，因为在大纲视图里面可以很方便的浏览文档里面的每个小节，可以从总体上把握文档的内容。而在程序员的世界里面，他们同样有这样的需求，因为他们的工作也要写大量的内容。不过，他们是如何检阅自己写的内容的呢？答案是，他们会把自己写的内容分成很多个段落，然后他们会用到一个叫 <strong>代码折叠</strong> 的功能，把不需要编辑段落收起来，等要编辑的再把这个段落展开。这样就可以变相的有了“大纲视图”的功能。</li>
<li> 在 Org-Mode 设置标题，需要标记一些文本，而做标记很简单，在标题的前面加星号就可以了。</li>
<li> 具体是这样：<br />
<table border="2" cellspacing="0" cellpadding="6" frame="hsides" rules="groups">
<caption> </caption>
<colgroup>
<col align="left"></col>
</colgroup>
<tbody>
<tr>
<td>* 这是标题一</td>
</tr>
<tr>
<td>** 这是标题二</td>
</tr>
<tr>
<td>*** 这是标题三</td>
</tr>
<tr>
<td>注：最多可以支持10层标题</td>
</tr>
</tbody>
</table>
</li>
<li> 究竟妙不可言之处在哪，可以看看这个介绍视频（以后有机会，我会自己亲自录制一个视频）：<a href="http://orgmode.org/worg/org-tutorials/org-screencasts/org-series-episode-1.php">http://orgmode.org/worg/org-tutorials/org-screencasts/org-series-episode-1.php</a></li>
</ul>
</div>
</div>
<div id="outline-container-3_2" class="outline-3">
<h4 id="sec-3_2">运用“标记语法”，不用鼠标也能丰富文本效果</h4>
<div id="text-3_2" class="outline-text-3">
<ul>
<li> 有人会疑问，不用鼠标该如何让文字变粗、倾斜、加下划线呢？很简单，只要按照下面的示例来做：<br />
<table border="2" cellspacing="0" cellpadding="6" frame="hsides" rules="groups">
<caption> </caption>
<colgroup>
<col align="left"></col>
<col align="left"></col>
</colgroup>
<thead>
<tr>
<th scope="col">标记语法</th>
<th scope="col">效果</th>
</tr>
</thead>
<tbody>
<tr>
<td><code>*加粗*</code></td>
<td><strong>加粗</strong></td>
</tr>
<tr>
<td><code>/倾斜/</code></td>
<td><em>倾斜</em></td>
</tr>
<tr>
<td><code>_下划线_</code></td>
<td><span style="text-decoration: underline;">下划线</span></td>
</tr>
</tbody>
</table>
</li>
</ul>
</div>
</div>
<div id="outline-container-3_3" class="outline-3">
<h4 id="sec-3_3">运用“结构化文本”多格式输出，不再为文档转换而烦恼</h4>
<div id="text-3_3" class="outline-text-3">
<ul>
<li> Org-Mode 支持多种文档的输出，所以只要会用 Org-Mode，就可以随心的把的文档转化成自己想要的格式。这等于“一份文档，多种拷贝”，省心省时省力。</li>
<li> Org-Mode 支持转化的格式有：
<ul>
<li> 文本</li>
<li> 网页</li>
<li> PDF（需要 Latex 支持）</li>
<li> XOXO</li>
<li> Freemind</li>
<li> Docbook</li>
<li> iCalendar（苹果 iCal 文件）</li>
<li> ……</li>
</ul>
</li>
</ul>
<div id="outline-container-4">
<h3 id="sec-4">各种资料</h3>
<div id="outline-container-4_1">
<h4 id="sec-4_1">Emacs 的快速教程</h4>
<div id="text-4_1">
<ul>
<li> 第 25 章 Emacs 入门：<a href="http://i.linuxtoy.org/docs/guide/ch25.html">http://i.linuxtoy.org/docs/guide/ch25.html</a></li>
<li> Emacs 零海拔入门：<a href="http://wiki.woodpecker.org.cn/moin/EmacsSuperEasyTutorial">http://wiki.woodpecker.org.cn/moin/EmacsSuperEasyTutorial</a></li>
</ul>
</div>
</div>
<div id="outline-container-4_2">
<h4 id="sec-4_2">Org-Mode 的快速教程</h4>
<div id="text-4_2">
<ul>
<li> 第 32 章 组织你的意念：Emacs org mode：<a href="http://i.linuxtoy.org/docs/guide/ch32.html">http://i.linuxtoy.org/docs/guide/ch32.html</a></li>
</ul>
</div>
</div>
<div id="outline-container-4_3">
<h4 id="sec-4_3">各大中文 Emacs 网站</h4>
<div id="text-4_3">
<ul>
<li> Emacs 中文网：<a href="http://emacser.com/">http://emacser.com</a></li>
<li> 水木社区的 Emacs 版块：<a href="http://emacs.board.newsmth.net/">http://emacs.board.newsmth.net/</a></li>
<li> Ubuntn 中文社区的 Vim 和 Emacs 板块：<a href="http://forum.ubuntu.org.cn/viewforum.php?f=68&amp;sid=2c11d5a85aa16e15089d641176eefe58">http://forum.ubuntu.org.cn/viewforum.php?f=68&amp;sid=2c11d5a85aa16e15089d641176eefe58</a></li>
</ul>
</div>
<h3 id="text-4_3">更新记录</h3>
<div>
<ul>
<li>10月3日初稿，更正水木社区 Emacs 版块的链接（感谢 xbeta）；更正 Emacs 是编辑器之神的错误，感谢水木社区的网友 anhnmncb</li>
</ul>
</div>
</div>
</div>
</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/emacs-simple-use.htm' t='Emacs － 普通人的编辑利器' d='' tag='Emacs,emacser,emacser.com,IDE,org,Org Mode,screenshot,ubuntu,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> (198)</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> (99)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</li>
	<li><a href="http://emacser.com/emacs-cpp-dev.htm" title="在Emacs下用C/C++编程 (2010年10月25日)">在Emacs下用C/C++编程</a> (37)</li>
	<li><a href="http://emacser.com/w3m.htm" title="Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页 (2009年11月23日)">Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页</a> (46)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-simple-use.htm/feed</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>在Emacs下用C/C++编程</title>
		<link>http://emacser.com/emacs-cpp-dev.htm</link>
		<comments>http://emacser.com/emacs-cpp-dev.htm#comments</comments>
		<pubDate>Mon, 25 Oct 2010 01:43:49 +0000</pubDate>
		<dc:creator>lertsau</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[autoload]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[CEDET]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[ede]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[hippie-expand]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[semantic]]></category>
		<category><![CDATA[senator]]></category>
		<category><![CDATA[speedbar]]></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=41677</guid>
		<description><![CDATA[


1 参考文献 
2 序 
3 基本流程 
4 基本环境设置 

4.1 编辑环境配置 
4.2 自动补齐 


5 编译和调试程序 
6 阅读代码 




1 参考文献 


按照惯例，我写的文章在最开始处放参考文献。



hhuu @ newsmth 的《Emacs的日常生活》


emacs 的文档


emacs 相关插件的文档





2 序 


用emacs写程序也有5个年头了，深切地体会到Emacs的强大。程序员有三种，一种是用vi的，一种是用emacs的，还有一种是其他。或许有些夸张，但也颇能体现出emacs在程序员中的地位。


emacs最大的问题在于入门门槛较高。它看起来和多数人想象中的IDE相差甚远，很多人看到emacs的第一眼就觉得它是个记事本（还是个非常难用的记事本），稍微好些的往往觉得emacs也就是个ultraEditor而已，真是暴殄天物了。


我是个懒人，不喜欢记太多的快捷键，相信很多人和我一样。所以从我后面的叙述可以看出来，除了常用的命令都是快捷键外，其他命令多数都是用M-x执行或者用鼠标点菜单。这仅仅是个人风格问题，先说明一下。


我的基本编程环境是：



Debian GNU/Linux sid 操作系统


Gnome 2.10.0 桌面环境


GUN Emacs 23.0.0.1 for debian


使用 Gnu tool chains(gcc,make,gdb等等)


后面的叙述都基于上述环境。另外，本文主要针对C/C++程序开发，对其他语言有些也适用，从难度上说，本文主要针对入门者。


本文肯定会有很多错误，请指正， 谢谢。




3 基本流程 


写C++程序基本上是这么几个步骤：



编辑代码


编写Makefile


编译代码，修改编译错误


调试代码，修改逻辑错误


当然，往往还需要阅读别人的代码。


根据上述步骤，本文主要针对以下几个方面：



配置Emacs，建立便利的代码编辑环境和Makefile编写环境。


在Emacs中编译代码，并修改编译错误。


在Emacs中配合GDB调试程序。


利用cscope和ecb在emacs中阅读代码。 





4 基本环境设置 



4.1 编辑环境配置 


要写C++程序，当然要用到cc-mode插件。CC-Mode原本是支持C语言的，但现在也能支持很多语言，比如 C++，Java，Objective-C，CORBA，AWK，Pike等等。CC-Mode是gnu-emacs的标准插件。如果您要求不高，那么默认的配置或许就能满足。CC-Mode的各种行为都可以自由地定制，您可以参考这里的文档：CC-Mode参考文档


这里是我的.emacs文件中关于CC-Mode配置的部分，仅供参考：


?View Code LISP1
2
3
4
5
;;;; CC-mode配置  http://cc-mode.sourceforge.net/
&#40;require 'cc-mode&#41;
&#40;c-set-offset 'inline-open 0&#41;
&#40;c-set-offset [...]]]></description>
			<content:encoded><![CDATA[<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></li>
<li><a href="#sec-3">3 基本流程 </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 自动补齐 </a></li>
</ul>
</li>
<li><a href="#sec-5">5 编译和调试程序 </a></li>
<li><a href="#sec-6">6 阅读代码 </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-3">
<h3 id="sec-1"><span class="section-number-3">1</span> 参考文献 </h3>
<div class="outline-text-3" id="text-1">
<p>
按照惯例，我写的文章在最开始处放参考文献。
</p>
<ul>
<li>
hhuu @ newsmth 的《Emacs的日常生活》
</li>
<li>
emacs 的文档
</li>
<li>
emacs 相关插件的文档</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> 序 </h3>
<div class="outline-text-3" id="text-2">
<p>
用emacs写程序也有5个年头了，深切地体会到Emacs的强大。程序员有三种，一种是用vi的，一种是用emacs的，还有一种是其他。或许有些夸张，但也颇能体现出emacs在程序员中的地位。<span id="more-41677"></span>
</p>
<p>
emacs最大的问题在于入门门槛较高。它看起来和多数人想象中的IDE相差甚远，很多人看到emacs的第一眼就觉得它是个记事本（还是个非常难用的记事本），稍微好些的往往觉得emacs也就是个ultraEditor而已，真是暴殄天物了。
</p>
<p>
我是个懒人，不喜欢记太多的快捷键，相信很多人和我一样。所以从我后面的叙述可以看出来，除了常用的命令都是快捷键外，其他命令多数都是用M-x执行或者用鼠标点菜单。这仅仅是个人风格问题，先说明一下。
</p>
<p>
我的基本编程环境是：
</p>
<ul>
<li>
Debian GNU/Linux sid 操作系统
</li>
<li>
Gnome 2.10.0 桌面环境
</li>
<li>
GUN Emacs 23.0.0.1 for debian
</li>
<li>
使用 Gnu tool chains(gcc,make,gdb等等)</p>
</li>
</ul>
<p>后面的叙述都基于上述环境。另外，本文主要针对C/C++程序开发，对其他语言有些也适用，从难度上说，本文主要针对入门者。
</p>
<p>
本文肯定会有很多错误，<a href="mailto:caole82@gmail.com">请指正</a>， 谢谢。
</p>
</div>
</div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3"><span class="section-number-3">3</span> 基本流程 </h3>
<div class="outline-text-3" id="text-3">
<p>
写C++程序基本上是这么几个步骤：
</p>
<ol>
<li>
编辑代码
</li>
<li>
编写Makefile
</li>
<li>
编译代码，修改编译错误
</li>
<li>
调试代码，修改逻辑错误</p>
</li>
</ol>
<p>当然，往往还需要阅读别人的代码。
</p>
<p>
根据上述步骤，本文主要针对以下几个方面：
</p>
<ul>
<li>
配置Emacs，建立便利的代码编辑环境和Makefile编写环境。
</li>
<li>
在Emacs中编译代码，并修改编译错误。
</li>
<li>
在Emacs中配合GDB调试程序。
</li>
<li>
利用cscope和ecb在emacs中阅读代码。 </p>
</li>
</ul>
</div>
</div>
<div id="outline-container-4" class="outline-3">
<h3 id="sec-4"><span class="section-number-3">4</span> 基本环境设置 </h3>
<div class="outline-text-3" id="text-4">
</div>
<div id="outline-container-4.1" class="outline-4">
<h4 id="sec-4.1"><span class="section-number-4">4.1</span> 编辑环境配置 </h4>
<div class="outline-text-4" id="text-4.1">
<p>
要写C++程序，当然要用到cc-mode插件。CC-Mode原本是支持C语言的，但现在也能支持很多语言，比如 C++，Java，Objective-C，CORBA，AWK，Pike等等。CC-Mode是gnu-emacs的标准插件。如果您要求不高，那么默认的配置或许就能满足。CC-Mode的各种行为都可以自由地定制，您可以参考这里的文档：CC-Mode参考文档
</p>
<p>
这里是我的.emacs文件中关于CC-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('p41677code52'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167752"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41677code52"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;;;; CC-mode配置  http://cc-mode.sourceforge.net/</span>
<span style="color: #66cc66;">&#40;</span>require 'cc-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>c-set-offset 'inline-open <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>c-set-offset 'friend '-<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>c-set-offset 'substatement-open <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>


<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('p41677code53'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167753"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p41677code53"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;;;;我的C/C++语言编辑策略</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> my-c-mode-common-hook<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> tab-width <span style="color: #cc66cc;">4</span> indent-tabs-mode <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #808080; font-style: italic;">;;; hungry-delete and auto-newline</span>
  <span style="color: #66cc66;">&#40;</span>c-toggle-auto-hungry-state <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #808080; font-style: italic;">;;按键定义</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>control \`<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'hs-toggle-hiding<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">return</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'newline-and-indent<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>f7<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'compile<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>meta \`<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'c-indent-command<span style="color: #66cc66;">&#41;</span>
  <span style="color: #808080; font-style: italic;">;;  (define-key c-mode-base-map [(tab)] 'hippie-expand)</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>tab<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'my-indent-or-complete<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>meta ?/<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'semantic-ia-complete-symbol-menu<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
注意一下，上面最后两行是代码自动补齐的快捷键。后面我会提到代码自动补齐。</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('p41677code54'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167754"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p41677code54"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;;预处理设置</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> c-macro-shrink-window-flag t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> c-macro-preprocessor <span style="color: #ff0000;">&quot;cpp&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> c-macro-cppflags <span style="color: #ff0000;">&quot; &quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> c-macro-prompt-flag t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> hs-minor-mode t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> abbrev-mode t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'c-mode-common-hook 'my-c-mode-common-hook<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;;;我的C++语言编辑策略</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> my-c++-mode-hook<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> tab-width <span style="color: #cc66cc;">4</span> indent-tabs-mode <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>c-set-style <span style="color: #ff0000;">&quot;stroustrup&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;;  (define-key c++-mode-map [f3] 'replace-regexp)</span>
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
</div>
</div>
<div id="outline-container-4.2" class="outline-4">
<h4 id="sec-4.2"><span class="section-number-4">4.2</span> 自动补齐 </h4>
<div class="outline-text-4" id="text-4.2">
<p>
自动补齐通常用的都是hippie-expand，我也用了很长时间。不过有时候会觉得这个自动补齐“傻”了一点，常会补齐出一些毫不相干的东西，因为hippie-expand是根据你敲过的词和kill-ring等进行判断的，并不对程序语法进行分析。
</p>
<p>
所以你还需要安装一个代码分析工具，然后把它加进hippie-expand的扩展策略里去。我们可以用semantic。实际上，hippie-expand＋semantic是我所发现的最好的选择了，如果您有更好的，请您也告诉我一声:)
</p>
<p>
Semantic是<a href="http://cedet.sourceforge.net/" target="_blank">CEDET</a> 中的一个工具，CEDET是Collection of Emacs Development Environment Tools的缩写，它包含了好几个工具，都挺不错的。可惜我只会用其中两个。
</p>
<p>
您可以在.emacs中对Semantic进行配置，下面是我的.emacs相关的配置，仅供参考：
</p>
<p>
导入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('p41677code55'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167755"><td class="code" id="p41677code55"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>load-file <span style="color: #ff0000;">&quot;~/lib/emacs-lisp/cedet-1.0pre3/common/cedet.el&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>配置Semantic的检索范围:</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('p41677code56'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167756"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41677code56"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> semanticdb-project-roots 
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span>
<span style="color: #66cc66;">&#40;</span>expand-file-<span style="color: #b1b100;">name</span> <span style="color: #ff0000;">&quot;/&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>自定义自动补齐命令，这部分是抄hhuu的，如果在单词中间就补齐，否则就是tab。
</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('p41677code57'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167757"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p41677code57"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> my-indent-or-complete <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>looking-at <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>&gt;&quot;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>hippie-expand <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>indent-for-tab-command<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>control tab<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'my-indent-or-complete<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
hippie的自动补齐策略，优先调用了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('p41677code58'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167758"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p41677code58"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>autoload 'senator-try-expand-semantic <span style="color: #ff0000;">&quot;senator&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> hippie-expand-try-functions-<span style="color: #b1b100;">list</span>
      '<span style="color: #66cc66;">&#40;</span>
        senator-try-expand-semantic
        try-expand-dabbrev
        try-expand-dabbrev-visible
        try-expand-dabbrev-all-buffers
        try-expand-dabbrev-from-kill
        try-expand-<span style="color: #b1b100;">list</span>
        try-expand-list-all-buffers
        try-expand-line
        try-expand-line-all-buffers
        try-complete-file-name-partially
        try-complete-file-<span style="color: #b1b100;">name</span>
        try-expand-whole-kill
        <span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
注意一下我前面CC-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('p41677code59'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167759"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41677code59"><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><span style="color: #66cc66;">&#40;</span>tab<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'my-indent-or-complete<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>meta ?/<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'semantic-ia-complete-symbol-menu<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
这样，我们在CC-Mode中就可以调用自定义的hippie补全了，快捷键是Tab。
</p>
<p>
另外，我还把快捷键“Alt + / ”绑定到了semantic-ia-complete-symbol-menu命令上，这是semantic的命令，它会根据分析结果弹出补齐的菜单，效果如图显示：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/semantic-ia.jpg" rel="lightbox"><img src="screenshots/thumbs/thumbs_semantic-ia.jpg" height="150"/></a><p class="wp-caption-text">自动补齐效果图</p></div>
<p>
CEDET中还有一个不错的工具是speedbar，你可以用它在多个文件中快速切换。在我的.emacs配置文件里，我把speedbar关联到了F5上：</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('p41677code60'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167760"><td class="code" id="p41677code60"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>f5<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'speedbar<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这样用F5就可以调出speedbar，效果如下：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/speedbar.jpg" rel="lightbox"><img src="screenshots/thumbs/thumbs_speedbar.jpg" height="150"/></a><p class="wp-caption-text">speedbar</p></div>
<p>
不过说实话，我自己很少用到speedbar，我通常都是用dired配合bookmark使用:)
</p>
</div>
</div>
</div>
<div id="outline-container-5" class="outline-3">
<h3 id="sec-5"><span class="section-number-3">5</span> 编译和调试程序 </h3>
<div class="outline-text-3" id="text-5">
<p>
按上面的配置，写完程序和Makefile文件后，在Emacs源代码窗口中按F7就可以进行编译。因为在my-c-mode-common-hook()函数里，有这么一行：</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('p41677code61'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167761"><td class="code" id="p41677code61"><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><span style="color: #66cc66;">&#40;</span>f7<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'compile<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>默认情况下，emacs的compile命令是调用make -k，我把它改成了make。你也可以把它改成其他的，比如gcc之类的。改下面的“make”就行了。</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('p41677code62'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167762"><td class="code" id="p41677code62"><pre class="lisp" style="font-family:monospace;">'<span style="color: #66cc66;">&#40;</span>compile-command <span style="color: #ff0000;">&quot;make&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>Emacs会划分一个窗格显示编译的消息，在编译结束后，emacs会自动将编译器的输出和程序关联起来，告诉你第几行的程序有问题。直接在出错的行号上按Enter，就可以跳转到相应文件的相应行。其实我通常都是用鼠标中键去点出错行号:)
</p>
<p>
搞定了编译错误后，接着要和逻辑错误斗争了。其实对简单的程序来说，把中间结果打印到终端是最简单好用的调试办法:)不过稍微复杂点的程序就会晕菜了，这时我们就需要拿gdb跟踪程序流程了。
</p>
<p>
你用下面的命令就可以启动gdb了。
</p>
<pre class="example">
M-x gdb
</pre>
<p>通常我喜欢进入gdb-many-windows模式，这样就会把一个Frame划分为5个窗格，同时显示：gdb命令窗口，当前局部变量，程序文本，调用栈和断点。
</p>
<p>
gdb的命令就不在这里说了，它的文档几乎到处都是。emacs把gdb的命令和快捷键做了绑定，对于常用的命令，还是输入快捷键比较方便。比如，C-c C-n是Next line，C-c C-s是step in，其实用的最多的快捷键也就是这两个。
</p>
<p>
下面是我的gdb效果图：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/gdb.jpg" rel="lightbox"><img src="screenshots/thumbs/thumbs_gdb.jpg" height="150"/></a><p class="wp-caption-text">GDB</p></div>
</div>
</div>
<div id="outline-container-6" class="outline-3">
<h3 id="sec-6"><span class="section-number-3">6</span> 阅读代码 </h3>
<div class="outline-text-3" id="text-6">
<p>
在emacs下读代码通常有三种工具，最简单的是etags，最复杂的是ecb（emacs code browser），位于中间的是cscope。
</p>
<p>
etags和ctags一样，只不过前者是用于emacs的，后者是用于vi的。我个人觉得etags功能稍稍显得不够用一点，当然，也可能是我用的不好:) 欢迎大牛指导。
</p>
<p>
使用tags之前要先对源代码分析建立tags文件，在代码所在目录中运行：etags -R 即可。
</p>
<p>
我常用的就这几个命令和快捷键：
</p>
<pre class="example">M-x visit-tags-table &lt;RET&gt; FILE &lt;RET&gt;   选择tags文件
M-. [TAG] &lt;RET&gt;                         访问标签
M-*                                     返回
C-u M-.                                 寻找标签的下一个定义
</pre>
<p>
ecb据说功能强大，但是太复杂了，我懒得折腾它。谁搞定了教教我吧:) 下面是一张ecb的效果图。
</p>
<p>
cscope是我感觉比较合适的一个工具。它其实是一个独立的软件，完全可以脱离vi和emacs使用。但是结合emacs的强大功能，cscope就显得更加方便了。GNU Emacs默认自带cscope的支持。在使用之前，cscope也需要对代码进行索引。在emacs中可以这样做：
</p>
<pre class="example">C-c s a             设定初始化的目录，一般是你代码的根目录
C-s s I             对目录中的相关文件建立列表并进行索引
</pre>
<p>
建完索引之后，你就可以用cscope在代码里游荡了。常用的一些命令如下：
</p>
<pre class="example">C-c s s             序找符号
C-c s g             寻找全局的定义
C-c s c             看看指定函数被哪些函数所调用
C-c s C             看看指定函数调用了哪些函数
C-c s e             寻找正则表达式
C-c s f             寻找文件
C-c s i             看看指定的文件被哪些文件include
</pre>
<p>
上面这些快捷键其实我自己也常常记不全，没关系，抬头看看上面的菜单栏，有一栏就是Cscope，这些命令里头都有:)
</p>
<p>
贴一个cscope的效果图吧:
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/cscope.jpg" rel="lightbox"><img src="screenshots/thumbs/thumbs_cscope.jpg" height="150"/></a><p class="wp-caption-text">cscope</p></div>
<p>
写完了。希望这篇文章对您能有一些用处。有问题或建议可以和<a href="mailto:caole82@gmail.com">我</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/emacs-cpp-dev.htm' t='在Emacs下用C/C++编程' d='' tag='autoload,browser,C/C++,CEDET,control,ede,Emacs,emacser,emacser.com,gdb,hippie-expand,IDE,org,screenshot,semantic,senator,speedbar,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> (198)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</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> (99)</li>
	<li><a href="http://emacser.com/from-vi-to-emacs.htm" title="我是如何从vim转向Emacs的 (2010年04月27日)">我是如何从vim转向Emacs的</a> (55)</li>
	<li><a href="http://emacser.com/emacs.htm" title="Emacs长啥样 (2009年11月5日)">Emacs长啥样</a> (16)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-cpp-dev.htm/feed</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
	</channel>
</rss>

