<?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中文网</title>
	<atom:link href="http://emacser.com/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> (44)</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>2</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> (2)</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>76</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>钗黛双收：若你也同Vim难割舍，却又看Emacs情切切</title>
		<link>http://emacser.com/vimvsemacs.htm</link>
		<comments>http://emacser.com/vimvsemacs.htm#comments</comments>
		<pubDate>Mon, 21 Feb 2011 02:48:45 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[学习Emacs]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41806</guid>
		<description><![CDATA[作者: C. Minos Niu




1 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （引子） 
2 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （Vim篇） 
3 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （Emacs篇，结局） 




1 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （引子） 


这篇文章分享我的一些经历，写给和我一样对娇小的Vim难以割舍，又在抱上Emacs这个大家闺秀以后死活不愿意撒手的朋友们。


如果你不知道什么是“编辑器圣战”，那不妨百度Google一下，总之是自从开辟鸿蒙以来，就有两个以伴君左右为己任的贤内助（Vim编辑器和Emacs编辑器）在互掐。由于两位佳人的理念差别之大，加上各自阵营之间的鸿沟之深，使得先贤先哲基本上都会在这两个阵营里面挑一个来站队。


网络普及以后，凡有帖子对Vim和Emacs这两大编辑器作出比较，大都有成为必删贴的潜质。原因很好理解，无论是谁看了红楼梦，很难不对宝钗黛玉这两位产生点好恶，此后但凡有人起了个头要对钗黛二人做点比较，那后面的楼经常能盖歪到变成地域攻击男女对骂。在技术论坛里，这样折腾不被河蟹掉才怪。更有甚者，如果谁在讨论编程的时候问了一句“需要做xx开发，用什么工具比较好？”随后也常常演变成Vim对Emacs的钗黛攻伐，最后一样飞沙走石天昏地暗。这就说明，选择Vim或Emacs已经不仅取决于我们在编辑文本时的好恶，而已经上升到干活的人怎么挑工具，过日子的人怎么选老婆这种哲学高度的问题。


我一向觉得，成事者不可狭于器。所以选工具时候没必要为了工具本身而搞个粉丝团，而是就着菜选刀，比着孩子找媳妇，揽来什么样的活计使什么样的家伙。若以我的经验来概括，Vim的犀利在于键盘操作，练家子爽得是用最少的手指运动完成编辑；Emacs的NB在于自定义功能，高手们都有一套独门不传的脚本，所以Emacser满手都是绝活，靠这些绝活上天入地无所不能。注意，这里要讲的既不是比出高下，也不是评测完了各打五十大板和稀泥。而是说说提炼出两个工具的精华加以“双修”，用足够务实的态度来平息争端。



先说点野史当引子。大学里面从来都不缺废寝忘食折腾电脑的兄弟。他们当中应该有不少动机都和当年的我一样：希望被人误认为是电脑高手。这种伪装有一个巨大的好处——没准能多给女生重装几次Windows。


不过，重装Windows的高手们为了哥们面前神侃时不露怯，基本上还要玩过点一般人玩不转的GNU/Linux。我想，工科男生们的Linux情结，怕有不少是因此而生。然而凡事不易，玩Linux是要自己改配置文件的，这倒是根硬骨头。


骨头硬的重要原因么，编辑器不顺手。在那没有Ubuntu的年代里，谁要是折腾几个晚上装好一台Linux的小白肉鸡，会发现可用的编辑器只有Vim。这玩意和Windows的记事本、Dos的edit相比简直就是个怪胎。这一点想必Emacser也深有感触吧，进到Vim里面若是不懂命令，肯定是在一阵滴滴滴过后连一个字母都敲不到屏幕上。


当装机圣手们的情商智商普遍被挑战了以后，大致是迅速分化为两派——啃骨头派和换骨头派。啃派如我，继续捏着脚适应Vim的小鞋；换派不用说也能猜到，自然是鞋也不要就转身踏入了Emacs阵营——在那边起码知道怎么打字。


按说天朝对于西方的编辑器圣战应该是打酱油的态度，但实际情况是，啃派和换派俨然形成了自己的圣战副本。




2 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （Vim篇） 


那段时间作为Vim啃派，我和许多队友一样有个自恃甚高的理由来支持Vim：编辑时击键次数最少。但是私下里想想，这个理由多少有些往脸上贴金。


其实Vim用多了以后，并不只是臣服于高效，更多的是手指头上瘾。用我们运动神经控制的行话来说，Vimer的大脑已经被触觉感官和运动神经一起绑架了。那些用手指肌肉记住的命令，执行起来基本不怎么过脑子。而且一旦命令执行成功，脑中还会生成大量“多巴胺”以示奖励。


看过《生活大爆炸》的应该都有印象，Leslie夜晚敲Leonard的门，只不过是为了缓解自己多巴胺分泌过剩……所以Vimer生存在这样一种状态下：只要不用hjkl这种奇怪的击键来移动光标，就会流着眼泪打着呵欠思念不已；反过来一旦用上了hjkl，那就等于在重复《生活大爆炸》里面那种神经感受。你说像在嗑药也行。



Vim瘾上身之后必然产生一个愿望，那就是以嗑药的方式，额，以Vim的方式来操作所有的软件。很不幸，持有这种愿望的啃派们几乎都会发现，就算骨头啃下来了，它也是打狗不能的。


首先，想替小家碧玉Vim扩展出十八般武艺，这个基本上真的很难。难的根本原因是Vim给用户预留的扩展能力先天不足。Vim的设计者压根没考虑把它做成一个放之四海而皆准的巨无霸，所以Vim打从娘胎里出来时在胃口上就不太给力。


既然此路不通，那只好另求变法。为了让啃骨头时攒下的功夫不至于荒废，能不能对其他软件的键盘操作方式动动刀，让它们起码和Vim敲起来差不多？这也很难。虽然软件的操作方式通常可以自定义，但自定义的途径大多是修改键位绑定。这种途径有个与生俱来的短板，它并不能区分出Vim里的“命令模式”和“编辑模式”。不巧的是，这种模式区分恰恰是Vim操作方式的核心。说到底，要想在其他软件里面模拟Vim，基本上等同于重新开发一遍。所以这么多年我只见到Firefox的Vimperator插件做到了在宿主软件（Firefox）中对Vim几乎完全模拟（当然有若干Chrome和Visual Studio的插件也可以部分模拟Vim，但个人意见它们的“类Vim”程度都还差得远）。而且现如今浏览器混战成这个样子，哪个插件都恨不得全机种通吃，但Vimperator却丝毫没有往其他浏览器上移植的意思。这也从某种意义上证明模拟Vim不是件容易的事。


折腾这一大圈，发现一个无奈而不争的事实：Vim由于太过婉约，终归没有可能升任管家。意思就是不可能让所有软件用起来都像是在操作Vim一样。所以我只好把Vim养在硬盘里没事绣绣花打打字，而让管家这个肥缺虚位以待。转机出现在某一天，那天后知后觉的看到了一个老掉牙的故事，福特汽车的创始人亨利福特说，在汽车发明以前如果你问消费者想要什么，他们会说想要跑得更快的马。苹果的乔大爷也总是拿这个故事来说事，意思就是我苹果这才叫真正抓住了问题的核心——（出门人）要的未必是马，而是快；（iPhone粉丝）要的未必是多任务，而是上网的时候还能听个小曲。


这个产品设计的例子启发在哪？在我看来，当一个愿望被挖出来以后，不见得需要照本宣科才能满足这个愿望。如果换个解法还能满足，那说明你hit the button了。换句话说，当引子出来后，故事往下怎么续是文无定法的。


回到眼前这个事上，啃骨头派的愿望是用Vim的操作方式来一统江湖，不过果真非得“用Vim的方式”吗？恐怕重点还是“一桶浆糊”吧。玩电脑的都是懒人，懒人有个癖好叫“Don’t repeat yourself”，如果谁弄出一套比较高效的键盘操作方式，能让我学一次以后就不用再学了，那就暂时去tnnd的门派。


用个比方来做总结，Vim实在是精致独特得有点像个林妹妹。但谁要是希望家里也有个林妹妹，光把自家丫头照着绣像打扮打扮是不行的，必须从零开始养成一个。而且就算真能养出来个“天上掉下来”一般的可人儿，管家婆的位置仍然没她的份。




3 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （Emacs篇，结局） 

一旦破除了心理障碍，在Vim之外寻求“管家婆”的人选也就不算作倒戈了。电影《社交网络 The Social Network》里面有这样一个镜头，在扎克伯格同学悲愤不已，要把女生头像和畜生猪狗一起打分时，他来了句“有必要重启Emacs，修改代码”。这个杜撰的场景告诉我们，IT巨星再怎么胸怀壮志，始于足下的不过是手指另一端连着的编辑器。当geek们叫嚣要在世界上留下一个痕迹（make a dent in the universe）的时候，手里常常拎着一把折凳，折凳背面写着——Emacs。



我用Emacs的最初经历和很多Emacser可能稍有不同，但想必都是从跌跌撞撞的青涩回忆开始，最后让Emacs成了一个“全能伴侣”而浑不自知。博士期间，我主要用的工具是Matlab和Visual Studio，这两个工具自带的编辑器与Vim相比都是小白，属于要严重影响心情和智商的那一种。但是，无论是Matlab还是Visual Studio，它们自带的小白编辑器都只有Emacs模式，没有Vim模式(原因如前所述，模拟Vim很难）。这好歹是聊胜于无，而且既然Emacs用户能从中受益，我凭什么不试试。不得不说，如果目的是用统一的键盘操作方式来使用各种软件，Emacs的领地实在是太广了。除了Matlab和Visual Studio这种内部伪装出一部分Emacs的快捷键以外，非常值得一提的是还有一个日本人写的软件Xkeymacs。这玩意干脆把Windows的快捷键全部接管了，直接让所有Windows软件用起来都跟Emacs一个感觉。所以如果你像我一样不得不在Word里面写文稿的话（Neuroscience领域很多教授不是工程背景，只用Word），就知道Xkeymacs让你舒服在哪里了。难怪一个老外在评价的时候说Xkeymacs这个李鬼软件好到让人“心中不安（disturbingly good）”。


搞笑的是，我是直到在Xkeymacs这种替身杂牌军中用熟了Emacs快捷键之后，才开始慢慢尝试Emacs本尊。开始时先把Emacs配成了Matlab IDE，用它搞定了整个博士课题的数据处理，后来又陆续使用了cedet，etag，yasnippet这些扩展，再加上秒杀笔记、日程、Wiki、表格、博文的org-mode……算是把我这个入门级的Hacker武装到了神经末梢。虽然我不像其他Emacser一般可以骄傲的说自己“活在Emacs里”，但若说最近重要的工作成果都是在Emacs上创作出来，这话却是一点也不假。到了这个时候，Emacs已经完全升任管家婆，堪比宝钗再世。如果谁也有似曾相识的回忆，想必可以深刻体会到这样一个比较狗血的剧情，若宝玉能和Emacs一样的宝钗姐姐继续好下去，那完全有希望弄出个明朝版的百度，东山再起。


可是作为Vim的死忠，对于手掌几乎不挪窝的向往，那是消失不掉的。


坊间对于Emacs有一条经典评语，说Emacs是“伪装成编辑器的操作系统”。言下之意就是Emacs什么都能做（包括经典的煮咖啡）。既然Emacs都神通成瑞士军铲了，何不另辟蹊径，用军铲削出一个Vim呢？西方到底是计算机技术的始作俑者，对Emacs这种恐龙级工具而言，能被摆弄的四十年来都被摆弄一遍了。所以只要放狗一搜，就会发现Emacs居然自带Vim模拟，名叫viper-mode。而且为了让viper-mode更像Vim，还有第三方开发了一套叫做vimpulse的增强包。也就是说，只要下载一个vimpulse.el脚本，丢到Emacs的启动路径中，它就可以几乎完美的模拟Vim！


写到这里，折腾的两条主线已在此收敛，引发“圣战”的两大神器也已经被和谐进了同一个窗口。再往下就该写些技术笔记和心得回顾，不在这篇的目的之内，因此应该歇笔了。如果要问我到底是在用Emacs还是在用Vim，或问哪一方赢得了我的选择？我也不知道。每当想写点程序、调段脚本、码点wiki、记记笔记的时候，我用的都是Emacs提供的外加自己用eLisp扩展出的功能；但是当码出来的东西让人不爽，需要浏览、修改和整理的时候，手指弹出的又都是Vim的命令。


回到最开始说的，若是你用电脑要做的事和我差不多，而且也觉得用键盘工作是很爽的一件事，那就应该试试Emacs+Vim双修。道理很简单，假如你是包工头，而Emacs和Vim是两位身手不凡的应聘者，那么当然应该是两个都收了而后“择其善者而从之”，这才是对自家生意负责。不过对选编辑器如选媳妇的人来说，两大神器双修在手，尽在此一句：


惘于环肥燕瘦，颦怅蹙茫


哪比举钗盈黛，牵黄擎苍？




]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://emacser.com/about.htm#cminosniu" target="_blank"><span style="color: #0000ff;"><b>C. Minos Niu</b></span></a></p>
<p><img class="alignright" title="VimVsEmacs" src="https://dea.googlecode.com/svn/trunk/screenshots/editor_war.png"/></p>
<div id="table-of-contents">
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （引子） </a></li>
<li><a href="#sec-2">2 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （Vim篇） </a></li>
<li><a href="#sec-3">3 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （Emacs篇，结局） </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-3">
<h3 id="sec-1"><span class="section-number-3">1</span> 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （引子） </h3>
<div class="outline-text-3" id="text-1">
<p>
这篇文章分享我的一些经历，写给和我一样对娇小的Vim难以割舍，又在抱上Emacs这个大家闺秀以后死活不愿意撒手的朋友们。<span id="more-41806"></span>
</p>
<p>
如果你不知道什么是“编辑器圣战”，那不妨百度Google一下，总之是自从开辟鸿蒙以来，就有两个以伴君左右为己任的贤内助（Vim编辑器和Emacs编辑器）在互掐。由于两位佳人的理念差别之大，加上各自阵营之间的鸿沟之深，使得先贤先哲基本上都会在这两个阵营里面挑一个来站队。
</p>
<p>
网络普及以后，凡有帖子对Vim和Emacs这两大编辑器作出比较，大都有成为必删贴的潜质。原因很好理解，无论是谁看了红楼梦，很难不对宝钗黛玉这两位产生点好恶，此后但凡有人起了个头要对钗黛二人做点比较，那后面的楼经常能盖歪到变成地域攻击男女对骂。在技术论坛里，这样折腾不被河蟹掉才怪。更有甚者，如果谁在讨论编程的时候问了一句“需要做xx开发，用什么工具比较好？”随后也常常演变成Vim对Emacs的钗黛攻伐，最后一样飞沙走石天昏地暗。这就说明，选择Vim或Emacs已经不仅取决于我们在编辑文本时的好恶，而已经上升到干活的人怎么挑工具，过日子的人怎么选老婆这种哲学高度的问题。
</p>
<p>
我一向觉得，成事者不可狭于器。所以选工具时候没必要为了工具本身而搞个粉丝团，而是就着菜选刀，比着孩子找媳妇，揽来什么样的活计使什么样的家伙。若以我的经验来概括，Vim的犀利在于键盘操作，练家子爽得是用最少的手指运动完成编辑；Emacs的NB在于自定义功能，高手们都有一套独门不传的脚本，所以Emacser满手都是绝活，靠这些绝活上天入地无所不能。注意，这里要讲的既不是比出高下，也不是评测完了各打五十大板和稀泥。而是说说提炼出两个工具的精华加以“双修”，用足够务实的态度来平息争端。
</p>
<p><!--more--></p>
<p>
先说点野史当引子。大学里面从来都不缺废寝忘食折腾电脑的兄弟。他们当中应该有不少动机都和当年的我一样：希望被人误认为是电脑高手。这种伪装有一个巨大的好处——没准能多给女生重装几次Windows。
</p>
<p>
不过，重装Windows的高手们为了哥们面前神侃时不露怯，基本上还要玩过点一般人玩不转的GNU/Linux。我想，工科男生们的Linux情结，怕有不少是因此而生。然而凡事不易，玩Linux是要自己改配置文件的，这倒是根硬骨头。
</p>
<p>
骨头硬的重要原因么，编辑器不顺手。在那没有Ubuntu的年代里，谁要是折腾几个晚上装好一台Linux的小白肉鸡，会发现可用的编辑器只有Vim。这玩意和Windows的记事本、Dos的edit相比简直就是个怪胎。这一点想必Emacser也深有感触吧，进到Vim里面若是不懂命令，肯定是在一阵滴滴滴过后连一个字母都敲不到屏幕上。
</p>
<p>
当装机圣手们的情商智商普遍被挑战了以后，大致是迅速分化为两派——啃骨头派和换骨头派。啃派如我，继续捏着脚适应Vim的小鞋；换派不用说也能猜到，自然是鞋也不要就转身踏入了Emacs阵营——在那边起码知道怎么打字。
</p>
<p>
按说天朝对于西方的编辑器圣战应该是打酱油的态度，但实际情况是，啃派和换派俨然形成了自己的圣战副本。
</p>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （Vim篇） </h3>
<div class="outline-text-3" id="text-2">
<p>
那段时间作为Vim啃派，我和许多队友一样有个自恃甚高的理由来支持Vim：编辑时击键次数最少。但是私下里想想，这个理由多少有些往脸上贴金。
</p>
<p>
其实Vim用多了以后，并不只是臣服于高效，更多的是手指头上瘾。用我们运动神经控制的行话来说，Vimer的大脑已经被触觉感官和运动神经一起绑架了。那些用手指肌肉记住的命令，执行起来基本不怎么过脑子。而且一旦命令执行成功，脑中还会生成大量“多巴胺”以示奖励。
</p>
<p>
看过《生活大爆炸》的应该都有印象，Leslie夜晚敲Leonard的门，只不过是为了缓解自己多巴胺分泌过剩……所以Vimer生存在这样一种状态下：只要不用hjkl这种奇怪的击键来移动光标，就会流着眼泪打着呵欠思念不已；反过来一旦用上了hjkl，那就等于在重复《生活大爆炸》里面那种神经感受。你说像在嗑药也行。
</p>
<p><img src="https://dea.googlecode.com/svn/trunk/screenshots/vim_tbbt.png"/></p>
<p>
Vim瘾上身之后必然产生一个愿望，那就是以嗑药的方式，额，以Vim的方式来操作所有的软件。很不幸，持有这种愿望的啃派们几乎都会发现，就算骨头啃下来了，它也是打狗不能的。
</p>
<p>
首先，想替小家碧玉Vim扩展出十八般武艺，这个基本上真的很难。难的根本原因是Vim给用户预留的扩展能力先天不足。Vim的设计者压根没考虑把它做成一个放之四海而皆准的巨无霸，所以Vim打从娘胎里出来时在胃口上就不太给力。
</p>
<p>
既然此路不通，那只好另求变法。为了让啃骨头时攒下的功夫不至于荒废，能不能对其他软件的键盘操作方式动动刀，让它们起码和Vim敲起来差不多？这也很难。虽然软件的操作方式通常可以自定义，但自定义的途径大多是修改键位绑定。这种途径有个与生俱来的短板，它并不能区分出Vim里的“命令模式”和“编辑模式”。不巧的是，这种模式区分恰恰是Vim操作方式的核心。说到底，要想在其他软件里面模拟Vim，基本上等同于重新开发一遍。所以这么多年我只见到Firefox的Vimperator插件做到了在宿主软件（Firefox）中对Vim几乎完全模拟（当然有若干Chrome和Visual Studio的插件也可以部分模拟Vim，但个人意见它们的“类Vim”程度都还差得远）。而且现如今浏览器混战成这个样子，哪个插件都恨不得全机种通吃，但Vimperator却丝毫没有往其他浏览器上移植的意思。这也从某种意义上证明模拟Vim不是件容易的事。
</p>
<p>
折腾这一大圈，发现一个无奈而不争的事实：Vim由于太过婉约，终归没有可能升任管家。意思就是不可能让所有软件用起来都像是在操作Vim一样。所以我只好把Vim养在硬盘里没事绣绣花打打字，而让管家这个肥缺虚位以待。转机出现在某一天，那天后知后觉的看到了一个老掉牙的故事，福特汽车的创始人亨利福特说，在汽车发明以前如果你问消费者想要什么，他们会说想要跑得更快的马。苹果的乔大爷也总是拿这个故事来说事，意思就是我苹果这才叫真正抓住了问题的核心——（出门人）要的未必是马，而是快；（iPhone粉丝）要的未必是多任务，而是上网的时候还能听个小曲。
</p>
<p>
这个产品设计的例子启发在哪？在我看来，当一个愿望被挖出来以后，不见得需要照本宣科才能满足这个愿望。如果换个解法还能满足，那说明你hit the button了。换句话说，当引子出来后，故事往下怎么续是文无定法的。
</p>
<p>
回到眼前这个事上，啃骨头派的愿望是用Vim的操作方式来一统江湖，不过果真非得“用Vim的方式”吗？恐怕重点还是“一桶浆糊”吧。玩电脑的都是懒人，懒人有个癖好叫“Don’t repeat yourself”，如果谁弄出一套比较高效的键盘操作方式，能让我学一次以后就不用再学了，那就暂时去tnnd的门派。
</p>
<p>
用个比方来做总结，Vim实在是精致独特得有点像个林妹妹。但谁要是希望家里也有个林妹妹，光把自家丫头照着绣像打扮打扮是不行的，必须从零开始养成一个。而且就算真能养出来个“天上掉下来”一般的可人儿，管家婆的位置仍然没她的份。
</p>
</div>
</div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3"><span class="section-number-3">3</span> 钗黛双收：若你也同Vim难割舍，却又看Emacs情切切 （Emacs篇，结局） </h3>
<div class="outline-text-3" id="text-3">
<p>一旦破除了心理障碍，在Vim之外寻求“管家婆”的人选也就不算作倒戈了。电影《社交网络 The Social Network》里面有这样一个镜头，在扎克伯格同学悲愤不已，要把女生头像和畜生猪狗一起打分时，他来了句“有必要重启Emacs，修改代码”。这个杜撰的场景告诉我们，IT巨星再怎么胸怀壮志，始于足下的不过是手指另一端连着的编辑器。当geek们叫嚣要在世界上留下一个痕迹（make a dent in the universe）的时候，手里常常拎着一把折凳，折凳背面写着——Emacs。
</p>
<p><img src="https://dea.googlecode.com/svn/trunk/screenshots/emacs_the_social_network.png"/></p>
<p>
我用Emacs的最初经历和很多Emacser可能稍有不同，但想必都是从跌跌撞撞的青涩回忆开始，最后让Emacs成了一个“全能伴侣”而浑不自知。博士期间，我主要用的工具是Matlab和Visual Studio，这两个工具自带的编辑器与Vim相比都是小白，属于要严重影响心情和智商的那一种。但是，无论是Matlab还是Visual Studio，它们自带的小白编辑器都只有Emacs模式，没有Vim模式(原因如前所述，模拟Vim很难）。这好歹是聊胜于无，而且既然Emacs用户能从中受益，我凭什么不试试。不得不说，如果目的是用统一的键盘操作方式来使用各种软件，Emacs的领地实在是太广了。除了Matlab和Visual Studio这种内部伪装出一部分Emacs的快捷键以外，非常值得一提的是还有一个日本人写的软件Xkeymacs。这玩意干脆把Windows的快捷键全部接管了，直接让所有Windows软件用起来都跟Emacs一个感觉。所以如果你像我一样不得不在Word里面写文稿的话（Neuroscience领域很多教授不是工程背景，只用Word），就知道Xkeymacs让你舒服在哪里了。难怪一个老外在评价的时候说Xkeymacs这个李鬼软件好到让人“心中不安（<a href="http://squizlog.keithpitty.org/archives/2005/02/17/the_power_of_vim.html" target="_blank">disturbingly good</a>）”。
</p>
<p>
搞笑的是，我是直到在Xkeymacs这种替身杂牌军中用熟了Emacs快捷键之后，才开始慢慢尝试Emacs本尊。开始时先把Emacs配成了Matlab IDE，用它搞定了整个博士课题的数据处理，后来又陆续使用了cedet，etag，yasnippet这些扩展，再加上秒杀笔记、日程、Wiki、表格、博文的org-mode……算是把我这个入门级的Hacker武装到了神经末梢。虽然我不像其他Emacser一般可以骄傲的说自己“活在Emacs里”，但若说最近重要的工作成果都是在Emacs上创作出来，这话却是一点也不假。到了这个时候，Emacs已经完全升任管家婆，堪比宝钗再世。如果谁也有似曾相识的回忆，想必可以深刻体会到这样一个比较狗血的剧情，若宝玉能和Emacs一样的宝钗姐姐继续好下去，那完全有希望弄出个明朝版的百度，东山再起。
</p>
<p>
可是作为Vim的死忠，对于手掌几乎不挪窝的向往，那是消失不掉的。
</p>
<p>
坊间对于Emacs有一条经典评语，说Emacs是“伪装成编辑器的操作系统”。言下之意就是Emacs什么都能做（包括经典的<a href="http://www.emacswiki.org/emacs/CoffeeMode" target="_blank">煮咖啡</a>）。既然Emacs都神通成瑞士军铲了，何不另辟蹊径，用军铲削出一个Vim呢？西方到底是计算机技术的始作俑者，对Emacs这种恐龙级工具而言，能被摆弄的四十年来都被摆弄一遍了。所以只要放狗一搜，就会发现Emacs居然自带Vim模拟，名叫viper-mode。而且为了让viper-mode更像Vim，还有第三方开发了一套叫做vimpulse的增强包。也就是说，只要下载一个vimpulse.el脚本，丢到Emacs的启动路径中，它就可以几乎完美的模拟Vim！
</p>
<p>
写到这里，折腾的两条主线已在此收敛，引发“圣战”的两大神器也已经被和谐进了同一个窗口。再往下就该写些技术笔记和心得回顾，不在这篇的目的之内，因此应该歇笔了。如果要问我到底是在用Emacs还是在用Vim，或问哪一方赢得了我的选择？我也不知道。每当想写点程序、调段脚本、码点wiki、记记笔记的时候，我用的都是Emacs提供的外加自己用eLisp扩展出的功能；但是当码出来的东西让人不爽，需要浏览、修改和整理的时候，手指弹出的又都是Vim的命令。
</p>
<p>
回到最开始说的，若是你用电脑要做的事和我差不多，而且也觉得用键盘工作是很爽的一件事，那就应该试试Emacs+Vim双修。道理很简单，假如你是包工头，而Emacs和Vim是两位身手不凡的应聘者，那么当然应该是两个都收了而后“择其善者而从之”，这才是对自家生意负责。不过对选编辑器如选媳妇的人来说，两大神器双修在手，尽在此一句：
</p>
<p>
惘于环肥燕瘦，颦怅蹙茫
</p>
<p>
哪比举钗盈黛，牵黄擎苍？
</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/vimvsemacs.htm' t='钗黛双收：若你也同Vim难割舍，却又看Emacs情切切' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/vimvsemacs.htm/feed</wfw:commentRss>
		<slash:comments>95</slash:comments>
		</item>
		<item>
		<title>GNU Emacs的终极扩展管理工具 &#8212; el-get</title>
		<link>http://emacser.com/el-get.htm</link>
		<comments>http://emacser.com/el-get.htm#comments</comments>
		<pubDate>Fri, 21 Jan 2011 02:52:23 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>

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

Let&#8217;s el-get together

通常我们在配置GNU Emacs的时候，都会安装一些第三方的lisp扩展来让GNU Emacs用起来更顺手，但是这些第三方lisp扩展的安装、升级和配置的方法各异，通常我们需要使用多种完全不同管理方式的lisp扩展（http直接下载，发行版包管理器下载，版本控制器下载等）。这样我们升级或者迁移的时候就可能会遇到各种麻烦。
GNU Emacs一直以来都缺少一个统一的第三方lisp扩展管理器，GNU XEmacs与GNU Emacs的一个区别就是它有一个统一的第三方包管理工具。这其中的原因主要是因为GNU Emacs是GNU Project的一个重要代表，它要求随它发行的所有lisp都要作者签名用GPL授权给FSF，但是并不是所有的作者都支持GPL，而且这个过程给第三方贡献增加了不少阻碍。所以当时就有一批开发者开发了GNU XEmacs。所以GNU Emacs一直到现在也没有引入官方的扩展管理工具（指的是当前的稳定版本，ELPA已经被合并到当前的开发分支了）。
当前第三方包管理方法

emacswiki有auto-install.el之类的管理工具
linux发行版的包管理（如debian的lisp包）
tromey写的package.el
手工使用git之类的版本控制工具来管理lisp扩展
直接下载

当前这些方法的不足之处

elpa可以管理当前大多数第三方扩展，但是仍然有很多不在里面
手工管理，升级太麻烦，迁移也不方便
linux发行版的包管理，通常你用不了最新的扩展，而且迁移也挺麻烦
开发分支的ELPA，不要认为GNU Emacs会放弃原来的授权方式，要进入官方ELPA估计和现在没有什么区别，仍然有很多作者不会把自己的代码交给FSF。不过也会有第三方ELPA。

el-get华丽登场
el-get简介

el-get能够透明的管理各种来源的第三方扩展（不管你是通过linux发行版获取，还是直接下载还是通过git等版本控制器获取的）
el-get能够安装，升级和移除它管理的第三方扩展
el-get支持安装后的初始化操作，支持hook操作
el-get支持扩展包man和info的安装，安装好后，你可以直接C-h i查看info
el-get的源描述文件（recipe）超级简单，可以轻松添加自己的扩展源
el-get支持异步和同步安装和初始化
el-get支持ELPA中的所有package安装，ELPA是它的一种安装方法。。。

安装el-get
el-get的作者参考和ELPA的package.el的做法，使得el-get的安装非常简单:

?View Code LISP;; So the idea is that you copy/paste this code into your *scratch* buffer,
;; hit C-j, and you have a working el-get.
&#40;url-retrieve
 &#34;https://github.com/dimitri/el-get/raw/master/el-get-install.el&#34;
 &#40;lambda &#40;s&#41;
   &#40;end-of-buffer&#41;
   &#40;eval-print-last-sexp&#41;&#41;&#41;

复制上面的代码到scratch中，移动光标到最后，按下C-j然后就可坐等安装完成了。
使用el-get
el-get的作者是debian developer，所以el-get有深深的apt-get烙印。其实我还觉得el-get很有gentoo portage的影子，直接描诉扩展包地址，然后直接下载安装。
安装扩展
接下来就是最激动人心的时刻了，让我们先用magit、package和auto-complete来演示el-get的几个功能。
对于el-get本身，你需要给它手动指定load-path，因为启动的时候需要先载入它的功能，然后才能通过它来安装和管理其他lisp扩展。
当然在你刚安装玩el-get还没有重启GNU Emacs之前，你是可以直接使用它的功能的。

?View Code LISP&#40;setq el-get-sources
  [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://vmlinz.is-programmer.com/" target="_blank"><span style="color: #0000ff;"><b>Nick Qi</b></span></a></p>
<blockquote>
<p>Let&#8217;s el-get together</p>
</blockquote>
<p>通常我们在配置GNU Emacs的时候，都会安装一些第三方的lisp扩展来让GNU Emacs用起来更顺手，但是这些第三方lisp扩展的安装、升级和配置的方法各异，通常我们需要使用多种完全不同管理方式的lisp扩展（http直接下载，发行版包管理器下载，版本控制器下载等）。这样我们升级或者迁移的时候就可能会遇到各种麻烦。<span id="more-41801"></span></p>
<p>GNU Emacs一直以来都缺少一个统一的第三方lisp扩展管理器，GNU XEmacs与GNU Emacs的一个区别就是它有一个统一的第三方包管理工具。这其中的原因主要是因为GNU Emacs是GNU Project的一个重要代表，它要求随它发行的所有lisp都要作者签名用GPL授权给FSF，但是并不是所有的作者都支持GPL，而且这个过程给第三方贡献增加了不少阻碍。所以当时就有一批开发者开发了GNU XEmacs。所以GNU Emacs一直到现在也没有引入官方的扩展管理工具（指的是当前的稳定版本，ELPA已经被合并到当前的开发分支了）。</p>
<h3>当前第三方包管理方法</h3>
<ul>
<li><a href="http://www.emacswiki.org/">emacswiki</a>有auto-install.el之类的管理工具</li>
<li>linux发行版的包管理（如debian的lisp包）</li>
<li>tromey写的<a href="http://tromey.com/elpa/index.html">package.el</a></li>
<li>手工使用git之类的版本控制工具来管理lisp扩展</li>
<li>直接下载</li>
</ul>
<h3>当前这些方法的不足之处</h3>
<ul>
<li>elpa可以管理当前大多数第三方扩展，但是仍然有很多不在里面</li>
<li>手工管理，升级太麻烦，迁移也不方便</li>
<li>linux发行版的包管理，通常你用不了最新的扩展，而且迁移也挺麻烦</li>
<li>开发分支的ELPA，不要认为GNU Emacs会放弃原来的授权方式，要进入官方ELPA估计和现在没有什么区别，仍然有很多作者不会把自己的代码交给FSF。不过也会有第三方ELPA。</li>
</ul>
<h3>el-get华丽登场</h3>
<h4>el-get简介</h4>
<ul>
<li>el-get能够透明的管理各种来源的第三方扩展（不管你是通过linux发行版获取，还是直接下载还是通过git等版本控制器获取的）</li>
<li>el-get能够安装，升级和移除它管理的第三方扩展</li>
<li>el-get支持安装后的初始化操作，支持hook操作</li>
<li>el-get支持扩展包man和info的安装，安装好后，你可以直接<em>C-h i</em>查看info</li>
<li>el-get的源描述文件（recipe）超级简单，可以轻松添加自己的扩展源</li>
<li>el-get支持异步和同步安装和初始化</li>
<li>el-get支持ELPA中的所有package安装，ELPA是它的一种安装方法。。。</li>
</ul>
<h4>安装el-get</h4>
<p>el-get的作者参考和ELPA的package.el的做法，使得el-get的安装非常简单:</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('p41801code21'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4180121"><td class="code" id="p41801code21"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; So the idea is that you copy/paste this code into your *scratch* buffer,</span>
<span style="color: #808080; font-style: italic;">;; hit C-j, and you have a working el-get.</span>
<span style="color: #66cc66;">&#40;</span>url-retrieve
 <span style="color: #ff0000;">&quot;https://github.com/dimitri/el-get/raw/master/el-get-install.el&quot;</span>
 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">&#40;</span>end-of-buffer<span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">&#40;</span>eval-print-last-sexp<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>复制上面的代码到<em>scratch</em>中，移动光标到最后，按下<code>C-j</code>然后就可坐等安装完成了。</p>
<h4>使用el-get</h4>
<p>el-get的作者是debian developer，所以el-get有深深的apt-get烙印。其实我还觉得el-get很有gentoo portage的影子，直接描诉扩展包地址，然后直接下载安装。</p>
<h5>安装扩展</h5>
<p>接下来就是最激动人心的时刻了，让我们先用<em>magit</em>、<em>package</em>和<em>auto-complete</em>来演示el-get的几个功能。</p>
<p>对于<em>el-get</em>本身，你需要给它手动指定<em>load-path</em>，因为启动的时候需要先载入它的功能，然后才能通过它来安装和管理其他lisp扩展。</p>
<p>当然在你刚安装玩el-get还没有重启GNU 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('p41801code22'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4180122"><td class="code" id="p41801code22"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> el-get-sources
      '<span style="color: #66cc66;">&#40;</span>el-<span style="color: #b1b100;">get</span>
      package
      auto-complete
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #b1b100;">name</span> magit
      <span style="color: #66cc66;">:</span><span style="color: #555;">after</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-x C-z&quot;</span><span style="color: #66cc66;">&#41;</span> 'magit-status<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>el-<span style="color: #b1b100;">get</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>复制上面的代码到<em>scratch</em>buffer，光标移动到buffer最后，键入<em>C-j</em>执行lisp代码。这样el-get、package、auto-complete和magit就被安装到~/.emacs.d/el-get目录下了。而且magit包在安装好后还执行了一个按键绑定操作，同样你也可以在任何需要配置的扩展后面使用定制函数。</p>
<h5>初始化扩展</h5>
<p>el-get还可以帮助你方便的初始化GNU Emacs扩展，在每个source描诉的:after后面可以放上自己的初始化函数，就像上面的magit那样。</p>
<p>通常<code>(el-get)</code>是异步执行的，所以如果你的扩展之间有依赖关系，它的初始化过程可能就会失败，所以为了方便大家写扩展包的初始化函数，作者给<code>(el-get)</code>增加了两种同步 <br />
方式：</p>
<ul>
<li>(el-get &#8217;sync) 完全同步，初始化的顺序严格按照el-get-sources中的顺序完成</li>
<li>(el-get &#8216;wait) 初始化过程异步，可以多个source同时初始化，但会等待整个初始化完成</li>
</ul>
<h5>交互式命令接口</h5>
<ul>
<li>el-get-cd 用dired切换到指定package的文件夹</li>
<li>el-get-install 根据用户设定的el-get-sources变量中的package来指定安装其中一个</li>
<li>el-get-update 升级指定的package</li>
<li>el-get-update-all 升级el-get-sources中的所有package，慎用</li>
<li>el-get-remove 删除已经安装而且在el-get-sources中的某个package</li>
<li>加上<code>C-u</code>前缀的时候，el-get-install和el-get-remove是可以操作仓库中的所有package</li>
</ul>
<h5>定制和贡献</h5>
<ul>
<li>el-get支持本地扩展包仓库，参考el-get-recipe-path变量</li>
<li>参考package描述文件的文档，对仓库中的package进行定制，可以改变来源、构建命令、 初始化函数。。。</li>
<li>参考el-get-methods的文档，给el-get增加更多的安装来源支持</li>
<li>贡献package描述文件（package recipe），添加你喜欢的package</li>
<li>使用并报告bug，或者要求增加新的特性</li>
<li>让更多的人用上el-get</li>
</ul>
<h3>资源和链接</h3>
<ul>
<li>el-get github地址: <a href="https://github.com/dimitri/el-get">https://github.com/dimitri/el-get</a></li>
<li>el-get 作者blog: <a href="http://tapoueh.org/news.dim.html">http://tapoueh.org/news.dim.html</a></li>
<li>我的el-get分支: <a href="https://github.com/vmlinz/el-get">https://github.com/vmlinz/el-get</a></li>
</ul>

<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/el-get.htm' t='GNU Emacs的终极扩展管理工具 &amp;#8212; el-get' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/el-get.htm/feed</wfw:commentRss>
		<slash:comments>35</slash:comments>
		</item>
		<item>
		<title>Org-mode写作的几个快捷方式</title>
		<link>http://emacser.com/org-mode-tricks.htm</link>
		<comments>http://emacser.com/org-mode-tricks.htm#comments</comments>
		<pubDate>Tue, 11 Jan 2011 03:00:18 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[Org Mode]]></category>
		<category><![CDATA[中级]]></category>

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

GNU Emacs 一直以来就是一个写作的利器。从最初的 text-mode， muse-mode，直到今天的 org-mode，Emacs 下的写作正在变得越来越舒适，越来越具有表现力。尤其是现在的 org-mode，不仅可以 GTD，可以记笔记，甚至已经达到了“只有想不到的，没有做不到的”的境地。就连 Emacser 的各位童鞋们也都在使用 org-mode 进行写作。


但是，不管到了什么时候，懒惰总是一个亘古不变的真理。懒得大发的时候，就会觉得只有把大饼套在脖子上这样的日子才是最舒服的。所以呢今天就和大家分享几个使用 org-mode 写作时候常用的偷懒的方式。


org-mode 的日常操作其实已经足够方便了。标签式的书写方式效率要远高于菜单式的书写方式（例如 Word 或者现在的 WPS）。同时由于 Emacs 的强大和灵活，使得 org-mode 在古老的标签式书写的方式下，一定程度上实现了所见即所得的效果。但是，总有一些标签，由于太长，太常出现，还是难免成为写作时候的负担。这种负担不仅仅表现在输入工作量的增加上，由于很多标签是要成对出现的，配对的缺失和对这些缺失的检查和修补真可以称得上是世上最痛苦同时又最没有价值的负担。例如引用代码、样例的标签， #+begin_src #+end_src ， #+BEGIN_EXAMPLE #+END_EXAMPLE 等等 。特别是在技术类文章里面，经常需要大量引用样例、代码等等内容的时候，真的会变成“是可忍孰不可忍”了。


解决这个问题，基本上有两套解决方案。一个方案是 abbrev + skeleton，一个方案就是 eLisp code 了。这两种方案无所谓孰优孰劣，只是各自解决不同的问题。指导思想都是一样的，那就是让 Emacs 去操心输入和配对儿的事情。凡事只要不用人去操心了，我们就可以暂时认为这事儿就不存在了。




1 skeleton 

1.1 iexp 
1.2 isrc 
1.3 iprop 
1.4 ihtml 


2 eLisp 

2.1 iexp 
2.2 isrc [...]]]></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>
GNU Emacs 一直以来就是一个写作的利器。从最初的 text-mode， muse-mode，直到今天的 org-mode，Emacs 下的写作正在变得越来越舒适，越来越具有表现力。尤其是现在的 org-mode，不仅可以 GTD，可以记笔记，甚至已经达到了“只有想不到的，没有做不到的”的境地。就连 Emacser 的各位童鞋们也都在使用 org-mode 进行写作。
</p>
<p>
但是，不管到了什么时候，懒惰总是一个亘古不变的真理。懒得大发的时候，就会觉得只有把大饼套在脖子上这样的日子才是最舒服的。所以呢今天就和大家分享几个使用 org-mode 写作时候常用的偷懒的方式。<span id="more-41795"></span>
</p>
<p>
org-mode 的日常操作其实已经足够方便了。标签式的书写方式效率要远高于菜单式的书写方式（例如 Word 或者现在的 WPS）。同时由于 Emacs 的强大和灵活，使得 org-mode 在古老的标签式书写的方式下，一定程度上实现了所见即所得的效果。但是，总有一些标签，由于太长，太常出现，还是难免成为写作时候的负担。这种负担不仅仅表现在输入工作量的增加上，由于很多标签是要成对出现的，配对的缺失和对这些缺失的检查和修补真可以称得上是世上最痛苦同时又最没有价值的负担。例如引用代码、样例的标签， <code>#+begin_src</code> <code>#+end_src</code> ， <code>#+BEGIN_EXAMPLE</code> <code>#+END_EXAMPLE</code> 等等 。特别是在技术类文章里面，经常需要大量引用样例、代码等等内容的时候，真的会变成“是可忍孰不可忍”了。
</p>
<p>
解决这个问题，基本上有两套解决方案。一个方案是 abbrev + skeleton，一个方案就是 eLisp code 了。这两种方案无所谓孰优孰劣，只是各自解决不同的问题。指导思想都是一样的，那就是让 Emacs 去操心输入和配对儿的事情。凡事只要不用人去操心了，我们就可以暂时认为这事儿就不存在了。
</p>
<div id="table-of-contents">
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 skeleton </a>
<ul>
<li><a href="#sec-1_1">1.1 iexp </a></li>
<li><a href="#sec-1_2">1.2 isrc </a></li>
<li><a href="#sec-1_3">1.3 iprop </a></li>
<li><a href="#sec-1_4">1.4 ihtml </a></li>
</ul>
</li>
<li><a href="#sec-2">2 eLisp </a>
<ul>
<li><a href="#sec-2_1">2.1 iexp </a></li>
<li><a href="#sec-2_2">2.2 isrc </a></li>
<li><a href="#sec-2_3">2.3 ihtml </a></li>
<li><a href="#sec-2_4">2.4 base function </a></li>
<li><a href="#sec-2_5">2.5 i= </a></li>
</ul>
</li>
<li><a href="#sec-3">3 后记  Export 中遇到问题 </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-3">
<h3 id="sec-1"><span class="section-number-3">1</span> skeleton </h3>
<div class="outline-text-3" id="text-1">
<p>
Skeleton 作为一种 <a href="http://www.gnu.org/software/emacs/manual/html_node/autotype/index.html">自动输入</a> 的好方法，主要解决的是白纸一张时候的问题，解决的思路是化繁为简。通过预先定义好的 Skeleton，将复杂、易错的配对标签替换为简短、易记的 Skeleton 标签，在输入的一开始就确保一切都井然有序，包括光标位置都让它正确定位，当标签不再需要人工配对的时候，配对就可以认为不再是个问题了。
</p>
<p>
当然你也可以用 yasnippets 或者其他类似的工具。用 Skeleton 的目的只是因为它简单、直接。下面让我们看几个例子：
</p>
</div>
<div id="outline-container-1_1" class="outline-4">
<h4 id="sec-1_1"><span class="section-number-4">1.1</span> iexp </h4>
<div class="outline-text-4" id="text-1_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('p41795code32'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179532"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p41795code32"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-skeleton 1exp 
  <span style="color: #ff0000;">&quot;Input #+BEGIN_EXAMPLE #+END_EXAMPLE in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #ff0000;">&quot;#+BEGIN_EXAMPLE<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #ff0000;">&quot;#+END_EXAMPLE&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev org-mode-abbrev-table <span style="color: #ff0000;">&quot;iexp&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> '1exp<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
这个 Skeleton 解决的是 <code>#+BEGIN_EXAMPLE</code> <code>#+END_EXAMPLE</code> 标签的问题。通过上面这个 Skeleton，只要在 org-mode 的 buffer 里面输入 iexp，就会自动扩展成 org-mode 的样例片段，就像下面这样，同时把光标自动定位在两行内容的中间，等待你的进一步输入。
</p>
<pre class="example">
#+BEGIN_EXAMPLE

#+END_EXAMPLE
</pre>
</div>
</div>
<div id="outline-container-1_2" class="outline-4">
<h4 id="sec-1_2"><span class="section-number-4">1.2</span> isrc </h4>
<div class="outline-text-4" id="text-1_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('p41795code33'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179533"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p41795code33"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-skeleton 1src 
  <span style="color: #ff0000;">&quot;Input #+begin_src #+end_src in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #ff0000;">&quot;#+begin_src lisp <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #ff0000;">&quot;#+end_src&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev org-mode-abbrev-table <span style="color: #ff0000;">&quot;isrc&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> '1src<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
上面这个 skeleton和 iexp 非常类似， 只是扩展出来的是 org-mode 的代码片段，使用方式是输入 isrc， 同样会把光标定位在两行的中间，等待用户输入代码。
</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('p41795code34'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179534"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41795code34"><pre class="lisp" style="font-family:monospace;">#+begin_src lisp 
&nbsp;
#+end_src</pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-1_3" class="outline-4">
<h4 id="sec-1_3"><span class="section-number-4">1.3</span> iprop </h4>
<div class="outline-text-4" id="text-1_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('p41795code35'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179535"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p41795code35"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-skeleton 1prop 
  <span style="color: #ff0000;">&quot;Input :PROPERTIES: :END: in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #66cc66;">&gt;</span><span style="color: #ff0000;">&quot;:PROPERTIES:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #66cc66;">&gt;</span> _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #66cc66;">&gt;</span><span style="color: #ff0000;">&quot;:END:&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev org-mode-abbrev-table <span style="color: #ff0000;">&quot;iprop&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> '1prop<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
<code> <img src='http://emacser.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ROPERTIES:</code> 属性在 GTD 的时候经常会用到。虽然 org-mode 提供了各种按键组合来输入各种 <code> <img src='http://emacser.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ROPERTIES:</code> ，但是很多时候，直接输入 <code> <img src='http://emacser.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ROPERTIES:</code> 内容显然要比记忆那些复杂的按键组合要容易的多。
</p>
<p>
在这里要注意的是，由于 <code> <img src='http://emacser.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ROPERTIES:</code> 经常与 org-mode 的 heading 一起使用，所以需要考虑到缩进的问题。在这个 Skeleton 定义里面加入的 <code>&gt;</code> 字符，就是为了根据当前使用环境，在扩展的时候进行正确的缩进。使用的时候输入 iprop，可以得到下面的内容
</p>
<pre class="example">
   <img src='http://emacser.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' /> ROPERTIES:

   :END:
</pre>
</div>
</div>
<div id="outline-container-1_4" class="outline-4">
<h4 id="sec-1_4"><span class="section-number-4">1.4</span> ihtml </h4>
<div class="outline-text-4" id="text-1_4">
<pre class="example">
(define-skeleton insert-emacser-code
  ""
  ""
  "#+BEGIN_HTML\n"
"&lt;pre lang=\"lisp\" line=\"1\"&gt;\n"
_"\n"
"&lt;/pre&gt;\n"
"#+END_HTML\n"
)

(define-abbrev org-mode-abbrev-table "ihtml"  "" 'insert-emacser-code)
</pre>
<p>
最后这个 Skeleton 看起来有点复杂了，因为这个不是 org-mode 的默认格式。这个是给 Emacser.com 写稿的时候引用代码片段所需的外框。在写作的时候只要输入 ihtml，就可以扩展成下面的内容 <a name="note" class="target">note</a> 。
</p>
<pre class="example">
#+BEGIN_HTML
&lt;pre lang="lisp" line="1"&gt;

&lt;/pre&gt;
#+END_HTML
</pre>
<p>
上次发稿的时候由于忘记了这个 Skeleton，所有的代码、样例全都写成了 org-mode 默认的标签，完成之后才想起来，然后又手工删除并补写了 Emacser.com 需要的标签，再然后，相信我不说你们也猜的出来了，惨痛的的教训啊！！！ 以后一定要记得用 Skeleton 啊。
</p>
</div>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> eLisp </h3>
<div class="outline-text-3" id="text-2">
<p>
俗话说，“一张白纸好作画”。白纸一张的日子毕竟不会是生活的全部。当纸已经变得不白的时候，当那些代码、样例都已经在那里了的时候，我们总不能当一切的一切都已经“不可挽回”的时候，我们就需要借助 eLisp 的处理能力，让我们在已经选择的道路上面能够走得更好。解决思路，面对现实。承认已经存在的现实，把该补的东西补上去就是了。只要这个活儿是 Emacs 干，不是我们干，那就不是问题。
</p>
</div>
<div id="outline-container-2_1" class="outline-4">
<h4 id="sec-2_1"><span class="section-number-4">2.1</span> iexp </h4>
<div class="outline-text-4" id="text-2_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('p41795code36'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179536"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41795code36"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> iexp <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Enclose example for org-mode&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</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>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;%s %s&quot;</span> beg end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>i-babel-<span style="color: #b1b100;">quote</span> beg end <span style="color: #ff0000;">&quot;#+BEGIN_EXAMPLE&quot;</span> <span style="color: #ff0000;">&quot;#+END_EXAMPLE&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>
这个函数对应于上面的 iexp Skeleton。使用的时候，选中要处理的样例片段，然后输入 <code>M-x iexp</code> ，即可在选中的样例两端加入相应的内容。
</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('p41795code37'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179537"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p41795code37"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require-extensions 'require
 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> 
  'tabbar 
  'switch-window
  'thing-edit
  'second-sel
  'browse-kill-ring+
<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
通过  <code>M-x iexp</code> 命令，就会变成这样的内容
</p>
<pre class="example">
#+BEGIN_EXAMPLE
(require-extensions 'require
 (list
  'tabbar
  'switch-window
  'thing-edit
  'second-sel
  'browse-kill-ring+
))
#+END_EXAMPLE
</pre>
</div>
</div>
<div id="outline-container-2_2" class="outline-4">
<h4 id="sec-2_2"><span class="section-number-4">2.2</span> isrc </h4>
<div class="outline-text-4" id="text-2_2">
<p>
同样的道理应用在 isrc 函数上面。 这个函数对应上面的 isrc skeleton。同样也是选中要处理的样例片段，然后输入 <code>M-x isrc</code> ，即可在选中的样例两端加入相应的内容。在这个里面有一个小小的设计，就是处理完成之后光标会被定位在 <code>#+begin_src</code> 的后面，方便输入编程语言的名称。
</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('p41795code38'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179538"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41795code38"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> isrc <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Enclose code for org-mode&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</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>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;%s %s&quot;</span> beg end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>i-babel-<span style="color: #b1b100;">quote</span> beg end <span style="color: #ff0000;">&quot;#+begin_src &quot;</span> <span style="color: #ff0000;">&quot;#+end_src&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>

</div>
</div>
<div id="outline-container-2_3" class="outline-4">
<h4 id="sec-2_3"><span class="section-number-4">2.3</span> ihtml </h4>
<div class="outline-text-4" id="text-2_3">
<p>
这个 ihtml 函数就是上次给 Emacser.com 写稿的时候用“鲜血”换来的啊。我要是早点儿把这个东西写出来该有多好啊。每次想到这里总会想到胖兔子粥粥说到的 <a href="http://blog.sina.com.cn/s/blog_4731948b0100irxv.html">和拖拉死磕到底</a> 。其实我真正想说的潜台词还是——要是早一点儿能够元旦放假该有多好啊，那样的话我肯定就把这个函数写了么。汗啊。
</p>
<p>
使用方法同样是选中要用的代码，然后输入 <code>M-x ihtml</code> 命令。由于 Emacser.com 的标签行数比较多，这里用了 <code>concat</code> 函数做了处理。
</p>
<pre class="example">
(defun ihtml (St Ed)
  "Enclose code for Emacser.cn"
  (interactive "r")
  (let ((beg St) (end Ed))
    (message "%s %s" beg end)
    (i-babel-quote beg end
         (concat "#+BEGIN_HTML\n " "&lt;pre lang=\"lisp\" line=\"1\"&gt;\n")

         (concat "&lt;/pre&gt;\n" "#+END_HTML\n")
         )))
</pre>
</div>
</div>
<div id="outline-container-2_4" class="outline-4">
<h4 id="sec-2_4"><span class="section-number-4">2.4</span> base function </h4>
<div class="outline-text-4" id="text-2_4">
<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('p41795code39'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179539"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p41795code39"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> i-babel-<span style="color: #b1b100;">quote</span> <span style="color: #66cc66;">&#40;</span>beg end str1 str2<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>goto-char end<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>forward-line <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert str2<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>newline<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>goto-char beg<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>forward-line -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>newline<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert str1<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-2_5" class="outline-4">
<h4 id="sec-2_5"><span class="section-number-4">2.5</span> i= </h4>
<div class="outline-text-4" id="text-2_5">
<p>
最后的最后，再饶一个小小的函数。这个函数是处理行内(inline)代码的。说白了就是在所选文字的首尾加上一组等于号。就这么简单个事情，如果处理的数量多的时候也是一个不小的负担。尤其是当文章已经写好，或者是处理拷贝过来的的内容的时候。
</p>
<p>
使用方法和上面的函数一样，选中所需的内容，然后输入 <code>M-x i=</code> 就一切就都处理完毕了。
</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('p41795code40'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179540"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p41795code40"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> i<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</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>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char end<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;">&#40;</span>goto-char beg<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;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>+ end <span style="color: #cc66cc;">2</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>

</div>
</div>
</div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3"><span class="section-number-3">3</span> 后记  Export 中遇到问题 </h3>
<div class="outline-text-3" id="text-3">
<p>
这篇文章本来是没有后记的，但是我们在输出的时候遇到一些了问题，并且解决掉了这些问题，因此还是有必要把它加进来和大家分享一下的。
</p>
<p>
大家可以看到，在这篇文章里描述了很多 orgmode 的标签。由于Emacser.com 的稿件里面需要用 <code>#+Begine_html</code> 和 <code>&lt;pre&gt;</code> 来把代码和样例括起来，当代码和样例里面本身就含有这样的标签的时候，就会形成嵌套标签的情形。下面就是一个嵌套的例子，这是上文的 Skeleton ihtml <a href="#note">note</a> 样例的源文件。
</p>
<pre class="example">
#+BEGIN_HTML
&lt;pre lang="lisp" line="1"&gt;
#+BEGIN_HTML
&lt;pre lang="lisp" line="1"&gt;

&lt;/pre&gt;
#+END_HTML
&lt;/pre&gt;
#+END_HTML
</pre>
<p>
这些嵌套的内容在输出的时候就会出现混乱。目前在 orgmode 文档的 export options 和 export html 部分都还没有发现关于嵌套标签输出的内容。后来我自己感觉的一个可行的解决办法是将内嵌标签的关键字符替换成 html escape character ，这样 orgmode就不会把他识别为标签，同时又能够保证输出结果在浏览器里的正确表现。就像下面这样。
</p>
<pre class="example">
&amp;#35;+BEGIN_HTML
&amp;lt;pre lang="lisp" line="1"&amp;gt;
&amp;#35;+BEGIN_HTML
&amp;lt;pre lang="lisp" line="1"&amp;gt;

&amp;lt;/pre&amp;gt;
&amp;#35;+END_HTML
&amp;lt;/pre&amp;gt;
&amp;#35;+END_HTML
</pre>
<p>
这种方式的问题主要是需要手工修改的地方多了一些。后来 ahei 提出完全可以把 <code>#+BEGIN_HTML</code> 和 <code>&lt;pre&gt;</code> 的部分去掉，直接使用 <code>:</code> 转义代码/样例本身就行了。
</p>
<pre class="example">
: #+BEGIN_HTML
: &lt;pre lang="lisp" line="1"&gt;
:
: &lt;/pre&gt;
: #+END_HTML
</pre>
<p>
当然还是这种最简单，注意 <code>:</code> 后面的空格。前提是不要  <code>#+BEGIN_HTML</code> 和 <code>&lt;pre&gt;</code> 的标签。
</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/org-mode-tricks.htm' t='Org-mode写作的几个快捷方式' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/org-mode-tricks.htm/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
	</channel>
</rss>

