<?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>Fri, 12 Aug 2011 12:56:25 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>使用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('p41868code6'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p418686"><td class="code" id="p41868code6"><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('p41868code7'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p418687"><td class="code" id="p41868code7"><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('p41868code8'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p418688"><td class="code" id="p41868code8"><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('p41868code9'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p418689"><td class="code" id="p41868code9"><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('p41868code10'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4186810"><td class="code" id="p41868code10"><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> (97)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (345)</li>
	<li><a href="http://emacser.com/emacs-gdb.htm" title="在Emacs中使用gdb调试程序 (2010年03月29日)">在Emacs中使用gdb调试程序</a> (40)</li>
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (44)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (185)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs_graphviz_ds.htm/feed</wfw:commentRss>
		<slash:comments>23</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> (345)</li>
	<li><a href="http://emacser.com/from-vi-to-emacs.htm" title="我是如何从vim转向Emacs的 (2010年04月27日)">我是如何从vim转向Emacs的</a> (54)</li>
	<li><a href="http://emacser.com/emacs-cpp-dev.htm" title="在Emacs下用C/C++编程 (2010年10月25日)">在Emacs下用C/C++编程</a> (33)</li>
	<li><a href="http://emacser.com/w3m.htm" title="Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页 (2009年11月23日)">Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页</a> (39)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (185)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/evernote-mode.htm/feed</wfw:commentRss>
		<slash:comments>49</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('p41801code13'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4180113"><td class="code" id="p41801code13"><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('p41801code14'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4180114"><td class="code" id="p41801code14"><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>34</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('p41783code26'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178326"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code26"><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('p41783code27'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178327"><td class="code" id="p41783code27"><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('p41783code28'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178328"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code28"><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('p41783code29'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178329"><td class="code" id="p41783code29"><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('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-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('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 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('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
7
8
9
10
11
12
13
14
15
16
17
18
</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> 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('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 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('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
7
8
9
10
11
12
13
14
15
16
17
18
</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> 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('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 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('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
19
20
21
22
23
24
25
26
</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> 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> (345)</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> (117)</li>
	<li><a href="http://emacser.com/mew.htm" title="用Mew收发邮件 (2010年05月21日)">用Mew收发邮件</a> (82)</li>
	<li><a href="http://emacser.com/built-in-cedet.htm" title="用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET (2010年05月10日)">用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET</a> (97)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/non-programmer.htm/feed</wfw:commentRss>
		<slash:comments>24</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> (54)</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> (49)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (345)</li>
	<li><a href="http://emacser.com/org-mode.htm" title="Emacs org mode学习笔记 (2010年10月18日)">Emacs org mode学习笔记</a> (59)</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的所有变量和函数 (44)
	我的Emacs配置文件 － DEA (345)
	用CEDET浏览和编辑C++代码 (185)
	Emacs才是世界上最强大的IDE － 用Emaci阅读文件 (88)
	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> (44)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (345)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (185)</li>
	<li><a href="http://emacser.com/emaci.htm" title="Emacs才是世界上最强大的IDE － 用Emaci阅读文件 (2010年04月12日)">Emacs才是世界上最强大的IDE － 用Emaci阅读文件</a> (88)</li>
	<li><a href="http://emacser.com/emacs-beginner-must-know.htm" title="Emacs初学者必知必会 (2010年01月24日)">Emacs初学者必知必会</a> (8)</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> (345)</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> (49)</li>
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (44)</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>56</slash:comments>
		</item>
		<item>
		<title>Emacs下的计算器 － calc</title>
		<link>http://emacser.com/calc.htm</link>
		<comments>http://emacser.com/calc.htm#comments</comments>
		<pubDate>Wed, 05 May 2010 02:43:56 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[初级]]></category>
		<category><![CDATA[calc]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[配色]]></category>

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



1 概述 
2 打开计算器 
3 基本运算 

3.1 逆波兰表达式 
3.2 基本运算符号 
3.3 代数运算 


4 数制转换 
5 三角运算 

5.1 逆波兰表达式下的运算符 
5.2 在代数模式下的运算符 
5.3 弧度制和角度制的转换 


6 向量运算与矩阵运算 
7 复制，删除，撤销 
8 定义函数 




1 概述 

&#8220;Calc&#8221; 是 emacs 自带的一个计算器，提供了许多方便的数值计算功能，可以让你在不离开 emacs 的情况下进行计算。但 calc 与 gnome 环境下的 gcalctool 或者 windows 自带的计算器不同，它不是一个掌上计算器的模拟程序，操作不像上述两个计算器那样直观，需要记忆一些指令，相应的，提供的功能也更加强大了一些。 




2 打开计算器 

&#8216;C-x * c&#8217;：打开计算器。
&#8216;C-x * t&#8217;：打开计算器，同时也打开 calc 的在线帮助。




3 基本运算 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="about.htm#yupeng" target="_blank"><span style="color: #0000ff;"><b>yupeng</b></span></a></p>
<div id="table-of-contents">
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 概述 </a></li>
<li><a href="#sec-2">2 打开计算器 </a></li>
<li><a href="#sec-3">3 基本运算 </a>
<ul>
<li><a href="#sec-3.1">3.1 逆波兰表达式 </a></li>
<li><a href="#sec-3.2">3.2 基本运算符号 </a></li>
<li><a href="#sec-3.3">3.3 代数运算 </a></li>
</ul>
</li>
<li><a href="#sec-4">4 数制转换 </a></li>
<li><a href="#sec-5">5 三角运算 </a>
<ul>
<li><a href="#sec-5.1">5.1 逆波兰表达式下的运算符 </a></li>
<li><a href="#sec-5.2">5.2 在代数模式下的运算符 </a></li>
<li><a href="#sec-5.3">5.3 弧度制和角度制的转换 </a></li>
</ul>
</li>
<li><a href="#sec-6">6 向量运算与矩阵运算 </a></li>
<li><a href="#sec-7">7 复制，删除，撤销 </a></li>
<li><a href="#sec-8">8 定义函数 </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-2">
<h3 id="sec-1">1 概述 </h3>
<div id="text-1">
<p>&#8220;Calc&#8221; 是 emacs 自带的一个计算器，提供了许多方便的数值计算功能，可以让你在不离开 emacs 的情况下进行计算。但 calc 与 gnome 环境下的 gcalctool 或者 windows 自带的计算器不同，它不是一个掌上计算器的模拟程序，操作不像上述两个计算器那样直观，需要记忆一些指令，相应的，提供的功能也更加强大了一些。 <span id="more-41266"></span>
</p>
</div>
</div>
<div id="outline-container-2" class="outline-2">
<h3 id="sec-2">2 打开计算器 </h3>
<div id="text-2">
<p>&#8216;C-x * c&#8217;：打开计算器。<br />
&#8216;C-x * t&#8217;：打开计算器，同时也打开 calc 的在线帮助。
</p>
</div>
</div>
<div id="outline-container-3" class="outline-2">
<h3 id="sec-3">3 基本运算 </h3>
<div id="text-3">
</div>
<div id="outline-container-3.1" class="outline-3">
<h4 id="sec-3.1">3.1 逆波兰表达式 </h4>
<div id="text-3.1">
<p>calc 按照逆波兰表达式的方式进行计算。比如，你要计算2+3的结果，要按照如下顺序在 calc 的 buffer 中输入：<br />
2 &lt;RET&gt; 3 &lt;RET&gt; + (&lt;RET&gt; 表示回车)<br />
假设，你当前输入了：<br />
1 &lt;RET&gt; 2 &lt;RET&gt; 3 &lt;RET&gt;<br />
然后，输入加号 &#8216;+&#8217;，那么 calc 将会计算 2+3 的结果， 并保持数字1不变，calc 的 buffer 中会剩下 1,5两个数字。此时，再次输入&#8217;+'， calc 会计算 1+5 的结果，此时 calc 的 buffer 中只剩下一个数字 ‘6’。<br />
很多时候，可以省略一个&lt;RET&gt;，比如计算2+3时，你可以省略第二个&lt;RET&gt;，只输入：<br />
2 &lt;RET&gt; 3 +
</p>
</div>
</div>
<div id="outline-container-3.2" class="outline-3">
<h4 id="sec-3.2">3.2 基本运算符号 </h4>
<div id="text-3.2">
<p>&#8216;+&#8217;：加号<br />
&#8216;-&#8217;：减号<br />
&#8216;*&#8217;：乘号<br />
&#8216;/&#8217;：除号<br />
&#8216;%&#8217;：取余，比如6%5=1, 30%4=2<br />
&#8216;&amp;&#8217;：取倒数<br />
&#8216;^&#8217;：幂运算，当然也可以用做开方运算，比如4^0.5=2
</p>
</div>
</div>
<div id="outline-container-3.3" class="outline-3">
<h4 id="sec-3.3">3.3 代数运算 </h4>
<div id="text-3.3">
<p>当我们只是想简单的对一系列数字进行代数运算时，使用逆波兰表达式不是很直观，因此， calc 提供了一个更加直接的指令：<br />
&#8216; （就是分号旁边的那个按键）<br />
比如，在 calc 中按“&#8217;”，然后输入算式：<br />
(3^2 + 4^2) ^ 0.5<br />
calc 会直接给出答案：5。
</p>
</div>
</div>
</div>
<div id="outline-container-4" class="outline-2">
<h3 id="sec-4">4 数制转换 </h3>
<div id="text-4">
<p>在 calc 中使用指令d2,d8,d0,d6可以在2进制，8进制，10进制，16进制之间切换（d2 就是先按&#8217;d'，再按&#8217;2&#8242;，其他也以此类推）。calc 默认是使用10进制进行计算。当进入2进制，8进制，16进制模式时，mode line上会给出&#8217;Bin&#8217;，&#8217;Otc&#8217;，&#8217;Hex&#8217;字样的提示，默认的10进制模式是不会有任何提示的。当进入任何一种进制模式的时候，输入的数字都是以10进制模式输入的。比如在16进制模式下，输入：<br />
10 &lt;RET&gt;<br />
此时，calc中显示的数字是&#8217;A'，而不是16进制的10。<br />
如果你想按照当前的进制输入数字，需要在键入数字前按‘#’，比如，在16进制模式下输入：<br />
#10 &lt;RET&gt;<br />
此时，calc中显示的数字就是16进制的10,而不是A。
</p>
</div>
</div>
<div id="outline-container-5" class="outline-2">
<h3 id="sec-5">5 三角运算 </h3>
<div id="text-5">
</div>
<div id="outline-container-5.1" class="outline-3">
<h4 id="sec-5.1">5.1 逆波兰表达式下的运算符 </h4>
<div id="text-5.1">
<p>S：正弦<br />
C：余弦<br />
T：正切<br />
比如，想计算30度角的正弦值，输入：<br />
30 &lt;RET&gt; S（可以省略 &lt;RET&gt;）<br />
calc 会给出答案：0.5
</p>
</div>
</div>
<div id="outline-container-5.2" class="outline-3">
<h4 id="sec-5.2">5.2 在代数模式下的运算符 </h4>
<div id="text-5.2">
<p>sin：正弦<br />
cos：余弦<br />
tan：正切<br />
比如，输入<br />
’sin(30)<sup>2</sup>+cos(30)<sup>2</sup><br />
我这里的calc给出答案：<br />
0.999999999999
</p>
</div>
</div>
<div id="outline-container-5.3" class="outline-3">
<h4 id="sec-5.3">5.3 弧度制和角度制的转换 </h4>
<div id="text-5.3">
<p>m r：进入弧度制（mode line 上显示 Rad）<br />
m d：进入角度制（mode line 上显示 Deg）
</p>
</div>
</div>
</div>
<div id="outline-container-6" class="outline-2">
<h3 id="sec-6">6 向量运算与矩阵运算 </h3>
<div id="text-6">
<p>输入向量与矩阵的方法很简单。<br />
比如，输入一个三维向量：<br />
[ 1 &lt;RET&gt; 2 &lt;RET&gt; 3 &lt;RET&gt; ]<br />
此时，calc 中就会显示：<br />
[1, 2, 3]<br />
（实际上最后一个&lt;RET&gt;可以省略）<br />
输入矩阵的方法与向量类似，比如，我们输入一个2&#215;2的矩阵：<br />
[ [ 1 &lt;RET&gt; 2 &lt;RET&gt; ] [ 3 &lt;RET&gt; 4 &lt;RET&gt; ] ]<br />
此时， calc 中会显示：<br />
[ [ 1, 2 ]<br />
[ 3, 4 ] ]<br />
calc中专门的矩阵运算法则我没有研究过，我自己平常会用到的，也就是矩阵求逆。只需输入一个矩阵，然后按“&amp;”就可以了（还记得“&amp;”么？如果对数字使用“&amp;”运算，就是求倒数，对于矩阵，就是求逆）。
</p>
</div>
</div>
<div id="outline-container-7" class="outline-2">
<h3 id="sec-7">7 复制，删除，撤销 </h3>
<div id="text-7">
<p>输入一个数字（或矩阵），然后按&lt;RET&gt;，可以复制该数字（或矩阵）到整个运算堆栈的最顶部。<br />
Backspace 或 Del 可以删除运算堆栈最顶部的数字（或矩阵）。<br />
用U或者C-_或者M-x calc-undo可以在计算器中执行撤销操作
</p>
</div>
</div>
<div id="outline-container-8" class="outline-2">
<h3 id="sec-8">8 定义函数 </h3>
<div id="text-8">
<p>在 calc 中你可以定义自己的函数。定义函数的指令是：<br />
Z F<br />
比如，先输入一个公式：<br />
&#8216;a + 2b<br />
然后键入：<br />
Z F m<br />
再回答几个 minibuffer 中提出的问题，就定义了一个以 &#8216;z m&#8217;为快捷键的函数了。<br />
此时，再输入两个数字：<br />
1 &lt;RET&gt; 2 &lt;RET&gt;<br />
然后按：<br />
z m<br />
就会按照公式计算出1+2*2的结果，也就是5。
</p>
<p>
使用指令：<br />
Z P<br />
可以把函数保存到文件，这样在以后的 emacs 会话中都可以使用这个函数。<br />
比如，输入：<br />
Z P m<br />
可以把刚才定义的函数&#8217;z m&#8217;保存到由变量 calc-settings-file 指定的文件中。以后每次进入 calc 时，保存在这只文件中的函数也会被自动加载。calc-settings-file 的默认值是&#8221;~/.calc.el&#8221;，我通常喜欢把它挪到.emacs.d 里面：</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('p41266code38'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4126638"><td class="code" id="p41266code38"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> calc-settings-file <span style="color: #ff0000;">&quot;~/.emacs.d/.calc.el&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</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/calc.htm' t='Emacs下的计算器 － calc' d='' tag='calc,Emacs,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> (97)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (185)</li>
	<li><a href="http://emacser.com/smart-start-emacs.htm" title="智能的启动Emacs (2010年05月4日)">智能的启动Emacs</a> (5)</li>
	<li><a href="http://emacser.com/windows-emacs-home.htm" title="Windows下设置Emacs的HOME目录 (2010年04月22日)">Windows下设置Emacs的HOME目录</a> (45)</li>
	<li><a href="http://emacser.com/emacs-23-2-release.htm" title="GNU Emacs 23.2发布 (2010年05月9日)">GNU Emacs 23.2发布</a> (32)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/calc.htm/feed</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Emacs中鼠标的运用</title>
		<link>http://emacser.com/mouse.htm</link>
		<comments>http://emacser.com/mouse.htm#comments</comments>
		<pubDate>Tue, 06 Apr 2010 01:37:39 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[其他]]></category>
		<category><![CDATA[初级]]></category>
		<category><![CDATA[ann]]></category>
		<category><![CDATA[ann77]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[ctrl]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[王纯业]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[鼠标]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41112</guid>
		<description><![CDATA[作者: 王纯业

默认配置
用鼠标左键 click 一个位置，可以以移动光标到这个位置，这是最基本，也是最自然的功能了。

?View Code LISP1
2
&#40;global-set-key &#40;kbd &#34;&#60;mouse-1&#62;&#34;&#41; 'mouse-set-point&#41;
&#40;global-set-key &#40;kbd &#34;&#60;down-mouse-1&#62;&#34;&#41; 'mouse-drag-region&#41;

这段代码不用放在配置文件中，因为默认配置就是这样。
尽管是默认配置，我还是把他们写出了，因为有的时候我们想改变默认配置。把默认的功能对应到其他的按键方式上去。
鼠标左键的功能
用鼠标选择 region
左键的拖拉，可以选择一片区域，这片选择的region 就自动拷贝起来。以后可以用 C-y 把选择的 region 粘贴出来。此时 down-mouse-1 事件和 mouse-drag-region 帮定在一起。
如果拖拉到窗口的外面，那么会自动滚动窗口中的内容，直到你选择到你要的位置，这样就可以选择到超过一个屏幕范围的内容了。
用鼠标选择一个语法单元
如果 double click 左键，那么就会根据点取位置上的内容，来选择不同的内容。
如果点取的字符是一个 &#34;symbol&#34; 的语法，那么就会选择一个symbol 。 这样说有一些过于技术性的描述了。
我们知道， Emacs 支持很多 mode ，例如 c mode, c++ mode , lisp mode 等等等等， 每一个 mode 都定义不同的语法。 例如lisp mode 下 &#8220;-&#8221; 可以作为 symbol 的名字，在 c mode 下， &#8220;_&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="about.htm#ann77" target="_blank"><span style="color: #0000ff;"><b>王纯业</b></span></a></p>
<p><img class="alignright" title="mouse" src="screenshots/mouse.gif"/></p>
<h3>默认配置</h3>
<p>用鼠标左键 click 一个位置，可以以移动光标到这个位置，这是最基本，也是最自然的功能了。<span id="more-41112"></span></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('p41112code51'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111251"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41112code51"><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;&lt;mouse-1&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'mouse-set-point<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;&lt;down-mouse-1&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'mouse-drag-region<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这段代码不用放在配置文件中，因为默认配置就是这样。<br />
尽管是默认配置，我还是把他们写出了，因为有的时候我们想改变默认配置。把默认的功能对应到其他的按键方式上去。</p>
<h4>鼠标左键的功能</h4>
<h5>用鼠标选择 region</h5>
<p>左键的拖拉，可以选择一片区域，这片选择的region 就自动拷贝起来。以后可以用 C-y 把选择的 region 粘贴出来。此时 down-mouse-1 事件和 mouse-drag-region 帮定在一起。<br />
如果拖拉到窗口的外面，那么会自动滚动窗口中的内容，直到你选择到你要的位置，这样就可以选择到超过一个屏幕范围的内容了。</p>
<h5>用鼠标选择一个语法单元</h5>
<p>如果 double click 左键，那么就会根据点取位置上的内容，来选择不同的内容。<br />
如果点取的字符是一个 &quot;symbol&quot; 的语法，那么就会选择一个symbol 。 这样说有一些过于技术性的描述了。</p>
<p>我们知道， Emacs 支持很多 mode ，例如 c mode, c++ mode , lisp mode 等等等等， 每一个 mode 都定义不同的语法。 例如lisp mode 下 &#8220;-&#8221; 可以作为 symbol 的名字，在 c mode 下， &#8220;_&#8221; 下划线可以作为变量的名字。他们的 如果你双击在这个这样的字符上，那么就会选择整个变量名字。 具体来说，假如是在c mode 下，有一个变量 &#8220;m_a_big_number&#8221; ，如果双击在在下划线上，那么选择整个变量名称，如果双击在一个, 例如 n , 那么选择的就是这个字母所在的单词上，就是 number 。</p>
<p>如果点取的字符是一个括号的话，那么就会选取这个括号扩住的部<br />
分。 例如在 c mode 下 .</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41112code52'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111252"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41112code52"><pre class="c" style="font-family:monospace;"><span style="color: #b1b100;">for</span><span style="color: #009900;">&#40;</span>i<span style="color: #339933;">=</span><span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>i<span style="color: #339933;">&lt;</span><span style="color: #0000dd;">100</span><span style="color: #339933;">;</span>i<span style="color: #339933;">++</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Hello World&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>点取 &#8220;{&#8221; 就会选择到另一个 &#8220;}&#8221; 的部分，同样道理应用于单引号双，双引号，中括号，圆括号。</p>
<h5>选择一行文字</h5>
<p>快速三次连续点击左键。</p>
<h5>来点高难动作</h5>
<p>双击加拖拉， 分解动作是 down up down move up . 可以以单词的边界来选择 region 。类似于 touch pad 的笔记本触摸鼠标的拖拉.</p>
<p>三击加拖拉，分解动作时 down up down up down move up. 可以按行来选择 region 。</p>
<h4>鼠标中键的功能</h4>
<h5>粘贴</h5>
<p>click 鼠标中键，可以在鼠标所点的位置粘贴文字。</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('p41112code53'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111253"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p41112code53"><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;&lt;mouse-2&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'mouse-yank-at-click<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这段代码不用放在配置文件中，因为默认配置就是这样。</p>
<h5>点取对象</h5>
<p>在有些 buffer 中，不能修改 buffer 的内容，那么就鼠标中键的上面所说的作用也就没有什么意义了，于是，一般都把他们帮定在一个类似于按回车的功能上，例如自动补齐的时候，帮助等等。有点类似于浏览器的左键的功能，点击了一个超连接。</p>
<h4>鼠标右键的功能</h4>
<p>第一次 click 后，把 mark 设置在鼠标点过的位置，选择一个region , 也就是类似鼠标左键的拖拉。</p>
<p>第二次 click 后，如果 click 的位置和上一次的一样，那么完成的是剪切上一次选中的内容。如果 click 的位置和上一次不一样，那么完成的功能是重新选择一个 region  .</p>
<p>也就是说，连续两次用鼠标右键选择相同的 region ，可以 cut 掉这个 region 。</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('p41112code54'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111254"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p41112code54"><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;&lt;mouse-3&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'mouse-save-then-kill<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这段代码不用放在配置文件中，因为默认配置就是这样。</p>
<h4>其他</h4>
<h5>Ctrl + 点击左键</h5>
<p>按住 Ctrl 点击鼠标左键，可以调出一个菜单，这个菜单按 mode 分组选择切换 buffer 。</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('p41112code55'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111255"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p41112code55"><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;&lt;C-down-mouse-1&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'mouse-buffer-menu<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这段代码不用放在配置文件中，因为默认配置就是这样。<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('p41112code56'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111256"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41112code56"><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;&lt;C-down-mouse-1&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;; 去掉原来的帮定关系</span>
 <span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-mouse-1&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'mouse-buffer-menu<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<h5>Shift + 单击左键</h5>
<p>可以选择字体。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41112code57'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111257"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p41112code57"><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;&lt;S-down-mouse-1&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'mouse-set-font<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这段代码不用放在配置文件中，因为默认配置就是这样。<br />
我认为这个功能不常用，可以用来帮定到其他的功能上去。</p>
<h5>Alt + 鼠标</h5>
<p>这里的很多功能都是和 secondary selection 有关的,如果不常用 secondary selection 的话,可以考虑把这些键帮定在其他功能上.</p>
<h5>Ctrl + 鼠标右键</h5>
<p>可以调出和编辑功能相关的功能菜单.</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41112code58'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111258"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p41112code58"><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;&lt;C-down-mouse-2&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'mouse-popup-menuar-stuff<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这段代码不用放在配置文件中，因为默认配置就是这样。</p>
<h3>非默认配置</h3>
<h4>没有滚轴鼠标的朋友看过来.</h4>

<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('p41112code59'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111259"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41112code59"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'mouse-drag<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;&lt;S-down-mouse-1&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'mouse-drag-<span style="color: #b1b100;">throw</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这个功能类似于在 IE 中单击滚轴鼠标的中键,然后出现一个图案,移动鼠标就可以滚动窗口中的内容, 滚动的速度可以和鼠标离图案的远近有关系.  这里是帮定了 Shift + 拖动鼠标左键.</p>
<p>如果觉得不太习惯滚动方向,可以用下面的语句调整滚动方向.</p>

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

<p>下面的功能类似于 acrobat 中的手的功能,可以用鼠标移动来滚动内容.</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('p41112code61'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111261"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41112code61"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'mouse-drag<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;&lt;S-down-mouse-1&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'mouse-drag-drag<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>同样，这里帮定了 Shift + 拖动鼠标左键。</p>
<h4>用鼠标快速 copy ,cut , paste</h4>

<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('p41112code62'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4111262"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41112code62"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'mouse-copy<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span>M-down-mouse-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> 'mouse-drag-secondary-pasting<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span>M-S-down-mouse-<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#93;</span> 'mouse-drag-secondary-moving<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>使用方法，把光标移动到要粘贴的地方，然后用按住 Alt + 拖拉鼠标, 选择要拷贝的部分, 抬起鼠标,选择的部分就粘贴到了光标所在位置. 也就是说,一个动作完成 copy &amp; paste 的工作,而且不改变 kill ring 的内容, 用 windows 的术语是剪切板. 和上面的方法类似, 如果按住 Alt + Shift + 拖动鼠标,那么就会完成 cut &amp; paste 的功能.</p>
<p>前面介绍过用鼠标双击可以选择单词(根据字母的语法性质),可以按照词语边界选择(双击+拖动), 可以选择多行 (三击+ 拖动), 这些选择方式在这里都是一样的工作.</p>
<p>这个功能在编写程序的时候十分有用,我们经常需要移动一块代码, 而且移动到的位置也是很近的地方. 或者拷贝附近的一段代码.</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/mouse.htm' t='Emacs中鼠标的运用' d='' tag='ann,ann77,C/C++,ctrl,Emacs,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/torture-emacs.htm" title="折腾Emacs (2010年08月17日)">折腾Emacs</a> (111)</li>
	<li><a href="http://emacser.com/w3m.htm" title="Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页 (2009年11月23日)">Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页</a> (39)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (345)</li>
	<li><a href="http://emacser.com/from-vi-to-emacs.htm" title="我是如何从vim转向Emacs的 (2010年04月27日)">我是如何从vim转向Emacs的</a> (54)</li>
	<li><a href="http://emacser.com/emacs-gdb.htm" title="在Emacs中使用gdb调试程序 (2010年03月29日)">在Emacs中使用gdb调试程序</a> (40)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/mouse.htm/feed</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>ERC使用简介</title>
		<link>http://emacser.com/erc.htm</link>
		<comments>http://emacser.com/erc.htm#comments</comments>
		<pubDate>Mon, 22 Mar 2010 05:37:47 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[ahei]]></category>
		<category><![CDATA[ann]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emms]]></category>
		<category><![CDATA[erc]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[text]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[补全]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[颜色]]></category>

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

ERC, emacs irc client, 即是 emacs 里登录 irc 的客户端。irc 是什么? internet relay chat, 简单地说，就是用于群聊的。一帮无聊的 geeks 成天没事干，就在上面灌水，所以上面的 channel 技术类的占绝大数，比如 emacs, c++, debian, scheme 等等。
好，开始 ERC 之旅，先让我们登录到 #emacs-cn 上去：
a) M-x erc-select
   host: irc.debian.org
   port: 6667 到 7000 随便用一个
   username: 先随便填一个，比如 foo
   password: 还没注册的可以直接回车
b) 这时候你就进入了一个名字类似 &#8220;irc.debian.org:6669&#8243; 的 server buffer. [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="about.htm#xwl" target="_blank"><span style="color: #0000ff;"><b>xwl</b></span></a></p>
<p><img class="alignright" title="ERC" src="screenshots/erc-logo.jpg"/></p>
<p>ERC, emacs irc client, 即是 emacs 里登录 irc 的客户端。irc 是什么? internet relay chat, 简单地说，就是用于群聊的。一帮无聊的 geeks 成天没事干，就在上面灌水，所以上面的 channel 技术类的占绝大数，比如 emacs, c++, debian, scheme 等等。<span id="more-41039"></span></p>
<p>好，开始 ERC 之旅，先让我们登录到 #emacs-cn 上去：</p>
<p>a) M-x erc-select</p>
<p>   host: irc.debian.org<br />
   port: 6667 到 7000 随便用一个<br />
   username: 先随便填一个，比如 foo<br />
   password: 还没注册的可以直接回车</p>
<p>b) 这时候你就进入了一个名字类似 &#8220;irc.debian.org:6669&#8243; 的 server buffer. 接着执行：</p>
<p>     ERC> /join #emacs-cn</p>
<p>   就进入 #emacs-cn channel 啦!</p>
<p>c) 如何注册</p>
<p>   切换到刚才那个 server buffer, 输入：</p>
<p>     ERC> /msg nickserv help register</p>
<p>   按着提示一步一步来就行，根据 irc server 的不同，有些会需要你用有效邮箱来确认一下。注册 id 的好处就是，这个 id 就不会被别人抢走了，比如有人已经用 foo 登录了，但这被你注册了，你连进去的时候，就能把名字抢过来，而对方可能会变成 foo` 之类的别名。</p>
<p>以上其实对于所有 irc client 来讲都是通用的。接下来是我的 ERC 一些配置供参考：</p>
<p>1. 基本设置</p>
<p>   编码，尽量 utf-8 (#emacs-cn 也是用 utf-8):</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('p41039code74'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4103974"><td class="code" id="p41039code74"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> erc-default-coding-system '<span style="color: #66cc66;">&#40;</span>utf-<span style="color: #cc66cc;">8</span> <span style="color: #66cc66;">.</span> utf-<span style="color: #cc66cc;">8</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>   如果某个 channel 是别的编码，也可以单独设置，例如国内某个 irc server 上 #linuxfire 就是用 gbk 编码，我们单独为它设置：</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('p41039code75'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4103975"><td class="code" id="p41039code75"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> erc-encoding-coding-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;#linuxfire&quot;</span> <span style="color: #66cc66;">.</span> chinese-iso-8bit<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>   设置 nick, 全名: nick 就是登录时用的，full name 是别人查询你的时候显示的信息。(类似BBS 的 C-a )</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('p41039code76'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4103976"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41039code76"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> erc-nick <span style="color: #ff0000;">&quot;xwl&quot;</span>
      erc-user-full-<span style="color: #b1b100;">name</span> <span style="color: #ff0000;">&quot;William Xu&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>2. 登录后自动加入预定的 channels</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('p41039code77'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4103977"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41039code77"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>erc-autojoin-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> erc-autojoin-channels-alist
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;oftc.net&quot;</span>                 <span style="color: #808080; font-style: italic;">; debian.org 是它的别名</span>
         <span style="color: #ff0000;">&quot;#debian-zh&quot;</span>
         <span style="color: #ff0000;">&quot;#emacs-cn&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>3. 连接服务器或进入聊天室后自动执行预设操作<br />
   ERC 提供各种各样的 hook 让你在某个操作（登入 server, 进入channel等）之后执行一些你预设的操作。比如如果你有某个 channel 的管理员权限，可以在加入聊天室时自动转换到管理员身份：</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('p41039code78'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4103978"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41039code78"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> xwl-erc-auto-op <span style="color: #66cc66;">&#40;</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>b <span style="color: #66cc66;">&#40;</span>buffer-<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><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> b <span style="color: #ff0000;">&quot;#emacs-cn&quot;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>erc-message <span style="color: #ff0000;">&quot;PRIVMSG&quot;</span> <span style="color: #66cc66;">&#40;</span>concat <span style="color: #ff0000;">&quot;chanserv op &quot;</span> b<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>add-hook 'erc-join-hook 'xwl-erc-auto-op<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>4. 过滤信息<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('p41039code79'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4103979"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41039code79"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>erc-match-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> erc-keywords '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;emms&quot;</span> <span style="color: #ff0000;">&quot;python&quot;</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> erc-pals '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;rms&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>  相反地，如果你对某些消息不感兴趣，比如有人进来啦，有人出去啦，如此这般一下就不会看到了：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41039code80'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4103980"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41039code80"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> erc-ignore-<span style="color: #b1b100;">list</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> erc-hide-<span style="color: #b1b100;">list</span>
      '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;JOIN&quot;</span> <span style="color: #ff0000;">&quot;PART&quot;</span> <span style="color: #ff0000;">&quot;QUIT&quot;</span> <span style="color: #ff0000;">&quot;MODE&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>5. 新信息提醒</p>
<p>   信息一般可分为三种：</p>
<p>   1) 某人悄悄跟你说话(即所谓的 private message)，这会打开一个新小窗，即 buffer.</p>
<p>      ERC>/msg NICK how are you doing</p>
<p>   2) 某人公开地跟你说话，即别的在 channel 里的人也能看到。一般来说，习惯用 nick加 `:&#8217; 表示。(要输入某人 nick 的时候，首字母加 TAB 就能帮你补全，一次不行，多 TAB 几次可以选择)</p>
<p>      &lt;xwl&gt; ahei: 你可以 match regexp,</p>
<p>   3) 别的情形。</p>
<p>   ERC 会通过 erc-modified-channels-object 来设置 mode line，提示有新消息，类似：</p>
<p>       [#o: 38, #emacs-cn: 5]</p>
<p>   为什么要区分以上三种情形呢? 因为我们可以对不同信息，用不同的颜色在mode line 来提示，这样方便你决定是不是要及时地去查阅这条消息。</p>
<p>   ERC 本身只在 mode line 提示新消息，如果你切换到别的程序去了，比如在firefox 里看 ppmm，还想被提醒的话，可以借助一些外部工具来实现。mac 下用 growl，linux 可以用 zenity，windows 不知有什么类似工具? 给个例子：</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('p41039code81'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4103981"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code" id="p41039code81"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> xwl-erc-text-matched-hook <span style="color: #66cc66;">&#40;</span>match-type nickuserhost message<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Shows a growl notification, when user's nick was mentioned.
     If the buffer is currently not visible, makes it sticky.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span>erc-match-current-nick-p nickuserhost message<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span>string-match <span style="color: #66cc66;">&#40;</span>regexp-opt '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Users&quot;</span>
                                              <span style="color: #ff0000;">&quot;User&quot;</span>
                                              <span style="color: #ff0000;">&quot;topic set by&quot;</span>
                                              <span style="color: #ff0000;">&quot;Welcome to &quot;</span>
                                              <span style="color: #ff0000;">&quot;nickname&quot;</span>
                                              <span style="color: #ff0000;">&quot;identified&quot;</span>
                                              <span style="color: #ff0000;">&quot;invalid&quot;</span>
                                              <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                                message<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;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>s <span style="color: #66cc66;">&#40;</span>concat <span style="color: #ff0000;">&quot;ERC: &quot;</span> <span style="color: #66cc66;">&#40;</span>buffer-<span style="color: #b1b100;">name</span> <span style="color: #66cc66;">&#40;</span>current-buffer<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;">case</span> system-type
        <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>darwin<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>xwl-growl s message<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>
&nbsp;
<span style="color: #66cc66;">&#40;</span>add-hook 'erc-text-matched-hook 'xwl-erc-text-matched-hook<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> xwl-growl <span style="color: #66cc66;">&#40;</span>title message<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>start-process <span style="color: #ff0000;">&quot;growl&quot;</span> <span style="color: #ff0000;">&quot; growl&quot;</span> growlnotify-command title <span style="color: #ff0000;">&quot;-a&quot;</span> <span style="color: #ff0000;">&quot;Emacs&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>process-send-string <span style="color: #ff0000;">&quot; growl&quot;</span> message<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>process-send-string <span style="color: #ff0000;">&quot; growl&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>process-send-eof <span style="color: #ff0000;">&quot; growl&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>6. 时间戳</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('p41039code82'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4103982"><td class="code" id="p41039code82"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>erc-timestamp-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>   下面这个变量可以控制时间戳的显示方式，比如位置什么的，默认值：</p>

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

<p>7. log<br />
   我们可以将 channel 里的聊天记录都保存下来，方便日后查询，或者有时候你的 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('p41039code84'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4103984"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p41039code84"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'erc-log<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>erc-log-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> erc-log-channels-directory <span style="color: #ff0000;">&quot;~/var/erc/&quot;</span>
      erc-save-buffer-on-part t
      erc-log-file-coding-system 'utf-<span style="color: #cc66cc;">8</span>
      erc-log-write-after-send t
      erc-log-write-after-insert t<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>unless <span style="color: #66cc66;">&#40;</span>file-exists-p erc-log-channels-directory<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>mkdir erc-log-channels-directory t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>最后，ERC 上 irc 还是蛮舒服的，因为所有的、你熟悉的 emacs 编辑命令都在那里! 国内 irc 用户还是少了点，对岸台湾倒是蛮多的。大家有空就上来玩吧~ 要是想看我的配置可以在 github.com 上看我的配置文件：</p>
<p><a href="http://github.com/xwl/xwl-emacs-config/blob/master/.emacs.d/site-lisp/config/xwl-erc.el">http://github.com/xwl/xwl-emacs-config/blob/master/.emacs.d/site-lisp/config/xwl-erc.el</a></p>
<p>贴个图：<br />
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/erc.png" rel="lightbox"><img src="screenshots/thumbs/thumbs_erc.png" width="150" height="150" /></a><p class="wp-caption-text">Emacs中的IRC</p></div></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/erc.htm' t='ERC使用简介' d='' tag='ahei,ann,C/C++,Emacs,emms,erc,IDE,irc,org,python,screenshot,text,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> (345)</li>
	<li><a href="http://emacser.com/emacs-beginner-must-know.htm" title="Emacs初学者必知必会 (2010年01月24日)">Emacs初学者必知必会</a> (8)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (185)</li>
	<li><a href="http://emacser.com/from-vi-to-emacs.htm" title="我是如何从vim转向Emacs的 (2010年04月27日)">我是如何从vim转向Emacs的</a> (54)</li>
	<li><a href="http://emacser.com/emacs.htm" title="Emacs长啥样 (2009年11月5日)">Emacs长啥样</a> (15)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/erc.htm/feed</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
	</channel>
</rss>

