<?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-middle.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中使用twitter/新浪微博</title>
		<link>http://emacser.com/twittering-mode.htm</link>
		<comments>http://emacser.com/twittering-mode.htm#comments</comments>
		<pubDate>Tue, 10 May 2011 14:33:34 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[好玩的]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[状态栏]]></category>
		<category><![CDATA[配色]]></category>

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

* 新手上路


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


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


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


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


启动时默认打开的 timeline.
(setq twittering-initial-timeline-spec-string `(&#8220;:home@sina&#8221;
                    [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="about.htm#xwl" target="_blank"><span style="color: #0000ff;"><b>xwl</b></span></a></p>
<p>想在 Emacs 里登录 twitter, weibo&#8230; 吗？试一下 twittering-mode.el 吧！它目前支持同时登录<br />
twitter, sina weibo, douban&#8230;(这里指的是我 fork 的版本），先上图：<span id="more-41840"></span></p>
<div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/twittering-mode.png" rel="lightbox"><img src="https://dea.googlecode.com/svn/trunk/screenshots/thumbs/thumbs_twittering-mode.png" height="150"/></a><p class="wp-caption-text">cflow</p></div>
<h1>* 新手上路</h1>
<ol>
<li>
<p>require it, 下载链接在最后面</p>
<p>(require &#8216;twittering-mode)</p>
</li>
<li>
<p>避免每次都需要输入密码 (需要安装 gpg )</p>
<p>(setq twittering-use-master-password t)</p>
</li>
<li>
<p>一些网站（如 sina）不喜欢 SSL.</p>
<p>(setq twittering-allow-insecure-server-cert t)<br />
(setq twittering-oauth-use-ssl nil)<br />
(setq twittering-use-ssl nil)</p>
</li>
<li>
<p>状态栏上显示未读推数；显示头像</p>
<p>(twittering-enable-unread-status-notifier)<br />
(setq-default twittering-icon-mode t)</p>
</li>
<li>
<p>启动时默认打开的 timeline.</p>
<p>(setq twittering-initial-timeline-spec-string `(&#8220;:home@sina&#8221;<br />
                                                 ; &#8220;:home@douban&#8221;<br />
                                                 ))</p>
</li>
<li>
<p>来吧: M-x twit</p>
</li>
</ol>
<h1>* 玩转推特</h1>
<p>以下是一些基本操作, 相關快捷鍵可參閱 mode help (F1 m) 或自行定義:</p>
<ol>
<li>
<p>发推：M-x twittering-update-status-interactive</p>
</li>
<li>
<p>轉發: M-x twittering-retweet</p>
</li>
<li>
<p>加評論轉發: M-x twittering-organic-retweet</p>
</li>
<li>
<p>評論: M-x twittering-reply-to-user</p>
</li>
<li>
<p>查看某個 timeline: M-x twittering-other-user-timeline 或 twittering-visit-timeline</p>
</li>
<li>
<p>Follow/Unfollow: M-x twittering-follow, M-x twittering-unfollow</p>
</li>
<li>
<p>收藏: M-x twittering-favorite</p>
</li>
</ol>
<p>代码位于：<a href="https://github.com/xwl/twittering-mode">https://github.com/xwl/twittering-mode</a>, 欢迎上 #<a href="mailto:emacs-cn@irc.debian.org">emacs-cn@irc.debian.org</a> 来讨论。</p>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/twittering-mode.htm' t='在Emacs中使用twitter/新浪微博' d='' tag='Emacs,irc,org,screenshot,状态栏,配色' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/svn-status-mode-line.htm" title="在mode-line上标记svn状态 (2010年01月28日)">在mode-line上标记svn状态</a> (30)</li>
	<li><a href="http://emacser.com/erc.htm" title="ERC使用简介 (2010年03月22日)">ERC使用简介</a> (41)</li>
	<li><a href="http://emacser.com/emacs.htm" title="Emacs长啥样 (2009年11月5日)">Emacs长啥样</a> (15)</li>
	<li><a href="http://emacser.com/emacs-ditaa.htm" title="Emacs中绘图 － ditaa篇 (2010年08月4日)">Emacs中绘图 － ditaa篇</a> (34)</li>
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (44)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/twittering-mode.htm/feed</wfw:commentRss>
		<slash:comments>66</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>Org-mode写作的几个快捷方式</title>
		<link>http://emacser.com/org-mode-tricks.htm</link>
		<comments>http://emacser.com/org-mode-tricks.htm#comments</comments>
		<pubDate>Tue, 11 Jan 2011 03:00:18 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[Org Mode]]></category>
		<category><![CDATA[中级]]></category>

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

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


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


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


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




1 skeleton 

1.1 iexp 
1.2 isrc 
1.3 iprop 
1.4 ihtml 


2 eLisp 

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41795code24'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179524"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p41795code24"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-skeleton 1exp 
  <span style="color: #ff0000;">&quot;Input #+BEGIN_EXAMPLE #+END_EXAMPLE in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #ff0000;">&quot;#+BEGIN_EXAMPLE<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #ff0000;">&quot;#+END_EXAMPLE&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev org-mode-abbrev-table <span style="color: #ff0000;">&quot;iexp&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> '1exp<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

#+END_EXAMPLE
</pre>
</div>
</div>
<div id="outline-container-1_2" class="outline-4">
<h4 id="sec-1_2"><span class="section-number-4">1.2</span> isrc </h4>
<div class="outline-text-4" id="text-1_2">

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41795code25'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179525"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p41795code25"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-skeleton 1src 
  <span style="color: #ff0000;">&quot;Input #+begin_src #+end_src in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #ff0000;">&quot;#+begin_src lisp <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #ff0000;">&quot;#+end_src&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev org-mode-abbrev-table <span style="color: #ff0000;">&quot;isrc&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> '1src<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
上面这个 skeleton和 iexp 非常类似， 只是扩展出来的是 org-mode 的代码片段，使用方式是输入 isrc， 同样会把光标定位在两行的中间，等待用户输入代码。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41795code26'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179526"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41795code26"><pre class="lisp" style="font-family:monospace;">#+begin_src lisp 
&nbsp;
#+end_src</pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-1_3" class="outline-4">
<h4 id="sec-1_3"><span class="section-number-4">1.3</span> iprop </h4>
<div class="outline-text-4" id="text-1_3">

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41795code27'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179527"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p41795code27"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-skeleton 1prop 
  <span style="color: #ff0000;">&quot;Input :PROPERTIES: :END: in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #66cc66;">&gt;</span><span style="color: #ff0000;">&quot;:PROPERTIES:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #66cc66;">&gt;</span> _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #66cc66;">&gt;</span><span style="color: #ff0000;">&quot;:END:&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev org-mode-abbrev-table <span style="color: #ff0000;">&quot;iprop&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> '1prop<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

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

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

&lt;/pre&gt;
#+END_HTML
</pre>
<p>
上次发稿的时候由于忘记了这个 Skeleton，所有的代码、样例全都写成了 org-mode 默认的标签，完成之后才想起来，然后又手工删除并补写了 Emacser.com 需要的标签，再然后，相信我不说你们也猜的出来了，惨痛的的教训啊！！！ 以后一定要记得用 Skeleton 啊。
</p>
</div>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> eLisp </h3>
<div class="outline-text-3" id="text-2">
<p>
俗话说，“一张白纸好作画”。白纸一张的日子毕竟不会是生活的全部。当纸已经变得不白的时候，当那些代码、样例都已经在那里了的时候，我们总不能当一切的一切都已经“不可挽回”的时候，我们就需要借助 eLisp 的处理能力，让我们在已经选择的道路上面能够走得更好。解决思路，面对现实。承认已经存在的现实，把该补的东西补上去就是了。只要这个活儿是 Emacs 干，不是我们干，那就不是问题。
</p>
</div>
<div id="outline-container-2_1" class="outline-4">
<h4 id="sec-2_1"><span class="section-number-4">2.1</span> iexp </h4>
<div class="outline-text-4" id="text-2_1">

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41795code28'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179528"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41795code28"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> iexp <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Enclose example for org-mode&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;%s %s&quot;</span> beg end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>i-babel-<span style="color: #b1b100;">quote</span> beg end <span style="color: #ff0000;">&quot;#+BEGIN_EXAMPLE&quot;</span> <span style="color: #ff0000;">&quot;#+END_EXAMPLE&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
这个函数对应于上面的 iexp Skeleton。使用的时候，选中要处理的样例片段，然后输入 <code>M-x iexp</code> ，即可在选中的样例两端加入相应的内容。
</p>
<p>
例如下面这样的内容
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41795code29'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179529"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p41795code29"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require-extensions 'require
 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> 
  'tabbar 
  'switch-window
  'thing-edit
  'second-sel
  'browse-kill-ring+
<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
通过  <code>M-x iexp</code> 命令，就会变成这样的内容
</p>
<pre class="example">
#+BEGIN_EXAMPLE
(require-extensions 'require
 (list
  'tabbar
  'switch-window
  'thing-edit
  'second-sel
  'browse-kill-ring+
))
#+END_EXAMPLE
</pre>
</div>
</div>
<div id="outline-container-2_2" class="outline-4">
<h4 id="sec-2_2"><span class="section-number-4">2.2</span> isrc </h4>
<div class="outline-text-4" id="text-2_2">
<p>
同样的道理应用在 isrc 函数上面。 这个函数对应上面的 isrc skeleton。同样也是选中要处理的样例片段，然后输入 <code>M-x isrc</code> ，即可在选中的样例两端加入相应的内容。在这个里面有一个小小的设计，就是处理完成之后光标会被定位在 <code>#+begin_src</code> 的后面，方便输入编程语言的名称。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41795code30'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179530"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41795code30"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> isrc <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Enclose code for org-mode&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;%s %s&quot;</span> beg end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>i-babel-<span style="color: #b1b100;">quote</span> beg end <span style="color: #ff0000;">&quot;#+begin_src &quot;</span> <span style="color: #ff0000;">&quot;#+end_src&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

         (concat "&lt;/pre&gt;\n" "#+END_HTML\n")
         )))
</pre>
</div>
</div>
<div id="outline-container-2_4" class="outline-4">
<h4 id="sec-2_4"><span class="section-number-4">2.4</span> base function </h4>
<div class="outline-text-4" id="text-2_4">
<p>
最后还是依照以前的惯例，在介绍完出镜的美女以后，让我们来认识一下踏实干活、默默奉献的基础函数吧。所有上面的函数都是通过这个基础函数完成补全的工作的。让我们为这个函数鼓掌。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41795code31'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179531"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p41795code31"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> i-babel-<span style="color: #b1b100;">quote</span> <span style="color: #66cc66;">&#40;</span>beg end str1 str2<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>goto-char end<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>forward-line <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert str2<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>newline<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>goto-char beg<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>forward-line -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>newline<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert str1<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-2_5" class="outline-4">
<h4 id="sec-2_5"><span class="section-number-4">2.5</span> i= </h4>
<div class="outline-text-4" id="text-2_5">
<p>
最后的最后，再饶一个小小的函数。这个函数是处理行内(inline)代码的。说白了就是在所选文字的首尾加上一组等于号。就这么简单个事情，如果处理的数量多的时候也是一个不小的负担。尤其是当文章已经写好，或者是处理拷贝过来的的内容的时候。
</p>
<p>
使用方法和上面的函数一样，选中所需的内容，然后输入 <code>M-x i=</code> 就一切就都处理完毕了。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41795code32'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4179532"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code" id="p41795code32"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> i<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>insert <span style="color: #ff0000;">&quot;=&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char beg<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>insert <span style="color: #ff0000;">&quot;=&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>+ end <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

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

&amp;lt;/pre&amp;gt;
&amp;#35;+END_HTML
&amp;lt;/pre&amp;gt;
&amp;#35;+END_HTML
</pre>
<p>
这种方式的问题主要是需要手工修改的地方多了一些。后来 ahei 提出完全可以把 <code>#+BEGIN_HTML</code> 和 <code>&lt;pre&gt;</code> 的部分去掉，直接使用 <code>:</code> 转义代码/样例本身就行了。
</p>
<pre class="example">
: #+BEGIN_HTML
: &lt;pre lang="lisp" line="1"&gt;
:
: &lt;/pre&gt;
: #+END_HTML
</pre>
<p>
当然还是这种最简单，注意 <code>:</code> 后面的空格。前提是不要  <code>#+BEGIN_HTML</code> 和 <code>&lt;pre&gt;</code> 的标签。
</p>
</div>
</div>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/org-mode-tricks.htm' t='Org-mode写作的几个快捷方式' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/org-mode-tricks.htm/feed</wfw:commentRss>
		<slash:comments>20</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('p41783code44'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178344"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code44"><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('p41783code45'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178345"><td class="code" id="p41783code45"><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('p41783code46'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178346"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code46"><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('p41783code47'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178347"><td class="code" id="p41783code47"><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('p41783code48'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178348"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code48"><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('p41783code49'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178349"><td class="code" id="p41783code49"><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('p41783code50'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178350"><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="p41783code50"><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('p41783code51'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178351"><td class="code" id="p41783code51"><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('p41783code52'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178352"><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="p41783code52"><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('p41783code53'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178353"><td class="code" id="p41783code53"><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('p41783code54'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178354"><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="p41783code54"><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>用flymake检测C/C++语法</title>
		<link>http://emacser.com/flymake.htm</link>
		<comments>http://emacser.com/flymake.htm#comments</comments>
		<pubDate>Sun, 05 Dec 2010 15:54:17 +0000</pubDate>
		<dc:creator>Meteor Liu</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[中级]]></category>

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

1 前言 
2 flymake基本用法 
3 ahei的改进 
4 我的修改 
5 检测python语法 
6 遗留问题 



1 前言 


前段时间ahei使劲推荐flymake，而且在dea中还给出一段flymake配置，勾起了我学习flymake的兴趣。在此之前只是听说过flymake，偶尔浅尝一下还没学会怎么用就放弃了，这几天折腾flymae后觉得实在很给力。生活不是缺少美，而是缺少发现美的眼睛这话说得还真有点道理。



2 flymake基本用法 


flymake是一个实时的语法检查工具，好像是从emacs22开始已经自带flymake，自带的flymake提供了对C,C++,XML,HTML,C#,perl,php,java,tex,idl的支持。查看flymake-allowed-file-name-masks这个变量可以得到支持语言的详细信息。想要了解其它语言的支持，可以看看http://www.emacswiki.org/FlyMake。


在以下四种情况下，flymake会执行语法检测：



打开文件时


换行(可通过flymake-start-syntax-check-on-newline配置)


代码改变0.5秒后(可通过flymake-no-changes-timeout配置)


手工执行flymake-start-syntax-check


下面是flymake基本配置：


?View Code LISP&#40;autoload 'flymake-find-file-hook &#34;flymake&#34; &#34;&#34; t&#41;
&#40;add-hook 'find-file-hook 'flymake-find-file-hook&#41;
&#40;setq flymake-gui-warnings-enabled nil&#41;
&#40;setq flymake-log-level 0&#41;


加上以上配置后，打开文件时会检测是否是flymake支持的语言，是的话就会自动打开flymake-mode。flymake-gui-warnings-enabled设置为nil表示出错时不弹个对话框显示错误；flymake-log-level设置为0表示记录错误日志。


本文主要讨论C/C++(因为别的我不会)，自带的flymake对C/C++的支持是通过Makefile实现的，Makefile中必须有一个check-syntax目标，比如我在Linux下用automake，那我在Makefile.am中加了这么一段(其实就是调用gcc)：


?View Code MAKEFILEcheck-syntax:
    $(CXXCOMPILE) -Wall -Wextra -pedantic -fsyntax-only $(CHK_SOURCES)


如果不用automake，手写Makefile的话，相应地修改一下就行了。


有了这些设置后，打开项目中的cpp文件，应该会自动检测语法了，语法有错误的话会用颜色标识出错的行，M-x flymake-goto-next-error和M-xflymake-goto-prev-error可以在错误行间移动；鼠标在错误行上停留会用tooltip显示错误信息；M-x flymake-display-err-menu-for-current-line能弹出一个菜单显示错误。


另外，ahei写了几个函数可以在错误行间移动时在minibuffer显示出错误信息：


?View Code LISP&#40;defun flymake-display-current-error &#40;&#41;
  &#34;Display errors/warnings under cursor.&#34;
  &#40;interactive&#41;
  &#40;let [...]]]></description>
			<content:encoded><![CDATA[<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 前言 </a></li>
<li><a href="#sec-2">2 flymake基本用法 </a></li>
<li><a href="#sec-3">3 ahei的改进 </a></li>
<li><a href="#sec-4">4 我的修改 </a></li>
<li><a href="#sec-5">5 检测python语法 </a></li>
<li><a href="#sec-6">6 遗留问题 </a></li>
</ul>
</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>
前段时间ahei使劲推荐<a href="http://flymake.sourceforge.net/">flymake</a>，而且在dea中还给出一段flymake配置，勾起了我学习flymake的兴趣。在此之前只是听说过flymake，偶尔浅尝一下还没学会怎么用就放弃了，这几天折腾flymae后觉得实在很给力。生活不是缺少美，而是缺少发现美的眼睛这话说得还真有点道理。<span id="more-41759"></span></p>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> flymake基本用法 </h3>
<div class="outline-text-3" id="text-2">
<p>
flymake是一个实时的语法检查工具，好像是从emacs22开始已经自带flymake，自带的flymake提供了对C,C++,XML,HTML,C#,perl,php,java,tex,idl的支持。查看flymake-allowed-file-name-masks这个变量可以得到支持语言的详细信息。想要了解其它语言的支持，可以看看<a href="http://www.emacswiki.org/FlyMake">http://www.emacswiki.org/FlyMake</a>。
</p>
<p>
在以下四种情况下，flymake会执行语法检测：
</p>
<ul>
<li>
打开文件时
</li>
<li>
换行(可通过flymake-start-syntax-check-on-newline配置)
</li>
<li>
代码改变0.5秒后(可通过flymake-no-changes-timeout配置)
</li>
<li>
手工执行flymake-start-syntax-check</p>
</li>
</ul>
<p>下面是flymake基本配置：
</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('p41759code62'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4175962"><td class="code" id="p41759code62"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>autoload 'flymake-find-file-hook <span style="color: #ff0000;">&quot;flymake&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'find-file-hook 'flymake-find-file-hook<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> flymake-gui-warnings-enabled <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> flymake-log-level <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
加上以上配置后，打开文件时会检测是否是flymake支持的语言，是的话就会自动打开flymake-mode。flymake-gui-warnings-enabled设置为nil表示出错时不弹个对话框显示错误；flymake-log-level设置为0表示记录错误日志。
</p>
<p>
本文主要讨论C/C++(因为别的我不会)，自带的flymake对C/C++的支持是通过Makefile实现的，Makefile中必须有一个check-syntax目标，比如我在Linux下用automake，那我在Makefile.am中加了这么一段(其实就是调用gcc)：
</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('p41759code63'); return false;">View Code</a> MAKEFILE</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4175963"><td class="code" id="p41759code63"><pre class="makefile" style="font-family:monospace;">check-syntax:
    $(CXXCOMPILE) -Wall -Wextra -pedantic -fsyntax-only $(CHK_SOURCES)</pre></td></tr></table></div>

<p>
如果不用automake，手写Makefile的话，相应地修改一下就行了。
</p>
<p>
有了这些设置后，打开项目中的cpp文件，应该会自动检测语法了，语法有错误的话会用颜色标识出错的行，M-x flymake-goto-next-error和M-xflymake-goto-prev-error可以在错误行间移动；鼠标在错误行上停留会用tooltip显示错误信息；M-x flymake-display-err-menu-for-current-line能弹出一个菜单显示错误。
</p>
<p>
另外，ahei写了几个函数可以在错误行间移动时在minibuffer显示出错误信息：
</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('p41759code64'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4175964"><td class="code" id="p41759code64"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> flymake-display-current-<span style="color: #b1b100;">error</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Display errors/warnings under cursor.&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>ovs <span style="color: #66cc66;">&#40;</span>overlays-in <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">1</span>+ <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">catch</span> 'found
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>ov ovs<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span>flymake-overlay-p ov<span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>message <span style="color: #66cc66;">&#40;</span>overlay-<span style="color: #b1b100;">get</span> ov 'help-echo<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">throw</span> 'found 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><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> flymake-goto-next-error-disp <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Go to next error in err ring, then display error/warning.&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>flymake-goto-next-<span style="color: #b1b100;">error</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>flymake-display-current-<span style="color: #b1b100;">error</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> flymake-goto-prev-error-disp <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Go to previous error in err ring, then display error/warning.&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>flymake-goto-prev-<span style="color: #b1b100;">error</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>flymake-display-current-<span style="color: #b1b100;">error</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('p41759code65'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4175965"><td class="code" id="p41759code65"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defvar flymake-mode-map <span style="color: #66cc66;">&#40;</span>make-sparse-keymap<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key flymake-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c &lt;f4&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'flymake-goto-next-error-disp<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key flymake-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c &lt;S-f4&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'flymake-goto-prev-error-disp<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>define-key flymake-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c &lt;C-f4&gt;&quot;</span><span style="color: #66cc66;">&#41;</span>
  'flymake-display-err-menu-for-current-line<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">or</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">assoc</span> 'flymake-mode minor-mode-map-alist<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> minor-mode-map-alist
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> 'flymake-mode flymake-mode-map<span style="color: #66cc66;">&#41;</span>
                minor-mode-map-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
编辑过程中，每次修改过代码0.5秒后，flymake都会检测错误，这就可以随时发现代码编写的错误了。
</p>
<p>
在这补充一下flymake检测的方法：
</p>
<p>
对于cpp文件，每次检测时，flymake是把buffer内的内容另存一份，再检测另存出来的文件。
</p>
<p>
而对于h文件，gcc没办法单独检查头文件，flymake会在flymake-master-file-dirs设定的目录中查找include过这个头文件的实现文件，把buffer另存为xxx_flymake.h，把查找到的第一个满足条件的实现文件另存yyy_flymake_master.cpp，并把里面的include语句改为include另存的文件，然后通过yyy_flymake_master.cpp来间接检测头文件。
</p>
</div>
</div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3"><span class="section-number-3">3</span> ahei的改进 </h3>
<div class="outline-text-3" id="text-3">
<p>
自带的flymake对C++只能通过Makefile来支持，还必须在Makefile中加入check-syntax目标，实在很麻烦。要是代码不是通过Makefile来管理的，flymake就无能为力了。
</p>
<p>
其实Makefile也是通过gcc来检测代码了，那要是跳过Makefile直接调用gcc来检测代码该多好啊，所以<a href="http://emacser.com/about.htm#ahei">ahei</a>在<a href="http://code.google.com/p/dea">DEA</a>中配置了flymake直接调用gcc检测C++代码，具体代码在<a href="http://code.google.com/p/dea/source/browse/trunk/my-lisps/flymake-settings.el">flymake-setting.el</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('p41759code66'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4175966"><td class="code" id="p41759code66"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defvar flymake-makefile-filenames '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Makefile&quot;</span> <span style="color: #ff0000;">&quot;makefile&quot;</span> <span style="color: #ff0000;">&quot;GNUmakefile&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;File names for make.&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> flymake-get-make-gcc-cmdline <span style="color: #66cc66;">&#40;</span>source base-dir<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span>found<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>makefile flymake-makefile-filenames<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>file-readable-p <span style="color: #66cc66;">&#40;</span>concat base-dir <span style="color: #ff0000;">&quot;/&quot;</span> makefile<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> found t<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> found
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;make&quot;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;-s&quot;</span>
                    <span style="color: #ff0000;">&quot;-C&quot;</span>
                    base-dir
                    <span style="color: #66cc66;">&#40;</span>concat <span style="color: #ff0000;">&quot;CHK_SOURCES=&quot;</span> source<span style="color: #66cc66;">&#41;</span>
                    <span style="color: #ff0000;">&quot;SYNTAX_CHECK_MODE=1&quot;</span>
                    <span style="color: #ff0000;">&quot;check-syntax&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>file-name-extension source<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;c&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;gcc&quot;</span> <span style="color: #ff0000;">&quot;g++&quot;</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;-o&quot;</span>
                  <span style="color: #ff0000;">&quot;/dev/null&quot;</span>
                  <span style="color: #ff0000;">&quot;-S&quot;</span>
                  source<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> flymake-simple-make-gcc-init-impl <span style="color: #66cc66;">&#40;</span>create-temp-f use-relative-base-dir use-relative-source build-file-<span style="color: #b1b100;">name</span> get-cmdline-f<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Create syntax check command line for a directly checked source file.
Use CREATE-TEMP-F for creating temp copy.&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>args <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>source-file-<span style="color: #b1b100;">name</span> buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>buildfile-dir <span style="color: #66cc66;">&#40;</span>file-name-directory source-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><span style="color: #b1b100;">if</span> buildfile-dir
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span>* <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>temp-source-file-<span style="color: #b1b100;">name</span>  <span style="color: #66cc66;">&#40;</span>flymake-init-create-temp-buffer-copy create-temp-f<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> args
                <span style="color: #66cc66;">&#40;</span>flymake-get-syntax-check-program-args
                 temp-source-file-<span style="color: #b1b100;">name</span>
                 buildfile-dir
                 use-relative-base-dir
                 use-relative-source
                 get-cmdline-f<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    args<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> flymake-simple-make-gcc-init <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>flymake-simple-make-gcc-init-impl 'flymake-create-temp-inplace t t <span style="color: #ff0000;">&quot;Makefile&quot;</span> 'flymake-get-make-gcc-cmdline<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
主要思路就是先检测Makefile文件，如果存在就调用make，否则就直接调用gcc检测。
</p>
</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>
ahei配置的gcc非常实用，我就是因为它喜欢上flymake的，不过用过几天后，发现ahei的配置里有几个问题没解决：
</p>
<ul>
<li>
没有对make或gcc进行检测 <br/></p>
<p>
flymake进行语法检测都是通过调用外部程序来实现的，比如make或gcc，如果没有安装这两个程序，flymake还是会死心眼地启动一个process去调用。
</p>
</li>
<li>
不支持用gcc直接检测头文件 <br/></p>
<p>
ahei好像是把头文件忘掉了。
</p>
</li>
<li>
目标没有权限写入时会出错 <br/></p>
<p>
因为flymake检测文件时会把buffer内容另存到一个临时文件中再检测，如果我以普通用户身份打开/usr/include/下的头文件，或者/usr/src/下的实现文件时，flymake会报靠说权限有问题，并且你会发现这个文件没在emacs中被打开。
</p>
</li>
<li>
不支持父目录中的Makefile <br/></p>
<p>
原始的flymake调用flymake-init-find-buildfile-dir来查找Makefile，它会从当前目录一直往上找，直到根目录为止，只要找到Makefile都可以。这有一个好处就是对一个有很多子目录的大工程，不需要对每个子目录下的Makefile文件都加上check-syntax目标，只需要在最顶层的Makefile中加就可以了。但ahei修改的时候可能是因为flymake-init-find-buildfile-dir找不到Makefile就会报错退出而无法转而使用gcc而放弃了这个函数，改为只在当前目录下找Makefile文件而不支持查找父目录了。
</p>
</li>
</ul>
<p>我的配置主要是在ahei的基础上进行修改，解决了这几个我发现的问题：
</p>
<p>
1.没有检测make或gcc存在的问题，我在配置文件中先检测有没有对应的外部程序，没有的话就不配置到flymake-allowed-file-name-masks中了。
</p>
<p>
2.我加了两个函数：flymake-master-make-gcc-header-init和flymake-master-make-gcc-init来支持直接用gcc检测头文件。
</p>
<p>
3.用ignore-error忽略掉权限错误，用flymake-report-fatal-status把错误通过minibuffer报告出来。
</p>
<p>
4.用flymake-find-buildfile来查找Makefile文件，能支持父目录Makefile查找。
</p>
<p>
修改后的代码如下(完整的配置见<a href="http://github.com/meteor1113/dotemacs/blob/master/init-basic.el">http://github.com/meteor1113/dotemacs/blob/master/init-basic.el</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('p41759code67'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4175967"><td class="code" id="p41759code67"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> flymake-allowed-file-name-masks '<span style="color: #66cc66;">&#40;</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>executable-find <span style="color: #ff0000;">&quot;texify&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.tex<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span> flymake-simple-tex-init<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;[0-9]+<span style="color: #000099; font-weight: bold;">\\</span>.tex<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span>
                 flymake-master-tex-init flymake-master-cleanup<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>executable-find <span style="color: #ff0000;">&quot;xml&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.xml<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span> flymake-xml-init<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.html?<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span> flymake-xml-init<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>executable-find <span style="color: #ff0000;">&quot;perl&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.p[ml]<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span> flymake-perl-init<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>executable-find <span style="color: #ff0000;">&quot;php&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.php[1]?<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span> flymake-php-init<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>executable-find <span style="color: #ff0000;">&quot;make&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.idl<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span> flymake-simple-make-init<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.java<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span>
                 flymake-simple-make-java-init flymake-simple-java-cleanup<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.cs<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span> flymake-simple-make-init<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">or</span> <span style="color: #66cc66;">&#40;</span>executable-find <span style="color: #ff0000;">&quot;make&quot;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>executable-find <span style="color: #ff0000;">&quot;gcc&quot;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>executable-find <span style="color: #ff0000;">&quot;g++&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>defvar flymake-makefile-filenames '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Makefile&quot;</span> <span style="color: #ff0000;">&quot;makefile&quot;</span> <span style="color: #ff0000;">&quot;GNUmakefile&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #ff0000;">&quot;File names for make.&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> flymake-get-gcc-cmdline <span style="color: #66cc66;">&#40;</span>source base-dir<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>cc <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: #66cc66;">&#40;</span>file-name-extension source<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;c&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;gcc&quot;</span> <span style="color: #ff0000;">&quot;g++&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> cc
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;-Wall&quot;</span>
                  <span style="color: #ff0000;">&quot;-Wextra&quot;</span>
                  <span style="color: #ff0000;">&quot;-pedantic&quot;</span>
                  <span style="color: #ff0000;">&quot;-fsyntax-only&quot;</span>
                  <span style="color: #ff0000;">&quot;-I..&quot;</span>
                  <span style="color: #ff0000;">&quot;-I../include&quot;</span>
                  <span style="color: #ff0000;">&quot;-I../inc&quot;</span>
                  <span style="color: #ff0000;">&quot;-I../common&quot;</span>
                  <span style="color: #ff0000;">&quot;-I../public&quot;</span>
                  <span style="color: #ff0000;">&quot;-I../..&quot;</span>
                  <span style="color: #ff0000;">&quot;-I../../include&quot;</span>
                  <span style="color: #ff0000;">&quot;-I../../inc&quot;</span>
                  <span style="color: #ff0000;">&quot;-I../../common&quot;</span>
                  <span style="color: #ff0000;">&quot;-I../../public&quot;</span>
                  source<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> flymake-init-find-makfile-dir <span style="color: #66cc66;">&#40;</span>source-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #ff0000;">&quot;Find Makefile, store its dir in buffer data and return its dir, if found.&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>source-dir <span style="color: #66cc66;">&#40;</span>file-name-directory source-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>buildfile-dir <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">catch</span> 'found
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>makefile flymake-makefile-filenames<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>found-dir <span style="color: #66cc66;">&#40;</span>flymake-find-buildfile makefile source-dir<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> found-dir
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> buildfile-dir found-dir<span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> flymake-base-dir buildfile-dir<span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">throw</span> 'found 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>
      buildfile-dir<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> flymake-simple-make-gcc-init-impl <span style="color: #66cc66;">&#40;</span>create-temp-f
                                            use-relative-base-dir
                                            use-relative-source<span style="color: #66cc66;">&#41;</span>
    <span style="color: #ff0000;">&quot;Create syntax check command line for a directly checked source file.
Use CREATE-TEMP-F for creating temp copy.&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>args <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span>source-file-<span style="color: #b1b100;">name</span> buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span>source-dir <span style="color: #66cc66;">&#40;</span>file-name-directory source-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>buildfile-dir
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span>executable-find <span style="color: #ff0000;">&quot;make&quot;</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>flymake-init-find-makfile-dir source-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>cc <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: #66cc66;">&#40;</span>file-name-extension source-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;c&quot;</span><span style="color: #66cc66;">&#41;</span>
                   <span style="color: #ff0000;">&quot;gcc&quot;</span>
                 <span style="color: #ff0000;">&quot;g++&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">or</span> buildfile-dir <span style="color: #66cc66;">&#40;</span>executable-find cc<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>temp-source-file-<span style="color: #b1b100;">name</span>
                  <span style="color: #66cc66;">&#40;</span>ignore-errors
                    <span style="color: #66cc66;">&#40;</span>flymake-init-create-temp-buffer-copy create-temp-f<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> temp-source-file-<span style="color: #b1b100;">name</span>
                <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> args
                      <span style="color: #66cc66;">&#40;</span>flymake-get-syntax-check-program-args
                       temp-source-file-<span style="color: #b1b100;">name</span>
                       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> buildfile-dir buildfile-dir source-dir<span style="color: #66cc66;">&#41;</span>
                       use-relative-base-dir
                       use-relative-source
                       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> buildfile-dir
                           'flymake-get-make-cmdline
                         'flymake-get-gcc-cmdline<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span>flymake-report-fatal-status
               <span style="color: #ff0000;">&quot;TMPERR&quot;</span>
               <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;Can't create temp file for %s&quot;</span> source-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;">&#40;</span>flymake-report-fatal-status
         <span style="color: #ff0000;">&quot;NOMK&quot;</span> <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;No buildfile (%s) found for %s, or can't found %s&quot;</span>
                        <span style="color: #ff0000;">&quot;Makefile&quot;</span> source-file-<span style="color: #b1b100;">name</span> cc<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      args<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> flymake-simple-make-gcc-init <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>flymake-simple-make-gcc-init-impl 'flymake-create-temp-inplace t t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> flymake-master-make-gcc-init <span style="color: #66cc66;">&#40;</span>get-incl-dirs-f
                                       master-file-masks
                                       include-regexp<span style="color: #66cc66;">&#41;</span>
    <span style="color: #ff0000;">&quot;Create make command line for a source file
 checked via master file compilation.&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>args <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span>temp-master-file-<span style="color: #b1b100;">name</span>
            <span style="color: #66cc66;">&#40;</span>ignore-errors
              <span style="color: #66cc66;">&#40;</span>flymake-init-create-temp-source-and-master-buffer-copy
               get-incl-dirs-f
               'flymake-create-temp-inplace
               master-file-masks
               include-regexp<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span>cc <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: #66cc66;">&#40;</span>file-name-extension buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;c&quot;</span><span style="color: #66cc66;">&#41;</span>
                   <span style="color: #ff0000;">&quot;gcc&quot;</span>
                 <span style="color: #ff0000;">&quot;g++&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> temp-master-file-<span style="color: #b1b100;">name</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>source-file-<span style="color: #b1b100;">name</span> buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>source-dir <span style="color: #66cc66;">&#40;</span>file-name-directory source-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>buildfile-dir
                  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span>executable-find <span style="color: #ff0000;">&quot;make&quot;</span><span style="color: #66cc66;">&#41;</span>
                       <span style="color: #66cc66;">&#40;</span>flymake-init-find-makfile-dir source-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;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">or</span> buildfile-dir <span style="color: #66cc66;">&#40;</span>executable-find cc<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> args <span style="color: #66cc66;">&#40;</span>flymake-get-syntax-check-program-args
                            temp-master-file-<span style="color: #b1b100;">name</span>
                            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> buildfile-dir buildfile-dir source-dir<span style="color: #66cc66;">&#41;</span>
                            <span style="color: #b1b100;">nil</span>
                            <span style="color: #b1b100;">nil</span>
                            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> buildfile-dir
                                'flymake-get-make-cmdline
                              'flymake-get-gcc-cmdline<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span>flymake-report-fatal-status
               <span style="color: #ff0000;">&quot;NOMK&quot;</span>
               <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;No buildfile (%s) found for %s, or can't found %s&quot;</span>
                       <span style="color: #ff0000;">&quot;Makefile&quot;</span> source-file-<span style="color: #b1b100;">name</span> cc<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>flymake-report-fatal-status
         <span style="color: #ff0000;">&quot;TMPERR&quot;</span> <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;Can't create temp file for %s&quot;</span> source-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>
      args<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> flymake-master-make-gcc-header-init <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>flymake-master-make-gcc-init
     'flymake-get-include-dirs
     '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.cpp<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.c<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #ff0000;">&quot;[ <span style="color: #000099; font-weight: bold;">\t</span>]*#[ <span style="color: #000099; font-weight: bold;">\t</span>]*include[ <span style="color: #000099; font-weight: bold;">\t</span>]*<span style="color: #000099; font-weight: bold;">\&quot;</span><span style="color: #000099; font-weight: bold;">\\</span>([[:word:]0-9/<span style="color: #000099; font-weight: bold;">\\</span>_.]*%s<span style="color: #000099; font-weight: bold;">\\</span>)<span style="color: #000099; font-weight: bold;">\&quot;</span>&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.<span style="color: #000099; font-weight: bold;">\\</span>(?:h<span style="color: #000099; font-weight: bold;">\\</span>(?:pp<span style="color: #000099; font-weight: bold;">\\</span>)?<span style="color: #000099; font-weight: bold;">\\</span>)<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span>
                 flymake-master-make-gcc-header-init flymake-master-cleanup<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.<span style="color: #000099; font-weight: bold;">\\</span>(?:c<span style="color: #000099; font-weight: bold;">\\</span>(?:pp<span style="color: #000099; font-weight: bold;">\\</span>|xx<span style="color: #000099; font-weight: bold;">\\</span>|<span style="color: #000099; font-weight: bold;">\\</span>+<span style="color: #000099; font-weight: bold;">\\</span>+<span style="color: #000099; font-weight: bold;">\\</span>)?<span style="color: #000099; font-weight: bold;">\\</span>|CC<span style="color: #000099; font-weight: bold;">\\</span>)<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span>
                 flymake-simple-make-gcc-init<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-5" class="outline-3">
<h3 id="sec-5"><span class="section-number-3">5</span> 检测python语法 </h3>
<div class="outline-text-3" id="text-5">
<p>
因为偶尔我也用下python，所以我也希望flymake能把python也支持了。python有三个语法检测工具，我比较之后选择了pyflakes。
</p>
<p>
装好pyflakes后，加入以下配置就可以像检测cpp那样检测py文件了：
</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('p41759code68'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4175968"><td class="code" id="p41759code68"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span>executable-find <span style="color: #ff0000;">&quot;pyflakes&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> flymake-pyflakes-init <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>temp-file <span style="color: #66cc66;">&#40;</span>flymake-init-create-temp-buffer-copy
                       'flymake-create-temp-inplace<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span>local-file <span style="color: #66cc66;">&#40;</span>file-relative-<span style="color: #b1b100;">name</span>
                        temp-file
                        <span style="color: #66cc66;">&#40;</span>file-name-directory 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;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #ff0000;">&quot;pyflakes&quot;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> local-file<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>add-to-<span style="color: #b1b100;">list</span> 'flymake-allowed-file-name-masks
               '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.py<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span> flymake-pyflakes-init<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
如果是在windows下的话，可能会找不到pyflakes这个外部程序，因为C:\Python25\Scripts\pyflakes没被windows识别为可执行文件，我是在C:\Python25\Scripts\下加了个pyflakes.bat的文件，文件里写入以下内容就能正常检测了：
</p>
<pre class="example">C:\Python25\python.exe C:\Python25\Scripts\pyflakes %*
</pre>
</div>
</div>
<div id="outline-container-6" class="outline-3">
<h3 id="sec-6"><span class="section-number-3">6</span> 遗留问题 </h3>
<div class="outline-text-3" id="text-6">
<p>
有两个问题我还没解决：
</p>
<p>
一、对C++来说，找不到Makefile的时候自动改用gcc语法检测，但有时候看别人工程时会碰到有Makefile，但里面没有写check-syntax目标的问题(从网上下载的开源代码很少有在Makefile中写check-syntax目标的)。要是能配置成在Makefile中找不到check-syntax目标后也能自动改用gcc检测就好了。
</p>
<p>
二、flymake通过定时器，改变代码超过0.5秒后进行语法检测，其实我不太喜欢这种立即检测的方式，相比之下我更喜欢保存文件后进行检测。要是下个版本的flymake可以把这两种方式做成可配置就好了。
</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/flymake.htm' t='用flymake检测C/C++语法' 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/flymake.htm/feed</wfw:commentRss>
		<slash:comments>28</slash:comments>
		</item>
		<item>
		<title>Emacs补全利器：auto-complete+gccsense</title>
		<link>http://emacser.com/emacs-gccsense.htm</link>
		<comments>http://emacser.com/emacs-gccsense.htm#comments</comments>
		<pubDate>Mon, 08 Nov 2010 03:03:02 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[自动补全]]></category>

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



1 前言 
2 简介 
3 安装 

3.1 配置auto-complete 
3.2 配置gcc-code-assist 
3.3 安装配置gccsense 


4 主要模块介绍 
5 实例 
6 附录 
7 参考 




1 前言 

搜索引擎上关于emacs代码补全的文章一大堆，大多讲的是cedet、semantic、ctags之类的。我自己也尝试过一些“主流”的组合，奈何都不来感啊。用得最长的也就auto-complete了，但是用的也仅仅是它自带的buffer内内容的补全，基本不涉及语义的补全。偶然发现了gccsense这个东西，简单配置了下，比较满意。有图有真相
我绑定的补全键到M+/，这样，遇到要补全的地方，按下M+/就出现了补全菜单，旁边是提示。




2 简介 

auto-complete提供一个补全的前端，通过不同的后端，支持ctags等。
gccsense是补全的后端，能提供符合语义的补全。因为它是直接利用gcc的代码，使用了编译器内在的分析器。它是一个独立的程序，目前通过插件可以被用到emacs和vim的补全上。因为是用的gcc的代码，理论上可以补全所有gcc支持的语言。
auto-complete和gccsense是一家出的。




3 安装 



3.1 配置auto-complete 

下载：http://cx4a.org/software/auto-complete/
配置.emacs，我的auto-complete在/mydoc/lib/emacs-plugins/下

?View Code LISP; auto complete
&#40;add-to-list 'load-path &#34;/mydoc/lib/emacs-plugins/auto-complete&#34;&#41;  
&#40;require 'auto-complete-config&#41;  
&#40;add-to-list 'ac-dictionary-directories &#34;/mydoc/lib/emacs-plugins/auto-complete/ac-dict&#34;&#41;  
&#40;ac-config-default&#41;





3.2 配置gcc-code-assist 

gcc-code-assist就是在gcc代码基础上改的，主要用来从代码中提取补全信息



下载：http://cx4a.org/software/gccsense/#Downloads
编译安装之前，准备好环境，debian系统如下：

?View Code BASHsudo apt-get install build-essential libgmp3-dev libmpfr-dev [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://emacser.com/about.htm#crackcell" target="_blank"><span style="color: #0000ff;"><b>Menglong Tan</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 配置auto-complete </a></li>
<li><a href="#sec-3_2">3.2 配置gcc-code-assist </a></li>
<li><a href="#sec-3_3">3.3 安装配置gccsense </a></li>
</ul>
</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>
</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代码补全的文章一大堆，大多讲的是cedet、semantic、ctags之类的。我自己也尝试过一些“主流”的组合，奈何都不来感啊。用得最长的也就auto-complete了，但是用的也仅仅是它自带的buffer内内容的补全，基本不涉及语义的补全。偶然发现了gccsense这个东西，简单配置了下，比较满意。有图有真相<span id="more-41713"></span><br />
   <div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/emacs-gccsense.jpg" rel="lightbox"><img src="https://dea.googlecode.com/svn/trunk/screenshots/thumbs/thumbs_emacs-gccsense.jpg" height="150"/></a><p class="wp-caption-text">Emacs gccsense</p></div><br />
我绑定的补全键到M+/，这样，遇到要补全的地方，按下M+/就出现了补全菜单，旁边是提示。
</p>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> 简介 </h3>
<div class="outline-text-3" id="text-2">
<p>auto-complete提供一个补全的前端，通过不同的后端，支持ctags等。<br />
gccsense是补全的后端，能提供符合语义的补全。因为它是直接利用gcc的代码，使用了编译器内在的分析器。它是一个独立的程序，目前通过插件可以被用到emacs和vim的补全上。因为是用的gcc的代码，理论上可以补全所有gcc支持的语言。<br />
auto-complete和gccsense是一家出的。
</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">
</div>
<div id="outline-container-3_1" class="outline-4">
<h4 id="sec-3_1"><span class="section-number-4">3.1</span> 配置auto-complete </h4>
<div class="outline-text-4" id="text-3_1">
<p>下载：<a href="http://cx4a.org/software/auto-complete/">http://cx4a.org/software/auto-complete/</a><br />
配置.emacs，我的auto-complete在/mydoc/lib/emacs-plugins/下</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('p41713code80'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171380"><td class="code" id="p41713code80"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">; auto complete</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;/mydoc/lib/emacs-plugins/auto-complete&quot;</span><span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#40;</span>require 'auto-complete-config<span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'ac-dictionary-directories <span style="color: #ff0000;">&quot;/mydoc/lib/emacs-plugins/auto-complete/ac-dict&quot;</span><span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#40;</span>ac-config-default<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
</div>
</div>
<div id="outline-container-3_2" class="outline-4">
<h4 id="sec-3_2"><span class="section-number-4">3.2</span> 配置gcc-code-assist </h4>
<div class="outline-text-4" id="text-3_2">
<p>gcc-code-assist就是在gcc代码基础上改的，主要用来从代码中提取补全信息
</p>
<ol>
<li>
下载：<a href="http://cx4a.org/software/gccsense/#Downloads">http://cx4a.org/software/gccsense/#Downloads</a><br />
编译安装之前，准备好环境，debian系统如下：</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('p41713code81'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171381"><td class="code" id="p41713code81"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> build-essential libgmp3-dev libmpfr-dev <span style="color: #c20cb9; font-weight: bold;">flex</span> ruby rubygems libsqlite3-ruby</pre></td></tr></table></div>

<p>其它系统，如freebsd、macos请自行参考用户手册。
</li>
<li>
配置安装：</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('p41713code82'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171382"><td class="code" id="p41713code82"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">tar</span> xvjf gcc-code-assist-<span style="color: #000000; font-weight: bold;">*</span>.tar.bz2  
$ <span style="color: #7a0874; font-weight: bold;">cd</span> gcc-code-assist-<span style="color: #000000; font-weight: bold;">*</span>  
$ .<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--program-suffix</span>=-code-assist <span style="color: #660033;">--enable-languages</span>=c,<span style="color: #c20cb9; font-weight: bold;">c++</span> <span style="color: #660033;">--disable-bootstrap</span> <span style="color: #660033;">--disable-multilib</span>  
$ <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #666666; font-style: italic;"># -j2  </span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</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('p41713code83'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171383"><td class="code" id="p41713code83"><pre class="bash" style="font-family:monospace;">$ gcc-code-assist <span style="color: #660033;">--version</span>  
$ g++-code-assist <span style="color: #660033;">--version</span></pre></td></tr></table></div>

</li>
</ol>
</div>
</div>
<div id="outline-container-3_3" class="outline-4">
<h4 id="sec-3_3"><span class="section-number-4">3.3</span> 安装配置gccsense </h4>
<div class="outline-text-4" id="text-3_3">
<p>gccsense这个包包含一些辅助函数，以及编辑器的插件
</p>
<ol>
<li>
解压缩之后，执行：</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('p41713code84'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171384"><td class="code" id="p41713code84"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> gccsense-<span style="color: #000000; font-weight: bold;">*</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> bin<span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span></pre></td></tr></table></div>

</li>
<li>
执行一下命令，确保安装成功：</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('p41713code85'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171385"><td class="code" id="p41713code85"><pre class="bash" style="font-family:monospace;">$ gccrec <span style="color: #660033;">--version</span> 
$ autopch <span style="color: #660033;">--version</span></pre></td></tr></table></div>

</li>
<li>
emacs的插件文件为etc/gccsense.el，放到插件目录然后，在.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('p41713code86'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171386"><td class="code" id="p41713code86"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'gccsense<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>即可。<br />
由于我的gccsense.el放到了。/mydoc/lib/emacs-plugins/c下，并且把auto-complete的补全命令绑定到了M+/上，所以这部分配置如下：</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('p41713code87'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171387"><td class="code" id="p41713code87"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;/mydoc/lib/emacs-plugins/c&quot;</span><span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#40;</span>require 'gccsense<span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\2</span>57&quot;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> ac-complete-gccsense<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>ok，搞定。
</li>
</ol>
</div>
</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>
gcc-code-assist<br />
gcc4.4代码基础上改的那位，用来从被补全代码中分析出补全信息
</li>
<li>
gccrec<br />
编译一个文件，往往要加上编译参数的，比如自定义的include地址。但是编辑器在补全的时候，是不知道这些的，硬生生地调用gcc-code-assist来“模拟编译”，参数补全造成的错误会扰乱补全信息的获取。<br />
gccrec就是为了解决这个问题，在使用编辑器补全之前，需要执行一次gccrec，它会将编译参数信息存到~/.gccrec这个sqlite3的数据库中。具体用法参见下一节的示例。
</li>
<li>
autopch<br />
用来启用预编译头，来提高速度。<br />
autopch的相关部分请各位看官自行参考用户手册吧，后面的示例代码简单，不需要这个东西。
</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">
<ol>
<li>
准备一个测试cpp文件，test.cpp：</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('p41713code88'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171388"><td class="code" id="p41713code88"><pre class="lisp" style="font-family:monospace;">#include <span style="color: #66cc66;">&lt;</span>string<span style="color: #66cc66;">&gt;</span>  
using namespace std<span style="color: #808080; font-style: italic;">;  </span>
int main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#123;</span>  
    string s<span style="color: #808080; font-style: italic;">;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

</li>
<li>
使用gccrec记录编译命令</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('p41713code89'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171389"><td class="code" id="p41713code89"><pre class="bash" style="font-family:monospace;">gccrec g++-code-assist test.cpp</pre></td></tr></table></div>

<p>这里可以认为g++-code-assist就是g++，参数一样的，比如-I -l之类的。
</li>
<li>
用emacs打开test.cpp，享受补全吧<br />
在string s;后面接着输入s.，然后按M-x ac-complete-gccsense，就可以利用auto-complete和它的gccsense后端来补全了。
</li>
</ol>
</div>
</div>
<div id="outline-container-6" class="outline-3">
<h3 id="sec-6"><span class="section-number-3">6</span> 附录 </h3>
<div class="outline-text-3" id="text-6">
<p>这里贴上我的emacs相关部分的配置文件。<br />
我把补全的命令绑定到了M-/上面，<br />
gccsense.el放到了/mydoc/lib/emacs-plugins/c/下面，所以这样写：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41713code90'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171390"><td class="code" id="p41713code90"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;/mydoc/lib/emacs-plugins/c&quot;</span><span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#40;</span>require 'gccsense<span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\2</span>57&quot;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">quote</span> ac-complete-gccsense<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
</div>
</div>
<div id="outline-container-7" class="outline-3">
<h3 id="sec-7"><span class="section-number-3">7</span> 参考 </h3>
<div class="outline-text-3" id="text-7">
<p>gccsense用户手册，<a href="http://cx4a.org/software/gccsense/manual.html">http://cx4a.org/software/gccsense/manual.html</a>
</p>
</div>
</div>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-gccsense.htm' t='Emacs补全利器：auto-complete+gccsense' 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/emacs-gccsense.htm/feed</wfw:commentRss>
		<slash:comments>56</slash:comments>
		</item>
		<item>
		<title>在Emacs下用C/C++编程</title>
		<link>http://emacser.com/emacs-cpp-dev.htm</link>
		<comments>http://emacser.com/emacs-cpp-dev.htm#comments</comments>
		<pubDate>Mon, 25 Oct 2010 01:43:49 +0000</pubDate>
		<dc:creator>lertsau</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[autoload]]></category>
		<category><![CDATA[browser]]></category>
		<category><![CDATA[CEDET]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[ede]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[hippie-expand]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[semantic]]></category>
		<category><![CDATA[senator]]></category>
		<category><![CDATA[speedbar]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[行号]]></category>
		<category><![CDATA[补全]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[鼠标]]></category>

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


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

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


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




1 参考文献 


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



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


emacs 的文档


emacs 相关插件的文档





2 序 


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


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


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


我的基本编程环境是：



Debian GNU/Linux sid 操作系统


Gnome 2.10.0 桌面环境


GUN Emacs 23.0.0.1 for debian


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


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


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




3 基本流程 


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



编辑代码


编写Makefile


编译代码，修改编译错误


调试代码，修改逻辑错误


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


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



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


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


在Emacs中配合GDB调试程序。


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





4 基本环境设置 



4.1 编辑环境配置 


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


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


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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41677code102'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41677102"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41677code102"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;;;; CC-mode配置  http://cc-mode.sourceforge.net/</span>
<span style="color: #66cc66;">&#40;</span>require 'cc-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>c-set-offset 'inline-open <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>c-set-offset 'friend '-<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>c-set-offset 'substatement-open <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41677code103'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41677103"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p41677code103"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;;;;我的C/C++语言编辑策略</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> my-c-mode-common-hook<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> tab-width <span style="color: #cc66cc;">4</span> indent-tabs-mode <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #808080; font-style: italic;">;;; hungry-delete and auto-newline</span>
  <span style="color: #66cc66;">&#40;</span>c-toggle-auto-hungry-state <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #808080; font-style: italic;">;;按键定义</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>control \`<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'hs-toggle-hiding<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">return</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'newline-and-indent<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>f7<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'compile<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>meta \`<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'c-indent-command<span style="color: #66cc66;">&#41;</span>
  <span style="color: #808080; font-style: italic;">;;  (define-key c-mode-base-map [(tab)] 'hippie-expand)</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>tab<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'my-indent-or-complete<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>define-key c-mode-base-map <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>meta ?/<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'semantic-ia-complete-symbol-menu<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
注意一下，上面最后两行是代码自动补齐的快捷键。后面我会提到代码自动补齐。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41677code104'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41677104"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p41677code104"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;;预处理设置</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> c-macro-shrink-window-flag t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> c-macro-preprocessor <span style="color: #ff0000;">&quot;cpp&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> c-macro-cppflags <span style="color: #ff0000;">&quot; &quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> c-macro-prompt-flag t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> hs-minor-mode t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> abbrev-mode t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'c-mode-common-hook 'my-c-mode-common-hook<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;;;我的C++语言编辑策略</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> my-c++-mode-hook<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> tab-width <span style="color: #cc66cc;">4</span> indent-tabs-mode <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>c-set-style <span style="color: #ff0000;">&quot;stroustrup&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;;  (define-key c++-mode-map [f3] 'replace-regexp)</span>
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
</div>
</div>
<div id="outline-container-4.2" class="outline-4">
<h4 id="sec-4.2"><span class="section-number-4">4.2</span> 自动补齐 </h4>
<div class="outline-text-4" id="text-4.2">
<p>
自动补齐通常用的都是hippie-expand，我也用了很长时间。不过有时候会觉得这个自动补齐“傻”了一点，常会补齐出一些毫不相干的东西，因为hippie-expand是根据你敲过的词和kill-ring等进行判断的，并不对程序语法进行分析。
</p>
<p>
所以你还需要安装一个代码分析工具，然后把它加进hippie-expand的扩展策略里去。我们可以用semantic。实际上，hippie-expand＋semantic是我所发现的最好的选择了，如果您有更好的，请您也告诉我一声:)
</p>
<p>
Semantic是<a href="http://cedet.sourceforge.net/" target="_blank">CEDET</a> 中的一个工具，CEDET是Collection of Emacs Development Environment Tools的缩写，它包含了好几个工具，都挺不错的。可惜我只会用其中两个。
</p>
<p>
您可以在.emacs中对Semantic进行配置，下面是我的.emacs相关的配置，仅供参考：
</p>
<p>
导入cedet：</p>

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

<p>配置Semantic的检索范围:</p>

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

<p>自定义自动补齐命令，这部分是抄hhuu的，如果在单词中间就补齐，否则就是tab。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41677code107'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41677107"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p41677code107"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> my-indent-or-complete <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>looking-at <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>&gt;&quot;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>hippie-expand <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>indent-for-tab-command<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>control tab<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'my-indent-or-complete<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
hippie的自动补齐策略，优先调用了senator的分析结果：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41677code108'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41677108"><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="p41677code108"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>autoload 'senator-try-expand-semantic <span style="color: #ff0000;">&quot;senator&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> hippie-expand-try-functions-<span style="color: #b1b100;">list</span>
      '<span style="color: #66cc66;">&#40;</span>
        senator-try-expand-semantic
        try-expand-dabbrev
        try-expand-dabbrev-visible
        try-expand-dabbrev-all-buffers
        try-expand-dabbrev-from-kill
        try-expand-<span style="color: #b1b100;">list</span>
        try-expand-list-all-buffers
        try-expand-line
        try-expand-line-all-buffers
        try-complete-file-name-partially
        try-complete-file-<span style="color: #b1b100;">name</span>
        try-expand-whole-kill
        <span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
注意一下我前面CC-Mode配置中有这么两行：
</p>

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

<p>
这样，我们在CC-Mode中就可以调用自定义的hippie补全了，快捷键是Tab。
</p>
<p>
另外，我还把快捷键“Alt + / ”绑定到了semantic-ia-complete-symbol-menu命令上，这是semantic的命令，它会根据分析结果弹出补齐的菜单，效果如图显示：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/semantic-ia.jpg" rel="lightbox"><img src="screenshots/thumbs/thumbs_semantic-ia.jpg" height="150"/></a><p class="wp-caption-text">自动补齐效果图</p></div>
<p>
CEDET中还有一个不错的工具是speedbar，你可以用它在多个文件中快速切换。在我的.emacs配置文件里，我把speedbar关联到了F5上：</p>

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

<p>这样用F5就可以调出speedbar，效果如下：
</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/speedbar.jpg" rel="lightbox"><img src="screenshots/thumbs/thumbs_speedbar.jpg" height="150"/></a><p class="wp-caption-text">speedbar</p></div>
<p>
不过说实话，我自己很少用到speedbar，我通常都是用dired配合bookmark使用:)
</p>
</div>
</div>
</div>
<div id="outline-container-5" class="outline-3">
<h3 id="sec-5"><span class="section-number-3">5</span> 编译和调试程序 </h3>
<div class="outline-text-3" id="text-5">
<p>
按上面的配置，写完程序和Makefile文件后，在Emacs源代码窗口中按F7就可以进行编译。因为在my-c-mode-common-hook()函数里，有这么一行：</p>

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

<p>默认情况下，emacs的compile命令是调用make -k，我把它改成了make。你也可以把它改成其他的，比如gcc之类的。改下面的“make”就行了。</p>

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

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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-cpp-dev.htm' t='在Emacs下用C/C++编程' d='' tag='autoload,browser,C/C++,CEDET,control,ede,Emacs,emacser,emacser.com,gdb,hippie-expand,IDE,org,screenshot,semantic,senator,speedbar,windows,插件,行号,补全,配色,鼠标' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (185)</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/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/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/emacs-cpp-dev.htm/feed</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Emacs org mode学习笔记</title>
		<link>http://emacser.com/org-mode.htm</link>
		<comments>http://emacser.com/org-mode.htm#comments</comments>
		<pubDate>Mon, 18 Oct 2010 02:22:26 +0000</pubDate>
		<dc:creator>lertsau</dc:creator>
				<category><![CDATA[Org Mode]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[face]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[meteor]]></category>
		<category><![CDATA[meteor1113]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[配色]]></category>

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



1 参考文献 
2 用Org Mode做笔记 

2.1 想法与配置 
2.2 常用的编辑 


3 用Org Mode管理个人事务 

3.1 关于TODO ITEM的基本知识和操作 
3.2 标签 
3.3 时间和日期 
3.4 我的TODO LIST解决方案 






1 参考文献 

本文参考并引用了以下的文章的部分内容。



Yu Peng的Emacs的Org Mode


Emacs org Mode的官方参考文档





2 用Org Mode做笔记 



2.1 想法与配置 


以前一直都用Emacs Wiki Mode记笔记，但wiki mode总有些奇奇怪怪的bug，并且已经不更新了，最近org mode 非常火爆，禁不住想试一下。


对于记笔记，我的打算很简单，一个目录用来装所有的笔记，一个目录用来存放publish成HTML格式的笔记。并且能够自动生成索引文件。这样就可以在索引文件里直接查找并跳转到所有的笔记里。


Emacs ORG mode的基本配置如下：

?View Code LISP1
2
3
4
5
6
7
8
9
10
11
12
13
&#40;setq load-path &#40;cons &#34;~/lib/emacs-lisp/org-7.01h/lisp&#34; load-path&#41;&#41;
&#40;setq load-path &#40;cons &#34;~/lib/emacs-lisp/org-7.01h/contrib/lisp&#34; load-path&#41;&#41;
&#160;
&#40;require 'org-install&#41;
&#40;require 'org-publish&#41;
&#40;add-to-list 'auto-mode-alist '&#40;&#34;\\.org\\'&#34; [...]]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" title="Org Mode" src="screenshots/org-mode-logo.png"/></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 用Org Mode做笔记 </a>
<ul>
<li><a href="#sec-2.1">2.1 想法与配置 </a></li>
<li><a href="#sec-2.2">2.2 常用的编辑 </a></li>
</ul>
</li>
<li><a href="#sec-3">3 用Org Mode管理个人事务 </a>
<ul>
<li><a href="#sec-3.1">3.1 关于TODO ITEM的基本知识和操作 </a></li>
<li><a href="#sec-3.2">3.2 标签 </a></li>
<li><a href="#sec-3.3">3.3 时间和日期 </a></li>
<li><a href="#sec-3.4">3.4 我的TODO LIST解决方案 </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>本文参考并引用了以下的文章的部分内容。
</p>
<ul>
<li>
<a href="http://emacser.com/org-mode-yupeng.htm" target="_blank">Yu Peng的Emacs的Org Mode</a>
</li>
<li>
Emacs org Mode的官方参考文档</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> 用Org Mode做笔记 </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> 想法与配置 </h4>
<div class="outline-text-4" id="text-2.1">
<p>
以前一直都用Emacs Wiki Mode记笔记，但wiki mode总有些奇奇怪怪的bug，并且已经不更新了，最近org mode 非常火爆，禁不住想试一下。<span id="more-41668"></span>
</p>
<p>
对于记笔记，我的打算很简单，一个目录用来装所有的笔记，一个目录用来存放publish成HTML格式的笔记。并且能够自动生成索引文件。这样就可以在索引文件里直接查找并跳转到所有的笔记里。
</p>
<p>
Emacs ORG 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('p41668code125'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668125"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p41668code125"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> load-path <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #ff0000;">&quot;~/lib/emacs-lisp/org-7.01h/lisp&quot;</span> load-path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> load-path <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cons</span> <span style="color: #ff0000;">&quot;~/lib/emacs-lisp/org-7.01h/contrib/lisp&quot;</span> load-path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>require 'org-install<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>require 'org-publish<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'auto-mode-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>.org<span style="color: #000099; font-weight: bold;">\\</span>'&quot;</span> <span style="color: #66cc66;">.</span> org-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'org-mode-hook 'turn-on-font-lock<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'org-mode-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;">setq</span> truncate-lines <span style="color: #b1b100;">nil</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>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\C</span>-cl&quot;</span> 'org-store-link<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\C</span>-ca&quot;</span> 'org-agenda<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\C</span>-cb&quot;</span> 'org-iswitchb<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>上面基本上是从ORG-mode的文档里抄来的,其中包含setq truncate-lines nil的两行代码是为了解决org-mode在编辑中文的时候不会自动折行的问题。
</p>
<p>
接下来的配置基本照抄了<a href="http://blog.csdn.net/meteor1113/archive/2009/07/30/4395673.aspx" target="_blank">meteor1113@newsmth的用org代替muse记日记</a> ， 修改的部分就是我不想让它自动生成index文件，我比较喜欢自己组织。
</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('p41668code126'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668126"><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="p41668code126"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> org-publish-project-alist
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;note-org&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">base-directory</span> <span style="color: #ff0000;">&quot;C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/org&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">publishing-directory</span> <span style="color: #ff0000;">&quot;C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/publish&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">base-extension</span> <span style="color: #ff0000;">&quot;org&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">recursive</span> t
         <span style="color: #66cc66;">:</span><span style="color: #555;">publishing-</span><span style="color: #b1b100;">function</span> org-publish-org-to-html
         <span style="color: #66cc66;">:</span><span style="color: #555;">auto-index</span> <span style="color: #b1b100;">nil</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">index-filename</span> <span style="color: #ff0000;">&quot;index.org&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">index-title</span> <span style="color: #ff0000;">&quot;index&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">link-home</span> <span style="color: #ff0000;">&quot;index.html&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">section-numbers</span> <span style="color: #b1b100;">nil</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">style</span> <span style="color: #ff0000;">&quot;&lt;link rel=<span style="color: #000099; font-weight: bold;">\&quot;</span>stylesheet<span style="color: #000099; font-weight: bold;">\&quot;</span>
    href=<span style="color: #000099; font-weight: bold;">\&quot;</span>./style/emacs.css<span style="color: #000099; font-weight: bold;">\&quot;</span>
    type=<span style="color: #000099; font-weight: bold;">\&quot;</span>text/css<span style="color: #000099; font-weight: bold;">\&quot;</span>/&gt;&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;note-static&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">base-directory</span> <span style="color: #ff0000;">&quot;C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/org&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">publishing-directory</span> <span style="color: #ff0000;">&quot;C:/Documents and Settings/caole/My Documents/My Dropbox/emacs/org/publish&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">recursive</span> t
         <span style="color: #66cc66;">:</span><span style="color: #555;">base-extension</span> <span style="color: #ff0000;">&quot;css<span style="color: #000099; font-weight: bold;">\\</span>|js<span style="color: #000099; font-weight: bold;">\\</span>|png<span style="color: #000099; font-weight: bold;">\\</span>|jpg<span style="color: #000099; font-weight: bold;">\\</span>|gif<span style="color: #000099; font-weight: bold;">\\</span>|pdf<span style="color: #000099; font-weight: bold;">\\</span>|mp3<span style="color: #000099; font-weight: bold;">\\</span>|swf<span style="color: #000099; font-weight: bold;">\\</span>|zip<span style="color: #000099; font-weight: bold;">\\</span>|gz<span style="color: #000099; font-weight: bold;">\\</span>|txt<span style="color: #000099; font-weight: bold;">\\</span>|el&quot;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">publishing-</span><span style="color: #b1b100;">function</span> org-publish-attachment<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;note&quot;</span> 
         <span style="color: #66cc66;">:</span><span style="color: #555;">components</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;note-org&quot;</span> <span style="color: #ff0000;">&quot;note-static&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">:</span><span style="color: #555;">author</span> <span style="color: #ff0000;">&quot;caole82@gmail.com&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>
值得注意的一个地方是，我把org和publish的目录都扔在了我的Dropbox中，这样可以方便的在不同的系统中同步笔记。有些人喜欢用SVN/GIT/CVS等版本管理工具，也是个不错的办法。但我没有地方搭这些东西的服务器:-(<br />
这样写完了笔记就可以用M-x org-publish 发布了，我把它绑定到了F8-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('p41668code127'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668127"><td class="code" id="p41668code127"><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;f8&gt; p&quot;</span><span style="color: #66cc66;">&#41;</span> 'org-publish<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>为了在org mode中使用auto-complete，我在auto-complete中增加了这样的配置：</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('p41668code128'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668128"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41668code128"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> ac-modes
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> ac-modes '<span style="color: #66cc66;">&#40;</span>org-mode objc-mode jde-mode sql-mode
                                  change-log-mode text-mode
                                  makefile-gmake-mode makefile-bsdmake-mo
                                  autoconf-mode makefile-automake-mode<span style="color: #66cc66;">&#41;</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">
<ul>
<li id="sec-2.2.1">结构化编辑 <br/>
<ul>
<li id="sec-2.2.1.1">标题 <br/><br />
一级标题是一个*，两级标题是两个*，三级标题&hellip;&hellip; 最多可以建10级标题。注意，这里的*必须在行首。Publish之后会自动生成目录链接。在Emacs中S-Tab可以收起所有的目录树，在标题上按Tab可以展开/收起该标题下的所有内容。在标题上按Alt+左右方向键可以减少/增加该标题的级别。
</li>
<li id="sec-2.2.1.2">枚举和列表 <br/><br />
在org mode中还支持枚举(unordered list)，有序的列表(ordered list)和带描述的列表。</p>
<p>
枚举可以用&#8217;-',&#8217;+',或者非行首的&#8217;*&#8217; 作为bullets.同时，可以用开头的空格来区分枚举的层次结构。
</p>
<ul>
<li>
枚举1
</li>
<li>
枚举2
</li>
<li>
枚举3
</li>
<li>
枚举4</p>
</li>
</ul>
<p>有序的列表可以由&#8217;1.&#8217;或&#8217;1)&#8217;来组织。这里可以方便的使用Alt+左右方向键调整列表项的级别。M-Ret可以在当前位置插入一个列表项；C-Ret可以在文档尾部插入一个列表项或者标题。
</p>
<ol>
<li>
第一级
</li>
<li>
第二级</p>
<ol>
<li>
第二级第一点
</li>
</ol>
</li>
<li>
第三级 </p>
<p>
带描述的列表效果是这样的：
</p>
<dl>
<dt>Elijah Wood</dt>
<dd>
He plays Frodo
</dd>
<dt>Sean Austin</dt>
<dd>
He plays Sam, Frodo’s friend. I still remember<br />
在文档中是这样的：</p>
</dd>
</dl>
</li>
</ol>
<pre class="src src-TEXT">- Elijah Wood :: He plays Frodo
- Sean Austin :: He plays Sam, Frodo&#8217;s friend. I still remember
</pre>
<p>
5个或以上的“-”是一个水平分割符。</p>
<hr/>
</li>
<li id="sec-2.2.1.3">脚注 <br/><br />
org mode可以为文章添加脚注，脚注有如下两种方式：</p>
<pre class="src src-TEXT">blabla[1]
blablabla[fn:bla]
</pre>
<p>
效果是这样的：<br />
blabla<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup><br />
blablabla<sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup>
</p>
<p>
接下来必须顶格写这些脚注的内容了，这样在文档的末尾会自动生成脚注。C-c C-c可以在脚注的标记与内容之间切换。C-c C-x f可以在当前位置添加一个脚注。
</p>
<pre class="example">
[1] 12345
[fn:bla] 67890
</pre>
</li>
<li id="sec-2.2.1.4">结构化编辑的常用快捷方式 <br/><br />
这里是Structure Editing的默认快捷方式：</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">next/previous heading</th>
<th scope="col">C-c C-n/p</th>
</tr>
<tr>
<th scope="col">next/previous heading, same level</th>
<th scope="col">C-c C-f/b</th>
</tr>
<tr>
<th scope="col">backward to higher level heading</th>
<th scope="col">C-c C-u</th>
</tr>
<tr>
<th scope="col">jump to another place in document</th>
<th scope="col">C-c C-j</th>
</tr>
<tr>
<th scope="col">previous/next plain list item</th>
<th scope="col">S-UP/DOWN</th>
</tr>
</thead>
<tbody>
<tr>
<td>insert new heading/item at current level</td>
<td>M-RET</td>
</tr>
<tr>
<td>insert new heading after subtree</td>
<td>C-RET</td>
</tr>
<tr>
<td>insert new TODO entry/checkbox item</td>
<td>M-S-RET</td>
</tr>
<tr>
<td>insert TODO entry/ckbx after subtree</td>
<td>C-S-RET</td>
</tr>
<tr>
<td>turn (head)line into item, cycle item type</td>
<td>C-c -</td>
</tr>
<tr>
<td>turn item/line into headline</td>
<td>C-c *</td>
</tr>
<tr>
<td>promote/demote heading</td>
<td>M-LEFT/RIGHT</td>
</tr>
<tr>
<td>promote/demote current subtree</td>
<td>M-S-LEFT/RIGHT</td>
</tr>
<tr>
<td>move subtree/list item up/down</td>
<td>M-S-UP/DOWN</td>
</tr>
<tr>
<td>sort subtree/region/plain-list</td>
<td>C-c ^</td>
</tr>
<tr>
<td>clone a subtree</td>
<td>C-c C-x c</td>
</tr>
<tr>
<td>refile subtree</td>
<td>C-c C-w</td>
</tr>
<tr>
<td>kill/copy subtree</td>
<td>C-c C-x C-w/M-w</td>
</tr>
<tr>
<td>yank subtree</td>
<td>C-c C-x C-y or C-y</td>
</tr>
<tr>
<td>narrow buffer to subtree / widen</td>
<td>C-x n s/w</td>
</tr>
</tbody>
</table>
</li>
</ul>
</li>
<li id="sec-2.2.2">富文本编辑 <br/>
<ul>
<li id="sec-2.2.2.1">表格 <br/>
<p>
最基本的表格是这样的：
</p>
<pre class="example">| A | B |
| C | D |
</pre>
<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>A</td>
<td>B</td>
</tr>
<tr>
<td>C</td>
<td>D</td>
</tr>
</tbody>
</table>
<p>还可以：</p>
<pre class="example">#+CAPTION: 表格的标题
#+LABEL: tbl:table_label1
| A | B |
|---+---|
| C | D |
</pre>
<p>
在这里，CAPTION指定的是表格的标题，LABEL后的tbl用来指定在文档内部引用该表格的标签。<br />
效果是：
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption>ABCD</caption>
<colgroup>
<col align="left" />
<col align="left" />
</colgroup>
<thead>
<tr>
<th scope="col">A</th>
<th scope="col">B</th>
</tr>
</thead>
<tbody>
<tr>
<td>C</td>
<td>D</td>
</tr>
</tbody>
</table>
<p>C-c RET可以在光标所在表格内插入一行</p>
<p>
这里是表格相关的常用快捷键：
</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups" frame="hsides">
<caption></caption>
<colgroup>
<col align="left" />
<col align="left" />
<col align="left" />
</colgroup>
<tbody>
<tr>
<td>convert region to table</td>
<td>C-c</td>
<td></td>
</tr>
<tr>
<td>re-align the table without moving the cursor</td>
<td>C-c C-c</td>
</tr>
<tr>
<td>re-align the table, move to next field</td>
<td>TAB</td>
</tr>
<tr>
<td>move to previous field</td>
<td>S-TAB</td>
</tr>
<tr>
<td>re-align the table, move to next row</td>
<td>RET</td>
</tr>
<tr>
<td>move to beginning/end of field</td>
<td>M-a/e</td>
</tr>
<tr>
<td>move the current column left</td>
<td>M-LEFT/RIGHT</td>
</tr>
<tr>
<td>kill the current column</td>
<td>M-S-LEFT</td>
</tr>
<tr>
<td>insert new column to left of cursor position</td>
<td>M-S-RIGHT</td>
</tr>
<tr>
<td>move the current row up/down</td>
<td>M-UP/DOWN</td>
</tr>
<tr>
<td>kill the current row or horizontal line</td>
<td>M-S-UP</td>
</tr>
<tr>
<td>insert new row above the current row</td>
<td>M-S-DOWN</td>
</tr>
<tr>
<td>insert hline below (C-u : above) current row</td>
<td>C-c -</td>
</tr>
<tr>
<td>insert hline and move to line below it</td>
<td>C-c RET</td>
</tr>
<tr>
<td>sort lines in region</td>
<td>C-c ^</td>
</tr>
</tbody>
</table>
</li>
<li id="sec-2.2.2.2">引用文字或代码 <br/>
<pre class="example">我常用到的引用文字的标签是#+BEGIN_EXAMPLE / #+END_EXAMPLE ，在这之间的文字会保留原有的格式。

对于代码而言，可以用#+BEGIN_SRC SRC_TYPE / #+END_SRC，其中SRC_TYPE用来指定代码的类型，
如lisp, java, c, c++等。结合HTMLIZE可以让导出的HTML页面里的代码被按照语法着色。

为了保留引文的格式，还可以使用#+BEGIN_VERSE / #+END_VERSE 和#+BEGIN_QUOTE/ #+END_QUOTE. 

将引文居中排版可以使用#+BEGIN_CENTER / #+END_CENTER.
</pre>
</li>
<li id="sec-2.2.2.3">引用图片 <br/><br />
用如下方法可以直接在文档内显示图片:</p>
<pre class="example">#+CAPTION: title for the image
#+LABEL: fig:tag_for_img
      [[path/to/image.jpg]]
</pre>
<p>
CAPTION用来指定图片的标题，LABEL用来在文档内部引用这张图片。和表格一样，这两部分都不是必须的。
</p>
</li>
<li id="sec-2.2.2.4">插入链接或附件 <br/>
<p>
给文档添加附件非常简单，C-c C-a 然后就着菜单选好了，其中C-c C-a a是添加文件系统中的文件作为附件。
</p>
<p>
Org mode提供多种链接方式，包括链接到一个文件内部，链接到外部文件，电子邮件等等。
</p>
<ul>
<li id="sec-2.2.2.4.1">链接的格式： <br/>
<p>
链接主要是两种格式：
</p>
<pre class="example">[[link][description]] 或者 [[link]]
</pre>
<p>
例如 <a href="#www.sina.com.cn">SINA</a>
</p>
</li>
<li id="sec-2.2.2.4.2">如何访问链接： <br/><br />
在一个链接上按C-c C-o即可访问，至于调用什么程序访问，取决于链接的内容，emacs和org mode的配置了。</p>
</li>
<li id="sec-2.2.2.4.3">链接的类型 <br/>
<p>
如下都是可以支持的常用link类型：
</p>
<pre class="example"><a href="http://www.sina.com">http://www.sina.com</a>         Web
file:paper/lastdoc.pdf      本地文档，用相对路径表示
file:/path/to/filename      本地文档，用绝对路径表示
news:comp.emacs             新闻组
<a href="mailto:caole82@gmail.com">caole82@gmail.com</a>    邮件地址
</pre>
</li>
<li id="sec-2.2.2.4.4">内部链接 Internal Link <br/>
<p>
内部链接就类似于HTML的锚点（实际上export成HTML文件后就变成了锚点），可以实现在一个文档内部的跳转。
</p>
<p>
如下命令定义了一个名为target的跳转目标：
</p>
<pre class="example">#&lt;&lt;target&gt;&gt;
</pre>
<p>
如下方式可以设置到target的链接：
</p>
<pre class="example">[[target]] 或 [[target][description]]
</pre>
</li>
<li id="sec-2.2.2.4.5">其他常用链接命令 <br/>
<p>
C-c l 可以在光标所在处创建一个跳转目标点，在需要跳转至该目标的位置输入命令C-c C-l可以建立到目标的链接
</p>
<p>
当输入C-c C-l命令，光标若处在已经存在的一个链接上的时候，可以编辑改链接。
</p>
<p>
命令C-c %可以记录当前光标所在位置，当光标移到其他地方后，可以用C-c &amp;跳转回来。这里的位置记录类似一个kill-ring，重复输入C-c %可以记录多个位置，重复输入C-c &amp;可以连续跳转到之前记录的对应位置上。
</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3"><span class="section-number-3">3</span> 用Org Mode管理个人事务 </h3>
<div class="outline-text-3" id="text-3">
</div>
<div id="outline-container-3.1" class="outline-4">
<h4 id="sec-3.1"><span class="section-number-4">3.1</span> 关于TODO ITEM的基本知识和操作 </h4>
<div class="outline-text-4" id="text-3.1">
<ul>
<li id="sec-3.1.1">设置TODO项目 <br/><br />
所有标题只要以TODO开头，就会变成TODO 项目。例如：</p>
<pre class="example">
*** TODO 付手机费
*** TODO 开会
</pre>
</li>
<li id="sec-3.1.2">更改TODO项目的状态 <br/>
<pre class="example">C-c C-t Rotate the TODO state of the current item among
,-&gt; (unmarked) -&gt; TODO -&gt; DONE --.
'--------------------------------'
</pre>
<p>
C-c C-t是在定义的状态中循环，而C-u C-c C-t可以指定一个状态。
</p>
<p>
S-Right 和 S-Left也可以在定义的状态中循环。
</p>
<p>
C-c a t可以显示所有的TODO项目，能从所有agenda file里非DONE状态的TODO项目都显示出来
</p>
<p>
S-M RET可以在当前项目下插入一个新的TODO 项目（与当前项目同一级别）
</p>
</li>
<li id="sec-3.1.3">更改TODO项目的优先级 <br/><br />
以下方式可以设置TODO ITEM的优先级：</p>
<pre class="example">*** TODO [#A] 付手机费
</pre>
<p>
C-c , 可以设置一个TODO项目的优先级<br />
S-Up/Down 可以增减一个TODO项目的优先级
</p>
</li>
<li id="sec-3.1.4">增加TODO Item的状态 <br/>
<p>
默认情况下，TODO Item只有两种状态，TODO和DONE。我们可以在.emacs中配置Org，以设置更多的中间状态，例如：<br />
用下面的方法，我们可以增加一个TODO Item的中间状态，这些状态是顺序的，通常是工作流中的不同状态。
</p>
<p>
<a name="org-todo-keywords-setting" id="org-todo-keywords-setting"></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('p41668code129'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668129"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41668code129"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> org-todo-keywords
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>sequence <span style="color: #ff0000;">&quot;TODO&quot;</span> <span style="color: #ff0000;">&quot;FEEDBACK&quot;</span> <span style="color: #ff0000;">&quot;VERIFY&quot;</span> <span style="color: #ff0000;">&quot;|&quot;</span> <span style="color: #ff0000;">&quot;DONE&quot;</span> <span style="color: #ff0000;">&quot;DELEGATED&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>另一种可能性是，每个TODO Item可能有不同的类型，例如，公司的TODO Item，家里的TODO Item。或者，我们可能把TODO Item分配给不同的人，因此我们可以自定义TODO keywords以表示一个TODO Item的不同类型。
</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('p41668code130'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668130"><td class="code" id="p41668code130"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> org-todo-keywords '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>type <span style="color: #ff0000;">&quot;Fred&quot;</span> <span style="color: #ff0000;">&quot;Sara&quot;</span> <span style="color: #ff0000;">&quot;Lucy&quot;</span> <span style="color: #ff0000;">&quot;|&quot;</span> <span style="color: #ff0000;">&quot;DONE&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>
有的时候我们可能对不同的TODO Item有不同的状态，例如，交手机费这类简单的事情只有TODO和DONE两种状态，但是对于解决一个程序的bug可能有REPORT, BUG, KNOWNCAUSE, FIXED等状态。这样我们需要定义不同的状态子集(subset)：
</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('p41668code131'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668131"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41668code131"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> org-todo-keywords
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>sequence <span style="color: #ff0000;">&quot;TODO&quot;</span> <span style="color: #ff0000;">&quot;|&quot;</span> <span style="color: #ff0000;">&quot;DONE&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>sequence <span style="color: #ff0000;">&quot;REPORT&quot;</span> <span style="color: #ff0000;">&quot;BUG&quot;</span> <span style="color: #ff0000;">&quot;KNOWNCAUSE&quot;</span> <span style="color: #ff0000;">&quot;|&quot;</span> <span style="color: #ff0000;">&quot;FIXED&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>sequence <span style="color: #ff0000;">&quot;|&quot;</span> <span style="color: #ff0000;">&quot;CANCELED&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>
C-S-Right/Left可以从一个子集跳转到另一个子集，而S-RIGHT/LEFT会在所有状态之间遍历。
</p>
<p>
我们还可以用快捷键来迅速切换一个TODO Item的状态。
</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('p41668code132'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668132"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41668code132"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> org-todo-keywords
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>sequence <span style="color: #ff0000;">&quot;TODO(t)&quot;</span> <span style="color: #ff0000;">&quot;|&quot;</span> <span style="color: #ff0000;">&quot;DONE(d)&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>sequence <span style="color: #ff0000;">&quot;REPORT(r)&quot;</span> <span style="color: #ff0000;">&quot;BUG(b)&quot;</span> <span style="color: #ff0000;">&quot;KNOWNCAUSE(k)&quot;</span> <span style="color: #ff0000;">&quot;|&quot;</span> <span style="color: #ff0000;">&quot;FIXED(f)&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>sequence <span style="color: #ff0000;">&quot;|&quot;</span> <span style="color: #ff0000;">&quot;CANCELED(c)&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>
上面说的都是全局的设置，我们也可以针对一个文件进行设置，如：
</p>
<pre class="example">#+TODO: TODO FEEDBACK VERIFY | DONE CANCELED
     (这里也可以用 #+SEQ_TODO，和#+TODO效果是一样的）
     对于类型的设置：
#+TYP_TODO: Fred Sara Lucy Mike | DONE
     对于多个子集的设置：
#+TODO: TODO | DONE
#+TODO: REPORT BUG KNOWNCAUSE | FIXED
#+TODO: | CANCELED
</pre>
</li>
<li id="sec-3.1.5">进度记录 <br/>
<p>
最基本的就是记录当一个Item被标记为DONE时的时间戳了，另外，在一个Item完成后，可能会想要写点心得或者备注什么的，可以用如下配置实现：</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('p41668code133'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668133"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41668code133"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> org-log-done 'time<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> org-log-done 'note<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>Org Mode还能记录每个状态改变的时间，但恐怕不是所有人都需要这么精细的控制了。
</p>
</li>
<li id="sec-3.1.6">把项目拆分成子项目 <br/>
<p>
很简单，高一级的TODO下所有的低级TODO就是它的子项目，在各级TODO的标题的任意位置插入[/] 或者[%]即会根据其子项目的完成情况自动更新进度。
</p>
<p>
如果想要当所有子项目都标记为Done的时候，父项目也被标记为Done，可以在配置中添加如下设置：
</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('p41668code134'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668134"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41668code134"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> org-summary-todo <span style="color: #66cc66;">&#40;</span>n-done n-not-done<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Swith entry to DONE when all subentries are done, to TODO otherwise.&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span>org-log-done org-log-states<span style="color: #66cc66;">&#41;</span>   <span style="color: #808080; font-style: italic;">; turn off logging.</span>
    <span style="color: #66cc66;">&#40;</span>org-todo <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> n-not-done <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;DONE&quot;</span> <span style="color: #ff0000;">&quot;TODO&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
另一种办法是，如果有大量的字项目，则可以使用check box来标记。
</p>
<p>
每一个item前只要加上一个[ ] 就变成了check box item, 这在TODO List Item里也是一样的。在TODO List里，C-c C-c可以切换check box item的选中与未选中的状态。
</p>
<pre class="example">** TODO Test [1/3]
- [X] Only a test
- [ ] It's another test
- [ ] Third test
</pre>
<p>
和Check Box Item相关的快捷键：<br />
C-c C-c    切换Check Box的状态<br />
M-S-Ret    插入新的check box item.
</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-3.2" class="outline-4">
<h4 id="sec-3.2"><span class="section-number-4">3.2</span> 标签 </h4>
<div class="outline-text-4" id="text-3.2">
<ul>
<li id="sec-3.2.1">标签的基本知识 <br/><br />
其实标签并不仅限于TODO Item，而是可以用在任何标题上。标签可以由所有字母，数字，<sub>和</sub>@构成，标签必须有一个前导的:并且还必须有一个后继的:，比如，看起来是这样的，‘:work:’，多个标签可以用:分开，例如：‘:work:urgent:’。</p>
<p>
需要用到的标签可以预先在配置文件里定义，和<a href="#org-todo-keywords-setting">增加TODO Item的状态</a>的方法一样，唯一的区别是这里用到的变量是org-tag-faces.
</p>
<p>
Tag是有继承性的，也就是说，假如一级标题的tag有work，则该级标题以下的所有子标题无论是否显式注明，都自动具有work的标签。例如：
</p>
<pre class="example">
* Meeting with sb.               :work:
** Summary with sb1.              :boss:notes:
*** TODO Prepare slides for him  :action:
</pre>
<p>
这里，Summary with sb1的标签就是work, boss, notes，最后一项的标签就是work, boss, notes, action.
</p>
</li>
<li id="sec-3.2.2">设置标签 <br/>
<p>
首先当然可以手动在标题后设置标签，键入:后，M-Tab自动提供标签的补齐。
</p>
<p>
也可以用命令插入标签：
</p>
<p>
C-c C-q 为当前标题插入标签<br />
C-c C-c 当光标在某标题栏时，为该标题插入标签（此时和C-c C-q功能一样）
</p>
<p>
默认情况下，org会动态维护一个Tag列表，即当前输入的标签若不在列表中，则自动加入列表以供下次补齐使用。
</p>
<p>
另一种方式是在配置文件中配置变量org-tag-alist全局性地预设一些tag，然后在org文件中设置：
</p>
<pre class="example">#+TAGS: @work @home @tennisclub
#+TAGS: laptop car pc sailboat
</pre>
<p>
这样，在该文件中只能使用个以上定义的7个标签。
</p>
<p>
如果想既使用预设的标签，又动态增加，则必须在文件中增加一个空的TAGS option.
</p>
<pre class="example">#+TAGS:
</pre>
<p>
在org中我们还可以给tag定义快捷键。对于全局的定义可以写在配置文件中：</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('p41668code135'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668135"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p41668code135"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> org-tag-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;@work&quot;</span> <span style="color: #66cc66;">.</span> ?w<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;@home&quot;</span> <span style="color: #66cc66;">.</span> ?h<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;laptop&quot;</span> <span style="color: #66cc66;">.</span> ?<span style="color: #b1b100;">l</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>这样要标记@work，@home，laptop就只需要按w, h, l键即可。如果不是全局的定义，即指针对一个文件有效，我们可以在文件中定义，其中，\n表示换行，等效于分开写在两个TAGS里。
</p>
<pre class="example">#+TAGS: @work(w) @home(h) @tennisclub(t) \n laptop(l) pc(p)
</pre>
<p>
假如我们要让@work, @home, @tennisclub变成互斥的，则可以定义：
</p>
<pre class="example">#+TAGS: { @work(w) @home(h) @tennisclub(t) } laptop(l) pc(p)
</pre>
<p>
这也可以在配置文件中定义，但需要用dummy tag :startgroup和:endgroup包围起来。</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('p41668code136'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41668136"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41668code136"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> org-tag-alist '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">startgroup</span> <span style="color: #66cc66;">.</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
                      <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;@work&quot;</span> <span style="color: #66cc66;">.</span> ?w<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;@home&quot;</span> <span style="color: #66cc66;">.</span> ?h<span style="color: #66cc66;">&#41;</span>
                      <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;@tennisclub&quot;</span> <span style="color: #66cc66;">.</span> ?t<span style="color: #66cc66;">&#41;</span>
                      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">endgroup</span> <span style="color: #66cc66;">.</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
                      <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;laptop&quot;</span> <span style="color: #66cc66;">.</span> ?<span style="color: #b1b100;">l</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;pc&quot;</span> <span style="color: #66cc66;">.</span> ?p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>C-c \ 可以用来查找某个tag下的所有项目<br />
C-c / m 建立符合某tag的sparse tree<br />
C-c a m 从所有agenda file里建立符合某tag的全局性列表<br />
C-c a M 同上，但只检查TODO item或org-tags-match-list-sublevels里指定要检查的项目。
</p>
</li>
</ul>
</div>
</div>
<div id="outline-container-3.3" class="outline-4">
<h4 id="sec-3.3"><span class="section-number-4">3.3</span> 时间和日期 </h4>
<div class="outline-text-4" id="text-3.3">
<p>
在TODO Item上我们通常还需要标记时间和日期，这里就包含了：
</p>
<ul>
<li>
普通的时间和日期，比如该TODO ITEM的开始时间，例如下午三点开会等。</p>
<pre class="example">&lt;2010-09-18 Sat 15:00&gt;
</pre>
</li>
<li>
每天，每周，每月，每年都重复的时间和日期，比如每周去一次健身房之类的。</p>
<pre class="example">* pick up Sam at school &lt;2007-05-16 Wed 12:30 +1w&gt;
</pre>
</li>
<li>
表示一段时间</p>
<pre class="example">* 在上海开会 &lt;2004-08-23 Mon&gt;--&lt;2004-08-26 Thu&gt;
</pre>
</li>
<li>
仅仅表示一段时间而已，不需要在其他模式中引用。（Inactive Timestamp）</p>
<pre class="example">* 今天吃饭吃到苍蝇了 [2010-09-28 Tue]
</pre>
</li>
</ul>
<p>C-c &gt;     打开Emacs Calendar<br />
C-c &lt;     把Emacs Calendar光标所在的日期插入到org mode光标所在处。<br />
C-c C-y   当光标放在time range上时，计算两个timestamp之间的天数。<br />
C-c !     用来添加一个inactive 的timestamp.
</p>
<p>
在我的配置文件中，我把C-c t 定义给了“插入一个timestamp”。
</p>
<p>
对于TODO item，我们常常需要指定什么时候开始这项工作，什么时候是截止日期，在org中分别是SCHEDULED 和DEADLINE.
</p>
<pre class="example">
*** TODO write article about the Earth for the Guide
The editor in charge is [[bbdb:Ford Prefect]]
DEADLINE: &lt;2004-02-29 Sun&gt;

*** TODO Call Trillian for a date on New Years Eve.
SCHEDULED: &lt;2004-12-25 Sat&gt;
</pre>
<p>
C-c C-d 插入一个Deadline<br />
C-c C-s 插入一个Schedule<br />
C-c / d 建立一个包含所有deadline的TODO项目的sparse tree<br />
C-c / b 建立一个包含deadline在指定日期前的TODO项目的sparse tree<br />
C-c / a 建立一个包含deadline在指定日期后的TODO项目的sparse tree
</p>
</div>
</div>
<div id="outline-container-3.4" class="outline-4">
<h4 id="sec-3.4"><span class="section-number-4">3.4</span> 我的TODO LIST解决方案 </h4>
<div class="outline-text-4" id="text-3.4">
<p>
我的TODO List方案基本上是在常规的待办事项上加上一些的GTD思想。
</p>
<p>
作为一个IT民工，我的生活比较简单，我不在家就在公司，两者都不在就基本在路上。因此我的TODO 项目的地点基本就是这三项。另外，有些项目需要用到电脑，有些不需要，有些都可以（比如看某本既有电子版又有纸版的书）。
</p>
<p>
下面列出了我用到的标签，TODO Item的中间状态很简单，就是TODO：未开始；INPROGRESS：进行中；和DONE：已完成。根据GTD的思想，有些TODO Item是2分钟内即可完成的，我把它们标记为immediately，立刻完成。wait是需要等待其他人或其他资源的；action是随时可以开始做的项目。
</p>
<pre class="example">#+TODO: TODO INPROGRESS | DONE
#+TAGS: @office(o) @home(h) @traffic(t)
#+TAGS: computer(c) nocomputer(n) either(e)
#+TAGS: immediately(i) wait(w) action(a)
</pre>
<p>
根据简化的GTD思想，TODO的项目分为Idea List; Task List; Project List; Someday/Maybe List; Reminder这五项。Reminder这一项和前四个关系不大，我用来记录一些备忘录，诸如下周末前要还房贷，某月某日是结婚纪念日之类的。这类提醒很多人喜欢记在Agenda里头，或者日历里。我更愿意直接写成条目放在Reminder里，每天看一下，这主要是因为我需要记住的事情不算太多，不需要用到Agenda。
</p>
<p>
每天抽两个时间做一下所谓的Mind Sweep，把所有想到可能要做的事情都扔进Idea List里头。每天抽一个时间整理一下Idea List，把不可能实现的直接删掉，把将来可能会做的，但现在肯定不做的扔到Someday/Maybe List中。Task List用于放一步即可完成的项目，Project List用于放比较复杂的项目，可能需要细分为许多个TODO Item，或者可能需要合作才能完成。
</p>
<pre class="example">
* Idea List:
* Task List:
* Project List:
* Someday/Maybe List:
* Reminder:
</pre>
<p>
这样，举个例子，每天到公司或者到家开始工作的时候，首先要做的是三步：
</p>
<ul>
<li>
按照GTD的说法是清空大脑，把脑子里的所有想法都列出来，然后放到Idea List。
</li>
<li>
用C-c \ 查询标签为@office或者@home 的未完成项目
</li>
<li>
浏览一下Reminder 里有没有和今天相关的事情。</p>
</li>
</ul>
<p>然后，在每天结束工作的时候清理一下 Idea List。
</p>
<p>
ORG Mode我主要的用处就是拿来记笔记和做Todo List，似乎它还有很多其他功能，等我需要的时候再去研究吧。
</p>
</div>
</div>
</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> 12345
</p>
<p class="footnote"><sup><a class="footnum" name="fn.2" href="#fnr.2">2</a></sup> 67890
</p>
</div>
</div>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/org-mode.htm' t='Emacs org mode学习笔记' d='' tag='C/C++,cursor,Emacs,emacser,emacser.com,face,IDE,lambda,meteor,meteor1113,org,Org Mode,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/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (185)</li>
	<li><a href="http://emacser.com/built-in-cedet.htm" title="用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET (2010年05月10日)">用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET</a> (97)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (345)</li>
	<li><a href="http://emacser.com/about.htm" title="关于 (2009年11月4日)">关于</a> (20)</li>
	<li><a href="http://emacser.com/emacs-ditaa.htm" title="Emacs中绘图 － ditaa篇 (2010年08月4日)">Emacs中绘图 － ditaa篇</a> (34)</li>
</ul>

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

