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

<channel>
	<title>Emacs中文网 &#187; 其他</title>
	<atom:link href="http://emacser.com/c-other.htm/feed" rel="self" type="application/rss+xml" />
	<link>http://emacser.com</link>
	<description>没有我做不到的，只有你想不到的</description>
	<lastBuildDate>Thu, 17 May 2012 14:05:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>使用 Emacs 微博</title>
		<link>http://emacser.com/weibo.htm</link>
		<comments>http://emacser.com/weibo.htm#comments</comments>
		<pubDate>Thu, 17 May 2012 14:05:14 +0000</pubDate>
		<dc:creator>bigclean</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[好玩的]]></category>
		<category><![CDATA[配置]]></category>
		<category><![CDATA[Emacs]]></category>

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

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

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

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

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


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

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



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



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



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


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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41943code2'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p419432"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41943code2"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;目录路径&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>require 'weibo<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/weibo.htm' t='使用 Emacs 微博' d='' tag='Emacs,中级,配置' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/bing.htm" title="在 emacs 中使用 bing translate api 实现高效翻译 (2012年05月12日)">在 emacs 中使用 bing translate api 实现高效翻译</a> (6)</li>
	<li><a href="http://emacser.com/to-emacs-beginner.htm" title="致Emacs初学者 (2009年11月30日)">致Emacs初学者</a> (121)</li>
	<li><a href="http://emacser.com/highlight-tail.htm" title="用性感的尾巴highlight-tail标记最近的修改 (2010年02月26日)">用性感的尾巴highlight-tail标记最近的修改</a> (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 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('p41868code10'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186810"><td class="code" id="p41868code10"><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('p41868code11'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186811"><td class="code" id="p41868code11"><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('p41868code12'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186812"><td class="code" id="p41868code12"><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('p41868code13'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186813"><td class="code" id="p41868code13"><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('p41868code14'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186814"><td class="code" id="p41868code14"><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中的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>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('p41801code17'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4180117"><td class="code" id="p41801code17"><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('p41801code18'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4180118"><td class="code" id="p41801code18"><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>非程序员的Emacs使用心得</title>
		<link>http://emacser.com/non-programmer.htm</link>
		<comments>http://emacser.com/non-programmer.htm#comments</comments>
		<pubDate>Mon, 27 Dec 2010 03:33:42 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[ahei]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[hippie-expand]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[配色]]></category>

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

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




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

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






1 关于写字 


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


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


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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41783code30'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178330"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code30"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> copy-word <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #ff0000;">&quot;Copy words at point into kill-ring&quot;</span>
       <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;P&quot;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>copy-thing 'backward-word 'forward-word arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>paste-to-mark arg<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
Key binding
</p>

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

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41783code32'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178332"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code32"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> copy-line <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #ff0000;">&quot;Save current line into Kill-Ring without mark the line &quot;</span>
       <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;P&quot;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>copy-thing 'beginning-of-line 'end-of-line arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>paste-to-mark arg<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
Key binding
</p>

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

</div>
</div>
<div id="outline-container-4_3" class="outline-4">
<h4 id="sec-4_3"><span class="section-number-4">4.3</span> Copy Paragraph </h4>
<div class="outline-text-4" id="text-4_3">

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41783code34'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178334"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code34"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> copy-paragraph <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #ff0000;">&quot;Copy paragraphes at point&quot;</span>
       <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;P&quot;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>copy-thing 'backward-paragraph 'forward-paragraph arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>paste-to-mark arg<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
Key binding
</p>

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

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41783code36'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178336"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p41783code36"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> beginning-of-string<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;  &quot;</span>
       <span style="color: #66cc66;">&#40;</span>re-search-backward <span style="color: #ff0000;">&quot;[ <span style="color: #000099; font-weight: bold;">\t</span>]&quot;</span> <span style="color: #66cc66;">&#40;</span>line-beginning-position<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>looking-at <span style="color: #ff0000;">&quot;[<span style="color: #000099; font-weight: bold;">\t</span> ]&quot;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> end-of-string<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot; &quot;</span>
       <span style="color: #66cc66;">&#40;</span>re-search-forward <span style="color: #ff0000;">&quot;[ <span style="color: #000099; font-weight: bold;">\t</span>]&quot;</span> <span style="color: #66cc66;">&#40;</span>line-end-position<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">3</span> arg<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>looking-back <span style="color: #ff0000;">&quot;[<span style="color: #000099; font-weight: bold;">\t</span> ]&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>- <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span>
&nbsp;
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> thing-copy-string-to-mark<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot; Try to copy a string and paste it to the mark
     When used in shell-mode, it will paste string on shell prompt by default &quot;</span>
       <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;P&quot;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>copy-thing 'beginning-of-string 'end-of-string arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>paste-to-mark arg<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
Key binding
</p>

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

</div>
</div>
<div id="outline-container-4_5" class="outline-4">
<h4 id="sec-4_5"><span class="section-number-4">4.5</span> Copy Parenthesis </h4>
<div class="outline-text-4" id="text-4_5">
<p>
Similar with new copy string to mark
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41783code38'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178338"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p41783code38"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> beginning-of-parenthesis<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;  &quot;</span>
       <span style="color: #66cc66;">&#40;</span>re-search-backward <span style="color: #ff0000;">&quot;[[&lt;(?<span style="color: #000099; font-weight: bold;">\&quot;</span>]&quot;</span> <span style="color: #66cc66;">&#40;</span>line-beginning-position<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">3</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>looking-at <span style="color: #ff0000;">&quot;[[&lt;(?<span style="color: #000099; font-weight: bold;">\&quot;</span>]&quot;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>+ <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> end-of-parenthesis<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot; &quot;</span>
       <span style="color: #66cc66;">&#40;</span>re-search-forward <span style="color: #ff0000;">&quot;[]&gt;)?<span style="color: #000099; font-weight: bold;">\&quot;</span>]&quot;</span> <span style="color: #66cc66;">&#40;</span>line-end-position<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">3</span> arg<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>looking-back <span style="color: #ff0000;">&quot;[]&gt;)?<span style="color: #000099; font-weight: bold;">\&quot;</span>]&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>- <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span>
&nbsp;
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> thing-copy-parenthesis-to-mark<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot; Try to copy a parenthesis and paste it to the mark
     When used in shell-mode, it will paste parenthesis on shell prompt by default &quot;</span>
       <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;P&quot;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>copy-thing 'beginning-of-parenthesis 'end-of-parenthesis arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>paste-to-mark arg<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
Key binding
</p>

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

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41783code40'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178340"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code" id="p41783code40"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> get-point <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">symbol</span> <span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #ff0000;">&quot;get the point&quot;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> <span style="color: #b1b100;">symbol</span> arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span>
&nbsp;
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> copy-thing <span style="color: #66cc66;">&#40;</span>begin-of-thing end-of-thing <span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;copy thing between beg &amp; end into kill ring&quot;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg <span style="color: #66cc66;">&#40;</span>get-point begin-of-thing <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>end <span style="color: #66cc66;">&#40;</span>get-point end-of-thing arg<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>copy-region-as-kill beg end<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span>
&nbsp;
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> paste-to-mark<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;Paste things to mark, or to the prompt in shell-mode&quot;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>pasteMe 
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;shell-mode&quot;</span> major-mode<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span> <span style="color: #66cc66;">&#40;</span>comint-next-prompt <span style="color: #cc66cc;">25535</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>yank<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span> <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>mark<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>yank<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> arg
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> arg <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #b1b100;">nil</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> pasteMe<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> pasteMe<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
实际上最终写成现在这个结构也是很多次重复之后才学会的。所以编写自己的扩展函数的时候也是很好的学习 Emacs，学习 eLisp 的时候。俗话说，生活就是一个星期日，接着另一个星期日…… Emacs 就是一个改变，接着另一个改变…… 基本上，每一个星期日，我的 Emacs 都在改变。
</p>
</div>
</div>
</div>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/non-programmer.htm' t='非程序员的Emacs使用心得' d='' tag='ahei,Emacs,hippie-expand,lambda,org,windows,光标,配色' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</li>
	<li><a href="http://emacser.com/icicles-doremi-palette.htm" title="&#8220;色向胆边生&#8221; － 记Emacs配色的超级武器：Icicles，Color Palette和DoReMi (2009年11月19日)">&#8220;色向胆边生&#8221; － 记Emacs配色的超级武器：Icicles，Color Palette和DoReMi</a> (17)</li>
	<li><a href="http://emacser.com/to-emacs-beginner.htm" title="致Emacs初学者 (2009年11月30日)">致Emacs初学者</a> (121)</li>
	<li><a href="http://emacser.com/mew.htm" title="用Mew收发邮件 (2010年05月21日)">用Mew收发邮件</a> (86)</li>
	<li><a href="http://emacser.com/built-in-cedet.htm" title="用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET (2010年05月10日)">用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET</a> (99)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/non-programmer.htm/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Emacs中绘图 － ditaa篇</title>
		<link>http://emacser.com/emacs-ditaa.htm</link>
		<comments>http://emacser.com/emacs-ditaa.htm#comments</comments>
		<pubDate>Tue, 03 Aug 2010 19:19:11 +0000</pubDate>
		<dc:creator>fangzhzh</dc:creator>
				<category><![CDATA[Org Mode]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[初级]]></category>
		<category><![CDATA[好玩的]]></category>
		<category><![CDATA[artist-mode]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[ditaa]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[erc]]></category>
		<category><![CDATA[graphviz]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[matlab]]></category>
		<category><![CDATA[muse-mode]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[wiki-mode]]></category>
		<category><![CDATA[配色]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41470</guid>
		<description><![CDATA[
Fast,Cheap,Good: Choose any two.
                                  --anonymous.





1 emacs中的图 
2 应用场景 
3 ASCII图 
4 简单框图 
5 着色 
6 完整而优雅的图案 
7 中文 
8 ditaa 
9 不算小结的小结 [...]]]></description>
			<content:encoded><![CDATA[<div>
<pre>Fast,Cheap,Good: Choose any two.
                                  --anonymous.
</pre>
<div>
<div>
<p><img class="alignright" src="screenshots/ditaa-logo.png" alt="ditaa"/></p>
<ul>
<li><a href="#sec-1">1 emacs中的图 </a></li>
<li><a href="#sec-2">2 应用场景 </a></li>
<li><a href="#sec-3">3 ASCII图 </a></li>
<li><a href="#sec-4">4 简单框图 </a></li>
<li><a href="#sec-5">5 着色 </a></li>
<li><a href="#sec-6">6 完整而优雅的图案 </a></li>
<li><a href="#sec-7">7 中文 </a></li>
<li><a href="#sec-8">8 ditaa </a></li>
<li><a href="#sec-9">9 不算小结的小结 </a></li>
</ul>
</div>
</div>
<div class="outline-3">
<h3 id="sec-1"><span class="section-number-3">1</span> emacs中的图</h3>
<div class="outline-text-3">
<p>emacs用途多多，编辑代码、文档、演示文稿，记日志等等。在这些应用中有一个共同点，也是广大emacser很可能需要的一点功能，画图，对于大多数使用emacs的都是死宅死宅技术男，主要的用途还就是流程图，框图之流。<span id="more-41470"></span></p>
<p><a href="http://en.wikipedia.org/wiki/A_picture_is_worth_a_thousand_words" target="_blank">一图胜千言</a> <sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup> ，图能够用简单的方式表达出可能需要很复杂的语言才能描述清的想法。一个广泛的认识就是人更容易理解图片。人们喜欢玩界面华丽的游戏，而同样的游戏如果是文本的，就会让人失去兴趣。一篇博客如果内容较多，有那么几张图片，怎么也会比全部长篇的文字要容易阅读。</p>
<p>那么emacs如何来插入一个给力的图片呢？</p>
<p>使用<a href="http://www.latex-project.org/" target="_blank">Latex</a>的graphicx包。<a href="http://www.latex-project.org/" target="_blank">Latex</a>的排版与图片功能相当的强大，但是它的门槛更高，使用比较复杂，应用场合主要在科学论文。一般的应用，博客，日志啥的话，投入产出比太低了。</p>
<p><a href="http://mwolson.org/projects/EmacsWikiMode.html" target="_blank">wiki-mode</a>,<a href="http://mwolson.org/projects/EmacsMuse.html" target="_blank">Muse-mode</a>和<a href="http://orgmode.org/" target="_blank">org-mode</a>这样的写作工具<sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup>，使用[image]标签，插入本地图片，然后生成html、pdf；或者插入图片的url地址，也是一种使用较多的方式。</p>
<p>这种方式比较普遍，方便，但不快捷。画一张合适的、给力的图片需要什么？？</p>
<p><strong>一个软件，熟练的操作。</strong></p>
<p>软件候选者：<a href="http://www.photoshop.com" target="_blank">Photoshop</a>，收费，咱学习之用，使用绿色版 。一个<a href="http://photoshop.com" target="_blank">Photoshop</a>的使用那就是N本书，想真正的学会使用<a href="http://photoshop.com" target="_blank">Photoshop</a>来绘制流程图，也并不满足方便，快捷两个条件。<a href="http://office.microsoft.com/en-us/visio/" target="_blank">Microsoft Visio</a>，同样，收费，咱学习之用，使用绿色版，学习<a href="http://office.microsoft.com/en-us/visio/" target="_blank">Microsoft Visio</a>同样是需要一定的周期滴，也同样不满足方便，快捷两个条件。而且这两个软件有大缺点，跨平台不好，使用过程繁琐。</p>
<p>所以，我最衷爱的，ASCII图<sup><a class="footref" name="fnr.3" href="#fn.3">3</a></sup>就闪亮登场了，当当当当~~~，大家鼓掌。</p>
<p>ASCII图可以在任何文本适用的地方存在，如Internet Relay Chat（<a href="http://emacser.com/erc.htm" target="_blank"> IRC）</a>, E-mail, 论坛，BBS，非图形界面，同时可以在源代码中表示公司或产品的logo，或流程图。甚至有geeker将整个程序直接写成一坨ASCII图，看起来是相当的给力<sup><a class="footref" name="fnr.4" href="#fn.4">4</a></sup>。</p>
<p>介绍了什么是ASCII图，它的好处。那么下一步，就讨论下如何绘制ASCII图。我们肯定不会是一个字符一个字符的去敲，然后拼起来，将简单的事情复杂化，是我的专长，但是我却从不做愚蠢的事情。画ASCII图，我们有专门、专业的软件<sup><a class="footref" name="fnr.5" href="#fn.5">5</a></sup>。</p>
<p>但是既然我们是emaser，我们当然要看一下，emacs能不能做这件事情呢？答案肯定是YES。</p>
<p>emacs中有两个mode处理ASCII图，<a href="http://www.emacswiki.org/emacs/PictureMode" target="_blank">picture-mode</a>和<a href="http://www.lysator.liu.se/~tab/artist/" target="_blank">artist-mode</a>。<a href="http://www.emacswiki.org/emacs/PictureMode" target="_blank">picture-mode</a>请参考emacswiki，而前边我们介绍过<a href="http://www.lysator.liu.se/~tab/artist/" target="_blank">artist-mode</a>，没看过的童鞋<a href="http://emacser.com/artist-mode.htm" target="_blank">请进时光穿梭机</a>。</p>
<p>介绍完了背景知识，我们来一个真实的例子。</p>
</div>
</div>
<div class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> 应用场景</h3>
<div class="outline-text-3">
<p>我们有大批的cpp，h这样的源文件，每天和他们打交道。有一天我们想要给人演示对于源文件，我们都能做些什么。我们可以使用编辑器编辑它们，以使他们完成我们需要的功能；编译器编译他们，生成可执行文件；doxygen处理他们，生成源代码的文档…，其它用途还用很多，比如把程序写成下面的样子，成功的完成zhuangbility这样艰巨的任务：</p>
<pre>#include                                     &lt;math.h&gt;
#include                                   &lt;sys/time.h&gt;
#include                                   &lt;X11/Xlib.h&gt;
#include                                  &lt;X11/keysym.h&gt;
                                          double L ,o ,P
                                         ,_=dt,T,Z,D=1,d,
                                         s[999],E,h= 8,I,
                                         J,K,w[999],M,m,O
                                        ,n[999],j=33e-3,i=
                                        1E3,r,t, u,v ,W,S=
                                        74.5,l=221,X=7.26,
                                        a,B,A=32.2,c, F,H;
                                        int N,q, C, y,p,U;
                                       Window z; char f[52]
                                    ; GC k; main(){ Display*e=
 XOpenDisplay( 0); z=RootWindow(e,0); for (XSetForeground(e,k=XCreateGC (e,z,0,0),BlackPixel(e,0))
; scanf("%lf%lf%lf",y +n,w+y, y+s)+1; y ++); XSelectInput(e,z= XCreateSimpleWindow(e,z,0,0,400,400,
0,0,WhitePixel(e,0) ),KeyPressMask); for(XMapWindow(e,z); ; T=sin(O)){ struct timeval G={ 0,dt*1e6}
; K= cos(j); N=1e4; M+= H*_; Z=D*K; F+=_*P; r=E*K; W=cos( O); m=K*W; H=K*T; O+=D*_*F/ K+d/K*E*_; B=
sin(j); a=B*T*D-E*W; XClearWindow(e,z); t=T*E+ D*B*W; j+=d*_*D-_*F*E; P=W*E*B-T*D; for (o+=(I=D*W+E
*T*B,E*d/K *B+v+B/K*F*D)*_; p&lt;y; ){ T=p[s]+i; E=c-p[w]; D=n[p]-L; K=D*m-B*T-H*E; if(p [n]+w[ p]+p[s
]== 0|K &lt;fabs(W=T*r-I*E +D*P) |fabs(D=t *D+Z *T-a *E)&gt; K)N=1e4; else{ q=W/K *4E2+2e2; C= 2E2+4e2/ K
 *D; N-1E4&amp;&amp; XDrawLine(e ,z,k,N ,U,q,C); N=q; U=C; } ++p; } L+=_* (X*t +P*M+m*l); T=X*X+ l*l+M *M;
  XDrawString(e,z,k ,20,380,f,17); D=v/l*15; i+=(B *l-M*r -X*Z)*_; for(; XPending(e); u *=CS!=N){
                                   XEvent z; XNextEvent(e ,&amp;z);
                                       ++*((N=XLookupKeysym
                                         (&amp;z.xkey,0))-IT?
                                         N-LT? UP-N?&amp; E:&amp;
                                         J:&amp; u: &amp;h); --*(
                                         DN -N? N-DT ?N==
                                         RT?&amp;u: &amp; W:&amp;h:&amp;J
                                          ); } m=15*F/l;
                                          c+=(I=M/ l,l*H
                                          +I*M+a*X)*_; H
                                          =A*r+v*X-F*l+(
                                          E=.1+X*4.9/l,t
                                          =T*m/32-I*T/24
                                           )/S; K=F*M+(
                                           h* 1e4/l-(T+
                                           E*5*T*E)/3e2
                                           )/S-X*d-B*A;
                                           a=2.63 /l*d;
                                           X+=( d*l-T/S
                                            *(.19*E +a
                                            *.64+J/1e3
                                            )-M* v +A*
                                            Z)*_; l +=
                                            K *_; W=d;
                                            sprintf(f,
                                            "%5d  %3d"
                                            "%7d",p =l
                                           /1.7,(C=9E3+
                              O*57.3)%0550,(int)i); d+=T*(.45-14/l*
                             X-a*130-J* .14)*_/125e2+F*_*v; P=(T*(47
                             *I-m* 52+E*94 *D-t*.38+u*.21*E) /1e2+W*
                             179*v)/2312; select(p=0,0,0,0,&amp;G); v-=(
                              W*F-T*(.63*m-I*.086+m*E*19-D*25-.11*u
                               )/107e2)*_; D=cos(o); E=sin(o); } }
</pre>
<pre>//程序在linux下使用以下命令编译：
//cc banks.c -o banks -DIT=XK_Page_Up -DDT=XK_Page_Down \
//  -DUP=XK_Up -DDN=XK_Down -DLT=XK_Left -DRT=XK_Right \
//  -DCS=XK_Return -Ddt=0.02 -lm -lX11 -L/usr/X11R6/lib
</pre>
<p>但是本文中，我们只关注对cpp源文件的前三点应用：编辑，编译，生成文档。</p>
</div>
</div>
<div class="outline-3">
<h3 id="sec-3"><span class="section-number-3">3</span> ASCII图</h3>
<div class="outline-text-3">
<p>好吧，我们的第一个演示版本。</p>
<pre>+----------+ edit +----------+   input +----------+ compile +----------+
| refined  |&lt;-----+ h,cpp    +--------&gt;+ compiler,+--------&gt;+Executable|
|   h,cpp  |      |          |         | linker   |         |   File   |
+----------+      +----+-----+         +----------+         +----------+
                       | input
                       v
                  +----------+
                  | doxygen  |
                  |          |
                  +----+-----+
                       | process
                       v
                  +----------+
                  | Doxgen   |
                  | Document |
                  +----------+
</pre>
<p>第一个版本，作为一种可嵌入文本的ASCII图，绘制简单，简单，大方，实用（情人眼里出西施？）……</p>
<p>但是，有童鞋说过（主要是我自己感觉）实用性不强，很多人是不接受ASCII图的，文章里夹了这么一个ASCII图，别人抵触情绪马上起来，这无关技术，只是习惯。</p>
</div>
</div>
<div class="outline-3">
<h3 id="sec-4"><span class="section-number-3">4</span> 简单框图</h3>
<div class="outline-text-3">
<p>那么，如果这是一幅图，看起来或许更爽….。这样可以吗？好吧，我们试一下，把上面的ASCII图变为图片。</p>
<p><img src="http://emacser.com/uploads/asciiExample.png" alt="http://emacser.com/uploads/asciiExample.png" /></p>
<p>OMG，这个如何做到的？:)，我们使用的是如下代码，将ASCII图转化为png(org-mode中)。</p>
<pre>#+BEGIN_DITAA  asciiExample.png -o -r -S

       +----------+ edit +----------+   input +----------+ compile +----------+
       | refined  |&lt;-----+ h,cpp    +--------&gt;+ compiler,+--------&gt;+Executable|
       |   h,cpp  |      |          |         | linker   |         |   File   |
       +----------+      +----+-----+         +----------+         +----------+
                              | input
                              v
                         +----------+
                         | doxygen  |
                         |          |
                         +----+-----+
                              | process
                              v
                         +----------+
                         | Doxgen   |
                         | Document |
                         +----------+

#+END_DITAA
</pre>
<p>这里使用的是<a href="http://ditaa.sourceforge.net/" target="_blank">ditaa</a>，第一次听说<a href="http://ditaa.sourceforge.net/" target="_blank">ditaa</a>这个玩意是在从punchagan的博客，即<a href="http://punchagan.wordpress.com/2010/07/21/ditaa-and-org-mode/" target="_blank">这里</a> <sup><a class="footref" name="fnr.6" href="#fn.6">6</a></sup>，当时我问了一个<a href="http://orgmode.org/" target="_blank">org-mode</a>中怎样嵌入ASCII图的问题<sup><a class="footref" name="fnr.7" href="#fn.7">7</a></sup>，他就给了我这么大一个鱼杆！！</p>
</div>
</div>
<div class="outline-3">
<h3 id="sec-5"><span class="section-number-3">5</span> 着色</h3>
<div class="outline-text-3">
<p>好，言归正传。看起来，还不错。但是精益求精是我们的特点，嘿嘿。我们希望区分一下，源用红色表示，处理过程用绿色表示，结果呢，我们用黑色表示，这样看起来或许更美观一些，美观也就是用<a href="http://photoshop.com" target="_blank">Photoshop</a>或者<a href="http://office.microsoft.com/en-us/visio/" target="_blank">Microsoft Visio</a>画图追求的效果嘛。GO.</p>
<p><img src="http://emacser.com/uploads/asciiExampleWithColor.png" alt="http://emacser.com/uploads/asciiExampleWithColor.png" /></p>
<p>着色的代码如下：</p>
<pre>#+BEGIN_DITAA  asciiExampleWithColor.png -o -r -S

       +----------+ edit +----------+   input +----------+ compile +----------+
       |  cPNK    |      |  cRED    |         |   cGRE   |         |  cPNK    |
       | refined  |&lt;-----+ h,cpp    +--------&gt;+ compiler,+--------&gt;+Executable|
       |   h,cpp  |      |          |         | linker   |         |   File   |
       |          |      |          |         |          |         |          |
       +----------+      +----+-----+         +----------+         +----------+
                              | input
                              v
                         +----------+
                         |  cGRE    |
                         | doxygen  |
                         |          |
                         +----+-----+
                              | process
                              v
                         +----------+
                         |  cPNK    |
                         | Doxgen   |
                         | Document |
                         |          |
                         +----------+

#+END_DITAA
</pre>
</div>
</div>
<div class="outline-3">
<h3 id="sec-6"><span class="section-number-3">6</span> 完整而优雅的图案</h3>
<div class="outline-text-3">
<p>看起来，到现在，我们做的还不错。但是，作为一个喜欢把简单事情复杂化的geek，显然我们还不能不满足。这个图没有区分度，h,cpp是输入，Excutable file是磁盘文件，Doxygen Document是文档，但是图中，它们看起来没有区分开，我们需要在休息前，再来点小的修葺。</p>
<p><img src="http://emacser.com/uploads/asciiExampleWithColorAndType.png" alt="http://emacser.com/uploads/asciiExampleWithColorAndType.png" /><br />
代码如下：</p>
<pre>#+BEGIN_DITAA  asciiExampleWithColorAndType.png -o -r -S

       +----------+ edit +----------+   input +----------+ compile +----------+
       |  cPNK    |      |  cRED    |         |   cGRE   |         |  cPNK    |
       | refined  |&lt;-----+ h,cpp    +--------&gt;+ compiler,+--------&gt;+Executable|
       |   h,cpp  |      |          |         | linker   |         |   File   |
       | {s}      |      |  {io}    |         |          |         |    {s}   |
       +----------+      +----+-----+         +----------+         +----------+
                              | input
                              v
                         +----------+
                         |  cGRE    |
                         | doxygen  |
                         |          |
                         +----+-----+
                              | process
                              v
                         +----------+
                         |  cPNK    |
                         | Doxgen   |
                         | Document |
                         |    {d}   |
                         +----------+

#+END_DITAA
</pre>
<p>Done！该喝杯咖啡了。哦，不，对我来说，该去睡会觉了，Zzzzzz</p>
</div>
</div>
<div class="outline-3">
<h3 id="sec-7"><span class="section-number-3">7</span> 中文</h3>
<div class="outline-text-3">
<p>能使用中文也算是基本需求了，那么最后来一个试验用图。</p>
<p><img src="http://emacser.com/uploads/asciiExampleWithColorAndTypeUtf8.png" alt="http://emacser.com/uploads/asciiExampleWithColorAndTypeUtf8.png" /></p>
<pre>#+BEGIN_DITAA  asciiExampleWithColorAndTypeUtf8.png -e gb2312

              +------------+     +------------+
              | 中文        |----&gt;|    中文    |
              |            |     |            |
              +------------+     +------------+

#+END_DITAA

正确显示中文需要文章使用的编码和ditaa指定的编码一致。
</pre>
<p>但是在加入中文的时候，边框的对齐很难做到，不得不说是个让人很不爽的地方。</p>
</div>
</div>
<div class="outline-3">
<h3 id="sec-8"><span class="section-number-3">8</span> <a href="http://ditaa.sourceforge.net/" target="_blank">ditaa</a></h3>
<div class="outline-text-3">
<p>尽管我们是emacser，但是我们不能忽略了这次的主角，也就是<a href="http://ditaa.sourceforge.net/" target="_blank">ditaa</a> ~~~~。我们能玩这么多的花样，还有赖于<a href="http://ditaa.sourceforge.net/" target="_blank">ditaa</a>。好吧，我们介绍主角出场吧。</p>
<p><a href="http://ditaa.sourceforge.net/" target="_blank">ditaa</a>的作者是Stathis Sideris，是一个java程序(做为一个c++程序员，我表示鸭梨很大)，想要使用diataa的话，你的电脑 <strong>必须</strong> 安装java，并且使java的bin目录在emacs的path内。</p>
<p>可以去<a href="http://ditaa.sourceforge.net/" target="_blank">这里</a>下载，具体的语法请参考<a href="http://ditaa.sourceforge.net/" target="_blank">ditaa</a>的主页，本文使用的例子用到了大部分、而不是全部特性。</p>
</div>
</div>
<div class="outline-3">
<h3 id="sec-9"><span class="section-number-3">9</span> 不算小结的小结</h3>
<div class="outline-text-3">
<p><a href="http://orgmode.org/" target="_blank">org-mode</a>+<a href="http://www.lysator.liu.se/~tab/artist/" target="_blank">artist-mode</a>+<a href="http://ditaa.sourceforge.net/" target="_blank">ditaa</a>是一个emacs中使用图片的很好的办法，但不是万能的。实际上，主要画流程图，框图比较好用。下面我列举了两个可以在emacs中胜任绘图需求的方法：</p>
<ul>
<li> <a href="http://users.skynet.be/ppareit/projects/graphviz-dot-mode/graphviz-dot-mode.html" target="_blank">graphviz</a></li>
<li> python + matlab lib</li>
</ul>
<p><a href="http://users.skynet.be/ppareit/projects/graphviz-dot-mode/graphviz-dot-mode.html" target="_blank">graphviz</a>已然非常强大，而matlab绘制科学图形是更胜一筹，鉴于篇幅，本文不再展开。</p>
<p>更多……..敬请期待。</p>
</div>
</div>
<div>
<h2 class="footnotes">Footnotes:</h2>
<div>
<p class="footnote"><sup><a class="footnum" name="fn.1" href="#fnr.1">1</a></sup> 可爱的wiki利用一则漫画解释一图胜千言：A:为什么一图胜千言 B:你打字多快 A:25/分钟  B:这就对了，当我画40分钟画好了我的图，………,你正好敲了1000个字。要看出处的漫画，<a href="http://en.wikipedia.org/wiki/A_picture_is_worth_a_thousand_words" target="_blank">猛击我</a>。</p>
<p class="footnote"><sup><a class="footnum" name="fn.2" href="#fnr.2">2</a></sup> Wiki-mode, Muse-mode, org-mode就是博客，日志，随笔这样的居家过日子必备之工具。</p>
<p class="footnote"><sup><a class="footnum" name="fn.3" href="#fnr.3">3</a></sup> ASCII图 是一种图行设计技术，使用ascii 标准中128个可见字符组成的picture，可用在电脑上的演示。</p>
<p class="footnote"><sup><a class="footnum" name="fn.4" href="#fnr.4">4</a></sup> <a href="http://en.wikipedia.org/wiki/International_Obfuscated_C_Code_Contest" target="_blank">http://en.wikipedia.org/wiki/International\_Obfuscated\_C\_Code\_Contest</a>。</p>
<p class="footnote"><sup><a class="footnum" name="fn.5" href="#fnr.5">5</a></sup> ascii 编辑软件 <a href="http://en.wikipedia.org/wiki/List_of_text_editors#ASCII_and_ANSI_art" target="_blank">http://en.wikipedia.org/wiki/List\_of\_text\_editors#ASCII\_and\_ANSI\_art</a>。</p>
<p class="footnote"><sup><a class="footnum" name="fn.6" href="#fnr.6">6</a></sup> punchagan是org2blog的作者，同时推荐一个牛人<a href="http://www.twitter.com/sachac" target="_blank">sacha</a>。</p>
<p class="footnote"><sup><a class="footnum" name="fn.7" href="#fnr.7">7</a></sup> <a href="http://punchagan.wordpress.com/2010/07/20/org2blog-readme/#comment-710" target="_blank">http://punchagan.wordpress.com/2010/07/20/org2blog-readme/#comment-710</a> .</p>
</div>
</div>
</div>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-ditaa.htm' t='Emacs中绘图 － ditaa篇' d='' tag='artist-mode,C/C++,ditaa,Emacs,emacser,emacser.com,erc,graphviz,IDE,irc,matlab,muse-mode,org,Org Mode,python,screenshot,wiki-mode,配色,配色' 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/from-vi-to-emacs.htm" title="我是如何从vim转向Emacs的 (2010年04月27日)">我是如何从vim转向Emacs的</a> (55)</li>
	<li><a href="http://emacser.com/erc.htm" title="ERC使用简介 (2010年03月22日)">ERC使用简介</a> (41)</li>
	<li><a href="http://emacser.com/evernote-mode.htm" title="Emacs中的Evernote: evernote-mode (2011年04月26日)">Emacs中的Evernote: evernote-mode</a> (67)</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/org-mode.htm" title="Emacs org mode学习笔记 (2010年10月18日)">Emacs org mode学习笔记</a> (66)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-ditaa.htm/feed</wfw:commentRss>
		<slash:comments>34</slash:comments>
		</item>
		<item>
		<title>google-maps-el &#8211; Emacs中的谷歌地图</title>
		<link>http://emacser.com/emacs-google-map.htm</link>
		<comments>http://emacser.com/emacs-google-map.htm#comments</comments>
		<pubDate>Mon, 12 Jul 2010 18:10:21 +0000</pubDate>
		<dc:creator>fangzhzh</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[初级]]></category>
		<category><![CDATA[好玩的]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[face]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[google maps]]></category>
		<category><![CDATA[maps]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[颜色]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41457</guid>
		<description><![CDATA[什么是google-map-el
作者原话：google-maps 是一个emacs的扩展，允许在emacs中显示google地图。
如果想瞻仰生下google-maps-el这个蛋的母鸡，猛击我。
google-maps使用了 Google static Maps API和Google Maps Geocoding API1。
google-maps-el原作者的效果图：

google-mpas-el如何使用
进入
M-x google-maps
使用
google maps mode下的键绑定，对应命令，相应解释



键绑定
命令
解释


+
google-maps-static-zoom-in
放大


, .. -
google-maps-static-zoom-out
缩小


.
google-maps-static-zoom-in
放大


&#60;
google-maps-static-zoom-out
缩小


&#62;
google-maps-static-zoom-in
放大


c
google-maps-static-center
设置中心点位置2


g
google-maps-static-refresh
刷新


m
google-maps-static-manage-marker
地标


q
google-maps-static-quit
退出


t
google-maps-static-set-maptype
地图模式3


v
google-maps-static-manage-visible
不懂4


w
google-maps-static-copy-url
拷贝当前地图的url


z
google-maps-static-zoom
放缩至1倍


&#60;mouse-4&#62;
google-maps-static-zoom-mouse-in
放大


&#60;mouse-5&#62;
google-maps-static-zoom-mouse-out
缩小



访问五道口的效果5：

实际操作
下面展示了，如何使用google-maps-el来生成以下的效果。
1 M-x google-maps ，在minibuffer中输入:wudaokou, beijing(进入五道口)
2 m Tsinghua RET p(标记清华大学为P)
3 m Peking University RET b(标记北京大学为B)
4 m Qinghuayuan Railway RTT q(标记清华园站为Q)
5 m Zhanchun Bridge RET z(标记展春桥为Z)
结果如下：

想要更炫的如作者展示的一样的结果，请参考作者图片上的设置，可以给marker设置表示颜色，在地图上显示从A地点到B地点的路径6。
为什么使用google-maps-el
这个原因不好说，不能说，也说不好。只是这里有两个新闻solidot, 月光博客。
google-maps方便，基于api的也应该更安全吧。
就算没有这些更安全、更方便，闲暇时把google maps搞进emacs，show给别人看，然后暗爽，也算是一种自娱自乐吧，呵呵
1. API 真是个好东西。当我的思维还停留web时代以前，认为API只是库或者框架对外提供的接口，方便库和框架与其他软件交互时，API已经远远超出这个范畴，进入web2.0时代，详细了解web APIS，猛击我。
2. 支持中文，英文，中文拼音。
3. 有四种hybrid(混合地图),roadmap(道路图),satellite(卫星图),terrain(地域图)。
4. 作者效果图中有对visible的设置，应该是有用的，欲了解详细的geeker请读文档代码。
5. hybrid效果。
6. 路径功能，个人感觉不实用，路径需要在配置文件中写，而不能实时查询。感兴趣的童鞋可以扩展此功能:)



	相关日志
	
	高亮C的所有变量和函数 (45)
	我的Emacs配置文件 － DEA (352)
	用CEDET浏览和编辑C++代码 (198)
	Emacs才是世界上最强大的IDE － 用Emaci阅读文件 (89)
	Emacs初学者必知必会 [...]]]></description>
			<content:encoded><![CDATA[<h3>什么是google-map-el</h3>
<p class="first">作者原话：google-maps 是一个emacs的扩展，允许在emacs中显示google地图。</p>
<p>如果想瞻仰生下google-maps-el这个蛋的母鸡，<a href="http://julien.danjou.info/google-maps-el.html" target="_blank">猛击我</a>。</p>
<p>google-maps使用了 <a href="http://code.google.com/apis/maps/documentation/staticmaps/" target="_blank">Google static Maps API</a>和<a href="http://code.google.com/apis/maps/documentation/geocoding/" target="_blank">Google Maps Geocoding API</a><sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup>。<span id="more-41457"></span><br />
google-maps-el原作者的效果图：</p>
<p class="image"><img src="http://julien.danjou.info/images/emacs-google-maps.png" alt="" /></p>
<h3>google-mpas-el如何使用</h3>
<h4>进入</h4>
<p class="first">M-x google-maps</p>
<h4>使用</h4>
<p class="first">google maps mode下的键绑定，对应命令，相应解释</p>
<table class="muse-table" border="2" cellpadding="5">
<tbody>
<tr>
<td>键绑定</td>
<td>命令</td>
<td>解释</td>
</tr>
<tr>
<td>+</td>
<td>google-maps-static-zoom-in</td>
<td>放大</td>
</tr>
<tr>
<td>, .. -</td>
<td>google-maps-static-zoom-out</td>
<td>缩小</td>
</tr>
<tr>
<td>.</td>
<td>google-maps-static-zoom-in</td>
<td>放大</td>
</tr>
<tr>
<td>&lt;</td>
<td>google-maps-static-zoom-out</td>
<td>缩小</td>
</tr>
<tr>
<td>&gt;</td>
<td>google-maps-static-zoom-in</td>
<td>放大</td>
</tr>
<tr>
<td>c</td>
<td>google-maps-static-center</td>
<td>设置中心点位置<sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup></td>
</tr>
<tr>
<td>g</td>
<td>google-maps-static-refresh</td>
<td>刷新</td>
</tr>
<tr>
<td>m</td>
<td>google-maps-static-manage-marker</td>
<td>地标</td>
</tr>
<tr>
<td>q</td>
<td>google-maps-static-quit</td>
<td>退出</td>
</tr>
<tr>
<td>t</td>
<td>google-maps-static-set-maptype</td>
<td>地图模式<sup><a class="footref" name="fnr.3" href="#fn.3">3</a></sup></td>
</tr>
<tr>
<td>v</td>
<td>google-maps-static-manage-visible</td>
<td>不懂<sup><a class="footref" name="fnr.4" href="#fn.4">4</a></sup></td>
</tr>
<tr>
<td>w</td>
<td>google-maps-static-copy-url</td>
<td>拷贝当前地图的url</td>
</tr>
<tr>
<td>z</td>
<td>google-maps-static-zoom</td>
<td>放缩至1倍</td>
</tr>
<tr>
<td>&lt;mouse-4&gt;</td>
<td>google-maps-static-zoom-mouse-in</td>
<td>放大</td>
</tr>
<tr>
<td>&lt;mouse-5&gt;</td>
<td>google-maps-static-zoom-mouse-out</td>
<td>缩小</td>
</tr>
</tbody>
</table>
<p>访问五道口的效果<sup><a class="footref" name="fnr.5" href="#fn.5">5</a></sup>：</p>
<p class="image"><img src="http://emacser.com/uploads/google-maps.jpg" alt="" width="500" height="400" /></p>
<h3>实际操作</h3>
<p class="first">下面展示了，如何使用google-maps-el来生成以下的效果。<br />
1 M-x google-maps ，在minibuffer中输入:wudaokou, beijing(进入五道口)<br />
2 m Tsinghua RET p(标记清华大学为P)<br />
3 m Peking University RET b(标记北京大学为B)<br />
4 m Qinghuayuan Railway RTT q(标记清华园站为Q)<br />
5 m Zhanchun Bridge RET z(标记展春桥为Z)<br />
结果如下：</p>
<p class="image"><img src="http://emacser.com/uploads/google-maps-roadmap.jpg" alt="" width="500" height="400" /></p>
<p>想要更炫的如作者展示的一样的结果，请参考作者图片上的设置，可以给marker设置表示颜色，在地图上显示从A地点到B地点的路径<sup><a class="footref" name="fnr.6" href="#fn.6">6</a></sup>。</p>
<h3>为什么使用google-maps-el</h3>
<p class="first">这个原因不好说，不能说，也说不好。只是这里有两个新闻<a href="http://internet.solidot.org/article.pl?sid=10/07/08/0938214&amp;from=rss" target="_blank">solidot</a>, <a href="http://www.williamlong.info/archives/2235.html" target="_blank">月光博客</a>。</p>
<p>google-maps方便，基于api的也应该更安全吧。</p>
<p>就算没有这些更安全、更方便，闲暇时把google maps搞进emacs，show给别人看，然后暗爽，也算是一种自娱自乐吧，呵呵</p>
<p class="footnote"><a class="footnum" name="fn.1" href="#fnr.1">1.</a> <a href="http://en.wikipedia.org/wiki/Application_programming_interface#Web_APIs" target="_blank">API</a> 真是个好东西。当我的思维还停留web时代以前，认为API只是库或者框架对外提供的接口，方便库和框架与其他软件交互时，API已经远远超出这个范畴，进入web2.0时代，详细了解web APIS，<a href="http://en.wikipedia.org/wiki/Web_service" target="_blank">猛击我</a>。</p>
<p class="footnote"><a class="footnum" name="fn.2" href="#fnr.2">2.</a> 支持中文，英文，中文拼音。</p>
<p class="footnote"><a class="footnum" name="fn.3" href="#fnr.3">3.</a> 有四种hybrid(混合地图),roadmap(道路图),satellite(卫星图),terrain(地域图)。</p>
<p class="footnote"><a class="footnum" name="fn.4" href="#fnr.4">4.</a> 作者效果图中有对visible的设置，应该是有用的，欲了解详细的geeker请读文档代码。</p>
<p class="footnote"><a class="footnum" name="fn.5" href="#fnr.5">5.</a> hybrid效果。</p>
<p class="footnote"><a class="footnum" name="fn.6" href="#fnr.6">6.</a> 路径功能，个人感觉不实用，路径需要在配置文件中写，而不能实时查询。感兴趣的童鞋可以扩展此功能:)</p>
<p><!-- Page published by Emacs Muse ends here --></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/emacs-google-map.htm' t='google-maps-el &amp;#8211; Emacs中的谷歌地图' d='' tag='Emacs,emacser,emacser.com,face,google,google maps,maps,org,颜色' 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/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (45)</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/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (198)</li>
	<li><a href="http://emacser.com/emaci.htm" title="Emacs才是世界上最强大的IDE － 用Emaci阅读文件 (2010年04月12日)">Emacs才是世界上最强大的IDE － 用Emaci阅读文件</a> (89)</li>
	<li><a href="http://emacser.com/emacs-beginner-must-know.htm" title="Emacs初学者必知必会 (2010年01月24日)">Emacs初学者必知必会</a> (9)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-google-map.htm/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>用artist-mode画文本图</title>
		<link>http://emacser.com/artist-mode.htm</link>
		<comments>http://emacser.com/artist-mode.htm#comments</comments>
		<pubDate>Tue, 18 May 2010 19:10:02 +0000</pubDate>
		<dc:creator>fangzhzh</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[初级]]></category>
		<category><![CDATA[好玩的]]></category>
		<category><![CDATA[artist-mode]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[截图]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[鼠标]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41374</guid>
		<description><![CDATA[
概述
artist是一个emacs的内置lisp包。
在artist-mode中，你可以使用鼠标或者键盘来画线(可以带箭头)、矩形、正方形、多边形、椭圆、圆和一些类似于水蒸气似的不规则图形，当然可以擦除，填出图形，还可以在其上写字。 
截图
这是一个很不错的绘制单链表的截图flash
这是一个画了一些形状的截图, 这幅图画了一个A.
这是我工作时的一个绘制结果.

为什么使用Artist-mode
我经常在写程序的时候，希望在文档里画一些类的继承关系、包含关系什么的，以帮助读这个文件的人能够更好的理解代码，但是此处不能且不适合放一张jpg（要是h,cpp文件里能插图，那多拉风啊）。
就考虑用plain-text的文本格式来绘图。初始时想用“-&#124;+_”这几个符号来拼凑，但是工作效率太低，而且容易出错，一修改就几乎整个图作废。将有限的时间浪费在如此耗时，且没有技术含量的工作上，那还不就等于浪费生命啊，剩下来的时间多去看看twitter多好！
正如截图中绘制单链表的截图flash所展示，artist-mode来做这件事情，那是最适合不过了。那么来初探一下emacs的artist-mode能够如何完成任务呢。
怎么使用Mouse 绘制
进入artist-mode
M-x artist-mode

离开artist-mode
M-x artist-mode-off

三个mouse
mouse-2（鼠标中键）,shift mouse-2
弹出一个菜单，从菜单里你可以选择要使用左键画什么类型更改一些设定
mouse-1 ( 鼠标左键) , shift-mouse-1
绘制部分由鼠标左键完成，请参考绘制操作。
mouse-3 ( 鼠标右键) , shift mouse-3



mouse-3
删除鼠标下的一个字符


shift mouse-3
画出矩形框，删除框选所有字符




绘制操作（鼠标左键）



操作
无shift
shift


pen
单击，在鼠标点填充一个“填充符号”，默认为&#8221;.&#8221;；按下左键，拖动，抬起，绘制填充符号组成的线
单击，在鼠标点填充一个“o”；按下左键，拖动，抬起，绘制一条从初始点到最终点的直线


Line
任意方向的线
直线


Rectangle
矩形
正方形1


Poly-line
任意方向的多边形
每条线都是直线的多边形


Ellipses
椭圆
圆2


Text
文本
覆盖式文本


Spray-can
喷雾器3
设置喷雾器的大小


Erase
橡皮，擦掉一个字符
擦掉矩形内字符


Vaporize
擦除一行
擦除所有相连的行


Cut
剪切矩形
剪切正方形


copy
复制矩形
复制正方形


paste
粘贴
粘贴


Flood-fill
填充工具，填充
填充



一些说明
直线：只能是垂直，水平，对角线
箭头：绘制线，或多边形时，可以设置箭头，详细见箭头.
设定



设定选项
含义


Set fill
设定用来填充矩形和正方形的字符


Set line
设定绘制线的时候使用的字符


Erase char
设置擦除的时候使用的字符


Trimming
开关修剪行尾的功能（一个图画完，一行行尾的空格会被移除）


Borders
开关在填充图形周围绘制行边界的功能



箭头
在artist-mode中，有下面两个键
&#60; artist-toggle-first-arrow &#62; artist-toggle-second-arrow

就像他们的快捷键所展示，artist-toggle-first-arrow将一条直线的第一个字符变为&#60;，而artist-toggle-second-arrow将一条线的最后一个字符变为&#62;。
命令
基本命令



命令
功能


M-x artist-key-set-point
执行以下功能


M-x artist-select-operation
选择绘制类型


M-x artist-next-line, M-x artist-previous-line, M-x artist-forward-char and M-x artist-backward-char.
移动


M-x artist-select-fill-char
设置填充字符


M-x artist-select-line-char
设置绘制时字符


M-x artist-select-erase-char
设置擦除时使用字符


M-x artist-toggle-rubber-banding
开关  rubber-banding功能（不知道是什么）


M-x artist-toggle-trim-line-endings
开关修剪行尾的功能


M-x artist-toggle-borderless-shapes
开关在填充图形周围绘制行边界的功能



artist-key-set-point 执行的功能



情况
作用


lines/rectangles/squares
设置起始/结束点


poly-lines
设置其中一个点， (使用 C-u M-x artist-key-set-point 设置结束点)


擦除字符时
开关橡皮功能


剪切，复制
设置区域/正方形 的 开始/结束点


粘贴时
粘贴动作



箭头命令



M-x artist-toggle-first-arrow
设置/取消 在线/多线段开头的箭头


M-x artist-toggle-second-arrow
设置/取消 在线/多线段结尾的箭头



选择操作



M-x artist-select-op-line
绘制线


M-x artist-select-op-straight-line
绘制直线


M-x [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" src="screenshots/artist-mode-logo.jpg" alt="" width="120" height="120" /></p>
<h3>概述</h3>
<p class="first">artist是一个emacs的内置lisp包。<br />
在artist-mode中，你可以使用鼠标或者键盘来画线(可以带箭头)、矩形、正方形、多边形、椭圆、圆和一些类似于水蒸气似的不规则图形，当然可以擦除，填出图形，还可以在其上写字。 <span id="more-41374"></span></p>
<h4>截图</h4>
<p class="first">这是一个很不错的<a href="http://www.cinsk.org/emacs/emacs-artist.html" target="_blank">绘制单链表的截图flash</a></p>
<p>这是一个<a href="http://www.lysator.liu.se/~tab/artist/emacs-shapes.html" target="_blank">画了一些形状的截图</a>, 这幅图画了一个<a href="http://www.lysator.liu.se/~tab/artist/emacs-a.html" target="_blank">A</a>.</p>
<p>这是我工作时的一个绘制结果.</p>
<p><a rel="lightbox" href="screenshots/artist-mode.jpg"><img src="screenshots/thumbs/thumbs_artist-mode.jpg" alt="" /></a></p>
<h3>为什么使用Artist-mode</h3>
<p class="first">我经常在写程序的时候，希望在文档里画一些类的继承关系、包含关系什么的，以帮助读这个文件的人能够更好的理解代码，但是此处不能且不适合放一张jpg（要是h,cpp文件里能插图，那多拉风啊）。</p>
<p>就考虑用plain-text的文本格式来绘图。初始时想用“-|+_”这几个符号来拼凑，但是工作效率太低，而且容易出错，一修改就几乎整个图作废。将有限的时间浪费在如此耗时，且没有技术含量的工作上，那还不就等于浪费生命啊，剩下来的时间多去看看twitter多好！</p>
<p>正如截图中<a href="http://www.cinsk.org/emacs/emacs-artist.html" target="_blank">绘制单链表的截图flash</a>所展示，artist-mode来做这件事情，那是最适合不过了。那么来初探一下emacs的artist-mode能够如何完成任务呢。</p>
<h3>怎么使用Mouse 绘制</h3>
<h4>进入artist-mode</h4>
<pre>M-x artist-mode
</pre>
<h4>离开artist-mode</h4>
<pre>M-x artist-mode-off
</pre>
<h4>三个mouse</h4>
<h5>mouse-2（鼠标中键）,shift mouse-2</h5>
<p class="first">弹出一个菜单，从菜单里你可以选择要使用左键画什么<a href="#types">类型</a>更改一些<a href="#setttings">设定</a></p>
<h5>mouse-1 ( 鼠标左键) , shift-mouse-1</h5>
<p class="first">绘制部分由鼠标左键完成，请参考<a href="#operations">绘制操作</a>。</p>
<h5>mouse-3 ( 鼠标右键) , shift mouse-3</h5>
<table class="muse-table" border="2" cellpadding="5">
<tbody>
<tr>
<td>mouse-3</td>
<td>删除鼠标下的一个字符</td>
</tr>
<tr>
<td>shift mouse-3</td>
<td>画出矩形框，删除框选所有字符</td>
</tr>
</tbody>
</table>
<p><a id="operations" name="operations"></a></p>
<h4><a id="types" name="types"></a>绘制操作（鼠标左键）</h4>
<table class="muse-table" border="2" cellpadding="5">
<tbody>
<tr>
<td>操作</td>
<td>无shift</td>
<td>shift</td>
</tr>
<tr>
<td>pen</td>
<td>单击，在鼠标点填充一个“填充符号”，默认为&#8221;.&#8221;；按下左键，拖动，抬起，绘制填充符号组成的线</td>
<td>单击，在鼠标点填充一个“o”；按下左键，拖动，抬起，绘制一条从初始点到最终点的直线</td>
</tr>
<tr>
<td>Line</td>
<td>任意方向的线</td>
<td>直线</td>
</tr>
<tr>
<td>Rectangle</td>
<td>矩形</td>
<td>正方形<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup></td>
</tr>
<tr>
<td>Poly-line</td>
<td>任意方向的多边形</td>
<td>每条线都是直线的多边形</td>
</tr>
<tr>
<td>Ellipses</td>
<td>椭圆</td>
<td>圆<sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup></td>
</tr>
<tr>
<td>Text</td>
<td>文本</td>
<td>覆盖式文本</td>
</tr>
<tr>
<td>Spray-can</td>
<td>喷雾器<sup><a class="footref" name="fnr.3" href="#fn.3">3</a></sup></td>
<td>设置喷雾器的大小</td>
</tr>
<tr>
<td>Erase</td>
<td>橡皮，擦掉一个字符</td>
<td>擦掉矩形内字符</td>
</tr>
<tr>
<td>Vaporize</td>
<td>擦除一行</td>
<td>擦除所有相连的行</td>
</tr>
<tr>
<td>Cut</td>
<td>剪切矩形</td>
<td>剪切正方形</td>
</tr>
<tr>
<td>copy</td>
<td>复制矩形</td>
<td>复制正方形</td>
</tr>
<tr>
<td>paste</td>
<td>粘贴</td>
<td>粘贴</td>
</tr>
<tr>
<td>Flood-fill</td>
<td>填充工具，填充</td>
<td>填充</td>
</tr>
</tbody>
</table>
<h4>一些说明</h4>
<p><em>直线</em>：只能是垂直，水平，对角线</p>
<p>箭头：绘制线，或多边形时，可以设置箭头，详细见<a href="#arrows">箭头</a>.</p>
<h4><a id="setttings" name="setttings"></a>设定</h4>
<table class="muse-table" border="2" cellpadding="5">
<tbody>
<tr>
<td>设定选项</td>
<td>含义</td>
</tr>
<tr>
<td>Set fill</td>
<td>设定用来填充矩形和正方形的字符</td>
</tr>
<tr>
<td>Set line</td>
<td>设定绘制线的时候使用的字符</td>
</tr>
<tr>
<td>Erase char</td>
<td>设置擦除的时候使用的字符</td>
</tr>
<tr>
<td>Trimming</td>
<td>开关修剪行尾的功能（一个图画完，一行行尾的空格会被移除）</td>
</tr>
<tr>
<td>Borders</td>
<td>开关在填充图形周围绘制行边界的功能</td>
</tr>
</tbody>
</table>
<h4><a id="arrows" name="arrows"></a>箭头</h4>
<p class="first">在artist-mode中，有下面两个键</p>
<pre>&lt; artist-toggle-first-arrow &gt; artist-toggle-second-arrow
</pre>
<p>就像他们的快捷键所展示，artist-toggle-first-arrow将一条直线的第一个字符变为&lt;，而artist-toggle-second-arrow将一条线的最后一个字符变为&gt;。</p>
<h3>命令</h3>
<h4>基本命令</h4>
<table class="muse-table" border="2" cellpadding="5">
<tbody>
<tr>
<td>命令</td>
<td>功能</td>
</tr>
<tr>
<td>M-x artist-key-set-point</td>
<td><a href="#artist-key-set-point">执行以下功能</a></td>
</tr>
<tr>
<td>M-x artist-select-operation</td>
<td>选择绘制类型</td>
</tr>
<tr>
<td>M-x artist-next-line, M-x artist-previous-line, M-x artist-forward-char and M-x artist-backward-char.</td>
<td>移动</td>
</tr>
<tr>
<td>M-x artist-select-fill-char</td>
<td>设置填充字符</td>
</tr>
<tr>
<td>M-x artist-select-line-char</td>
<td>设置绘制时字符</td>
</tr>
<tr>
<td>M-x artist-select-erase-char</td>
<td>设置擦除时使用字符</td>
</tr>
<tr>
<td>M-x artist-toggle-rubber-banding</td>
<td>开关  rubber-banding功能（不知道是什么）</td>
</tr>
<tr>
<td>M-x artist-toggle-trim-line-endings</td>
<td>开关修剪行尾的功能</td>
</tr>
<tr>
<td>M-x artist-toggle-borderless-shapes</td>
<td>开关在填充图形周围绘制行边界的功能</td>
</tr>
</tbody>
</table>
<h5><a id="artist-key-set-point" name="artist-key-set-point"></a>artist-key-set-point 执行的功能</h5>
<table class="muse-table" border="2" cellpadding="5">
<tbody>
<tr>
<td>情况</td>
<td>作用</td>
</tr>
<tr>
<td>lines/rectangles/squares</td>
<td>设置起始/结束点</td>
</tr>
<tr>
<td>poly-lines</td>
<td>设置其中一个点， (使用 C-u M-x artist-key-set-point 设置结束点)</td>
</tr>
<tr>
<td>擦除字符时</td>
<td>开关橡皮功能</td>
</tr>
<tr>
<td>剪切，复制</td>
<td>设置区域/正方形 的 开始/结束点</td>
</tr>
<tr>
<td>粘贴时</td>
<td>粘贴动作</td>
</tr>
</tbody>
</table>
<h4>箭头命令</h4>
<table class="muse-table" border="2" cellpadding="5">
<tbody>
<tr>
<td>M-x artist-toggle-first-arrow</td>
<td>设置/取消 在线/多线段开头的箭头</td>
</tr>
<tr>
<td>M-x artist-toggle-second-arrow</td>
<td>设置/取消 在线/多线段结尾的箭头</td>
</tr>
</tbody>
</table>
<h4>选择操作</h4>
<table class="muse-table" border="2" cellpadding="5">
<tbody>
<tr>
<td>M-x artist-select-op-line</td>
<td>绘制线</td>
</tr>
<tr>
<td>M-x artist-select-op-straight-line</td>
<td>绘制直线</td>
</tr>
<tr>
<td>M-x artist-select-op-rectangle</td>
<td>绘制矩形</td>
</tr>
<tr>
<td>M-x artist-select-op-square</td>
<td>绘制正方形</td>
</tr>
<tr>
<td>M-x artist-select-op-poly-line</td>
<td>绘制多线段</td>
</tr>
<tr>
<td>M-x artist-select-op-straight-poly-line</td>
<td>绘制直线组成的多线段</td>
</tr>
<tr>
<td>M-x artist-select-op-ellipse</td>
<td>绘制椭圆</td>
</tr>
<tr>
<td>M-x artist-select-op-circle</td>
<td>绘制圆</td>
</tr>
<tr>
<td>M-x artist-select-op-text-see-thru</td>
<td>写字（插入模式）</td>
</tr>
<tr>
<td>M-x artist-select-op-text-overwrite</td>
<td>写字（覆盖模式）</td>
</tr>
<tr>
<td>M-x artist-select-op-spray-can</td>
<td>喷雾器</td>
</tr>
<tr>
<td>M-x artist-select-op-spray-set-size</td>
<td>设置喷雾器的大小</td>
</tr>
<tr>
<td>M-x artist-select-op-erase-char</td>
<td>擦除字符</td>
</tr>
<tr>
<td>M-x artist-select-op-erase-rectangle</td>
<td>擦除矩形内字符</td>
</tr>
<tr>
<td>M-x artist-select-op-vaporize-line</td>
<td>擦除一行</td>
</tr>
<tr>
<td>M-x artist-select-op-vaporize-lines</td>
<td>擦除所有相连的行</td>
</tr>
<tr>
<td>M-x artist-select-op-cut-rectangle</td>
<td>剪切矩形</td>
</tr>
<tr>
<td>M-x artist-select-op-copy-rectangle</td>
<td>复制矩形</td>
</tr>
<tr>
<td>M-x artist-select-op-paste</td>
<td>粘贴</td>
</tr>
<tr>
<td>M-x artist-select-op-flood-fill</td>
<td>填充</td>
</tr>
</tbody>
</table>
<p>有了以上的介绍，我将所有artist-mode的命令绘制为一张表格，再参考artist-mode的键绑定+自己绑定，键盘绘制会像用鼠标绘制一样顺手。</p>
<h3>artist变身</h3>
<p class="first">或许有人觉得artist-mode绘制出来的ascii图很不错，但是如果能变成图片或许更好；或者图片是一种硬性要求；或者由于不知道的原因，总有可能有需求将ascii变成图片呢？多一种选择总是好事。</p>
<p>好吧，<a href="http://emacser.com/emacs-ditaa.htm">传送门</a> 。</p>
<p class="footnote"><a class="footnum" name="fn.1" href="#fnr.1">1.</a> 我试验，此处并没有绘制正方形，难道是我的版本有问题，求确认。</p>
<p class="footnote"><a class="footnum" name="fn.2" href="#fnr.2">2.</a> 与<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup>相同，我仍然没有得到圆，得到的是椭圆</p>
<p class="footnote"><a class="footnum" name="fn.3" href="#fnr.3">3.</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/artist-mode.htm' t='用artist-mode画文本图' d='' tag='artist-mode,Emacs,emacser,emacser.com,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/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</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/evernote-mode.htm" title="Emacs中的Evernote: evernote-mode (2011年04月26日)">Emacs中的Evernote: evernote-mode</a> (67)</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/emacs-toolbar.htm" title="自定义Emacs工具栏 (2010年06月9日)">自定义Emacs工具栏</a> (23)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/artist-mode.htm/feed</wfw:commentRss>
		<slash:comments>57</slash:comments>
		</item>
	</channel>
</rss>

