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

<channel>
	<title>Emacs中文网 &#187; Emacs</title>
	<atom:link href="http://emacser.com/t-emacs.htm/feed" rel="self" type="application/rss+xml" />
	<link>http://emacser.com</link>
	<description>没有我做不到的，只有你想不到的</description>
	<lastBuildDate>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>非程序员的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('p41783code22'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178322"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code22"><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('p41783code23'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178323"><td class="code" id="p41783code23"><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('p41783code24'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178324"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code24"><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('p41783code25'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178325"><td class="code" id="p41783code25"><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('p41783code26'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178326"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41783code26"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> copy-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('p41783code27'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178327"><td class="code" id="p41783code27"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c 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('p41783code28'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178328"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p41783code28"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> 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('p41783code29'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178329"><td class="code" id="p41783code29"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c 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('p41783code30'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178330"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
</pre></td><td class="code" id="p41783code30"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> 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('p41783code31'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178331"><td class="code" id="p41783code31"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c 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('p41783code32'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4178332"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code" id="p41783code32"><pre class="lisp" style="font-family:monospace;">     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> get-point <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">symbol</span> <span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #ff0000;">&quot;get the point&quot;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> <span style="color: #b1b100;">symbol</span> arg<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span>
&nbsp;
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> copy-thing <span style="color: #66cc66;">&#40;</span>begin-of-thing end-of-thing <span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;copy thing between beg &amp; end into kill ring&quot;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg <span style="color: #66cc66;">&#40;</span>get-point begin-of-thing <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>end <span style="color: #66cc66;">&#40;</span>get-point end-of-thing arg<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span>copy-region-as-kill beg end<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#41;</span>
&nbsp;
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> paste-to-mark<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;Paste things to mark, or to the prompt in shell-mode&quot;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>pasteMe 
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #ff0000;">&quot;shell-mode&quot;</span> major-mode<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span> <span style="color: #66cc66;">&#40;</span>comint-next-prompt <span style="color: #cc66cc;">25535</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>yank<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span> <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>mark<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>yank<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> arg
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> arg <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #b1b100;">nil</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> pasteMe<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> pasteMe<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

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

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

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

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

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

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


不要妖魔化 Emacs ！


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

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


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

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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-simple-use.htm' t='Emacs － 普通人的编辑利器' d='' tag='Emacs,emacser,emacser.com,IDE,org,Org Mode,screenshot,ubuntu,windows,代码折叠,插件,配色,鼠标' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (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/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>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-simple-use.htm/feed</wfw:commentRss>
		<slash:comments>44</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('p41677code44'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167744"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41677code44"><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('p41677code45'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167745"><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="p41677code45"><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('p41677code46'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167746"><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="p41677code46"><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('p41677code47'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167747"><td class="code" id="p41677code47"><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('p41677code48'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167748"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41677code48"><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('p41677code49'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167749"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p41677code49"><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('p41677code50'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167750"><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="p41677code50"><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('p41677code51'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167751"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41677code51"><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('p41677code52'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167752"><td class="code" id="p41677code52"><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('p41677code53'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167753"><td class="code" id="p41677code53"><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('p41677code54'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4167754"><td class="code" id="p41677code54"><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('p41668code67'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166867"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p41668code67"><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('p41668code68'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166868"><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="p41668code68"><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('p41668code69'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166869"><td class="code" id="p41668code69"><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('p41668code70'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166870"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41668code70"><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('p41668code71'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166871"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41668code71"><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('p41668code72'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166872"><td class="code" id="p41668code72"><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('p41668code73'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166873"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41668code73"><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('p41668code74'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166874"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41668code74"><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('p41668code75'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166875"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41668code75"><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('p41668code76'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166876"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41668code76"><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('p41668code77'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166877"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p41668code77"><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('p41668code78'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4166878"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41668code78"><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>
		<item>
		<title>Emacs 中的 TeX 排版系统</title>
		<link>http://emacser.com/auctex.htm</link>
		<comments>http://emacser.com/auctex.htm#comments</comments>
		<pubDate>Mon, 27 Sep 2010 04:58:23 +0000</pubDate>
		<dc:creator>bigclean</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[配置]]></category>
		<category><![CDATA[auctex]]></category>
		<category><![CDATA[bigclean]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[markdown]]></category>
		<category><![CDATA[tex]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41581</guid>
		<description><![CDATA[AucTeX 简介
关于 TeX
关于 TeX 或是 LaTeX 的介绍和使用由于篇幅就不在本文的范围之内，如果需要了解详情可以访问 ctex 论坛。
为何选用 AucTeX？
TeX 的编辑器很丰富，有跨平台的 TeXworks，Kile 以及 vim 的 LaTeX-suite 插件。选用 emacs+AucTeX 作为 tex 的编辑器与之相比还是有太多的优点。


跨平台 AucTeX 作为 emacs 的插件，自然可以实现跨平台，只是由于外部工具的限制在 windows 实在有诸般限制。


半 &#8216;WYSIWYG&#8217; TeX 的工作方式为 WYTIWYG，但是其搭配 emacs，AucTeX 可以对 tex文件进行分析，并且提供一部分的可视化特性，例如可以以粗体显示章节目录，以斜体表示 \textit{} 中的文本。另外配合 preview 组件，还可以显示 tex 文件中的公式和图片。


拓展性 AucTeX 是完全是 elisp 实现的，如果你觉得 AucTeX 不能很好的按照你预想的方式工作或是觉得 AucTeX 功能还是不够强大，你可以用 elisp 轻松的拓展其功能，当然这需要一定的 elisp 功力。


安装
安装条件
在 unix-like 上的手动安装比较方便，只需要 &#8220;./configure [...]]]></description>
			<content:encoded><![CDATA[<h3><a href="http://www.gnu.org/software/AucTeX/" target="_blank">AucTeX</a> 简介</h3>
<h4>关于 TeX</h4>
<p>关于 <a href="http://en.wikipedia.org/wiki/TeX/" target="_blank">TeX</a> 或是 <a href="http://latex-project.org/" target="_blank">LaTeX</a> 的介绍和使用由于篇幅就不在本文的范围之内，如果需要了解详情可以访问 <a href="http://bbs.ctex.org/" target="_blank">ctex 论坛</a>。</p>
<h4>为何选用 AucTeX？</h4>
<p>TeX 的编辑器很丰富，有跨平台的 <a href="http://code.google.com/p/texworks/" target="_blank">TeXworks</a>，Kile 以及 vim 的 <a href="http://vim-latex.sourceforge.net/" target="_blank">LaTeX-suite</a> 插件。选用 emacs+AucTeX 作为 tex 的编辑器与之相比还是有太多的优点。<span id="more-41581"></span></p>
<ul>
<li>
<p>跨平台 AucTeX 作为 emacs 的插件，自然可以实现跨平台，只是由于外部工具的限制在 windows 实在有诸般限制。</p>
</li>
<li>
<p>半 &#8216;WYSIWYG&#8217; TeX 的工作方式为 WYTIWYG，但是其搭配 emacs，AucTeX 可以对 tex文件进行分析，并且提供一部分的可视化特性，例如可以以粗体显示章节目录，以斜体表示 \textit{} 中的文本。另外配合 preview 组件，还可以显示 tex 文件中的公式和图片。</p>
</li>
<li>
<p>拓展性 AucTeX 是完全是 elisp 实现的，如果你觉得 AucTeX 不能很好的按照你预想的方式工作或是觉得 AucTeX 功能还是不够强大，你可以用 elisp 轻松的拓展其功能，当然这需要一定的 elisp 功力。</p>
</li>
</ul>
<h3>安装</h3>
<h4>安装条件</h4>
<p>在 unix-like 上的手动安装比较方便，只需要 &#8220;./configure &amp;&amp; make &amp;&amp; make install&#8221; 即可，但是当前系统需要满足这些条件：</p>
<ul>
<li>
<p>可以工作的 TeX 目录树 在 unix 上 <a href="http://tug.org/texlive/" target="_blank">TeXLive</a> 更加流行，当然各个 linux 发行版本也可以使用各自包管理系统安装 TeX，windows 上 <a href="http://miktex.org/" target="_blank">MikTeX</a> 更加流行。无论是如何安装，TeX 目录树都是很庞大的，你必须确保 TeX 可以编译。</p>
</li>
<li>
<p>ghostscript AucTeX 的 preview 组件在 DVI 和 PDF 模式需要<a href="http://www.cs.wisc.edu/~ghost/" target="_blank"> ghostscript</a> 的协作。</p>
</li>
</ul>
<h4>windows 下的安装</h4>
<p>需要单独说明下 AucTeX 在 windows 下的配置，windows 下建议使用官方提供的预编译版本，如现在的版本为 &#8220;AucTeX-11.86-e23.1-msw.zip&#8221;。如果喜欢折腾自己的话，也可以选择在 windows 编译安装 AucTeX，但是除了满足之前叙述的安装前提外，你还需要一个可以工作的 shell，现在只有 <a href="http://www.mingw.org/" target="_blank">MSYS</a> 和 <a href="http://cygwin.com/" target="_blank">Cygwin</a> 可供选择。最后还是再建议使用预编译的版本，更加建议你在 unix 下使用 emacs 和 TeX，可以免去太多的被折腾。</p>
<h4>加载 AucTeX</h4>
<p>首先你需要把 AucTeX 加入到 load-path 中，然后加载 AucTeX 即可。如把 AucTeX 的预编译安装包解压至 &#8220;~/.emacs.d/AucTeX&#8221; 路径，相应的配置如下，其他的目录也可以相应修改。</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('p41581code90'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4158190"><td class="code" id="p41581code90"><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;~/.emacs.d/lisps/AucTeX/site-lisp/site-start.d&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;AucTeX.el&quot;</span> <span style="color: #b1b100;">nil</span> t t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>load <span style="color: #ff0000;">&quot;preview-latex.el&quot;</span> <span style="color: #b1b100;">nil</span> t t<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: #b1b100;">equal</span> system-type <span style="color: #ff0000;">&quot;windows-nt&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>require 'tex-mik<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>另外，如果 emacs 是运行在多需折腾的 windows 平台上，系统会加载 &#8220;tex-mik&#8221;文件，这可以提供很多在 windows 上方便的设置。</p>
<h3>快速开始</h3>
<h4>LaTeX 设置</h4>
<p>通常情况下，编译 tex 文件选用的多是 LaTeX，plainTeX 和 conTeXt 相对使用要少一些。因此本文默认只涉及对 LaTeX 模式相关的设置。</p>
<p>为了使用 AucTeX 方便，为 LaTeX 模式 hook 自动换行，数学公式，reftex 和显示行号的功能。</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('p41581code91'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4158191"><td class="code" id="p41581code91"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapc</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>mode<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>add-hook 'LaTeX-mode-hook mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> 'auto-fill-mode
            'LaTeX-math-mode
            'turn-on-reftex
            'linum-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>现在 TeX 对于中文的处理基本有两种方案，CJK 宏包和 xetex。如果使用 CJK 宏包需要对字体进行配置，这也是大部分面对 TeX 最折腾的地方。相比 CJK 宏包，xetex 要方便的多。本文也建议你设置 &#8216;TeX-engine&#8217; 变量为 xetex 替代 latex 作为 tex 文件的默认排版引擎。</p>
<p>在 LaTeX mode 中，默认开启 PDF mode，即默认使用 xelatex 直接生成 pdf 文件，而不用每次用 &#8216;C-c C-t C-p&#8217; 进行切换。设置 &#8216;Tex-show-compilation&#8217; 为 t，在另一个窗口显示编译信息，对于错误的排除很方便。另外，编译时默认直接保存文件，绑定补全符号到 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('p41581code92'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4158192"><td class="code" id="p41581code92"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>add-hook 'LaTeX-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> TeX-auto-untabify t     <span style="color: #808080; font-style: italic;">; remove all tabs before saving</span>
                  TeX-engine 'xetex       <span style="color: #808080; font-style: italic;">; use xelatex default</span>
                  TeX-show-compilation t<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">; display compilation windows</span>
            <span style="color: #66cc66;">&#40;</span>TeX-global-PDF-mode t<span style="color: #66cc66;">&#41;</span>       <span style="color: #808080; font-style: italic;">; PDF mode enable, not plain</span>
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> TeX-save-query <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span>imenu-add-menubar-index<span style="color: #66cc66;">&#41;</span>
            <span style="color: #66cc66;">&#40;</span>define-key LaTeX-mode-map <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;TAB&quot;</span><span style="color: #66cc66;">&#41;</span> 'TeX-complete-<span style="color: #b1b100;">symbol</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<h4>快速插入</h4>
<p>在 tex 文档中，为了结构化的需要，经常会需要插入 &#8216;\chapter&#8217;, &#8216;\section&#8217;,'\subsection&#8217; 命令。在 AucTeX 中，这些命令都可以通过 &#8216;C-c C-s&#8217; 一站式完成，你只需要告诉 AucTeX 你所需要插入章节层次(section level)，然后告诉 AucTeX 相应章节的标题，如果需要，你也可以添加相应的标签(可选)。</p>
<p>类似的，在 tex 文档中，必不可少的 &#8216;\begin{document}&#8217; 与 &#8216;\end{document}，以及众多的类似的各种各样的环境，自己在编辑 tex 文档时，经常会遗忘去匹配相应的环境，然后在编译时候要花费时间去修改。于 AucTeX 里你只需要键入&#8217;C-c C-e&#8217; 然后告诉 AucTeX 你所希望插入文档的环境，例如你键入了 &#8216;math&#8217;，AucTeX 会悉心的插入数学环境 &#8216;\begin{math}&#8217; 与 &#8216;\end{math}&#8217;。</p>
<p>AucTeX 还提供了 &#8216;C-c C-m&#8217; 快捷键供方便地插入宏命令，在大多数情况下 auxtex 都可以理解相应宏命令的参数个数并提示你一一输入。</p>
<p>在使用这些快捷键时，你可以使用 TAB 自动补全，或是使用 &#8216;M-p&#8217; 与 &#8216;M-n&#8217;浏览命令历史记录，也可以使用上下快捷键，但是相信众 emacs 党应该还是键盘流多，会更习惯前者。</p>
<p>此处涉及的相关快捷键如下：</p>
<table border="1">
<tr>
<td>C-c C-s</td>
<td>插入章节</td>
</tr>
<tr>
<td>C-c C-e</td>
<td>插入 LaTex 环境</td>
</tr>
<tr>
<td>C-c C-j</td>
<td>插入列表 item</td>
</tr>
<tr>
<td>C-c ]</td>
<td>闭合 LaTeX 环境</td>
</tr>
<tr>
<td>C-c C-m</td>
<td>插入 Tex 宏</td>
</table>
<h4>快速更改字体</h4>
<p>AucTeX 也提供了一系列方便的快捷键用以方便的插入指定应该文本如何格式化的命令，这系列命令一致以 &#8216;C-c C-f&#8217; 为前缀，以 &#8216;C- &#8216; 结尾告诉 AucTeX 你具体需要如何排版文本。</p>
<table border="1">
<tr>
<td>C-c C-f C-b</td>
<td>插入粗体文本</td>
</tr>
<tr>
<td>C-c C-f C-i</td>
<td>插入斜体文本</td>
</tr>
<tr>
<td>C-c C-f C-e</td>
<td>插入强调文本</td>
</tr>
<tr>
<td>C-c C-f C-s</td>
<td>插入微斜体文本</td>
</tr>
<tr>
<td>C-c C-f C-r</td>
<td>插入罗马体文本</td>
</tr>
<tr>
<td>C-c C-f C-f</td>
<td>插入无衬线体文本</td>
</tr>
<tr>
<td>C-c C-f C-t</td>
<td>插入打印机体字体</td>
</tr>
<tr>
<td>C-c C-f C-c</td>
<td>插入小型大写文本</td>
</tr>
<tr>
<td>C-c C-f C-d</td>
<td>删除字体信息</td>
</table>
<p>默认情况下，输入以上的快捷键时，会假定插入新的相应格式化文本，如果你希望更改已存在文本的话，需要先设定区域，然后再使用这些快捷键。</p>
<h4>一站式的编译、查看、打印服务</h4>
<p>如果你已经完成了 tex 文档的编写想查看排版后输出的 pdf，试着输入 &#8216;C-c C-c&#8217;，AucTeX 会询问你想调用那项命令，在大多数情形中，AucTeX 所建议给出的命令往往可以符合你的需要。例如，你刚刚完成对文档的修改，此时 AucTeX 所给出的建议命令为 &#8216;latex&#8217;，即建议你重新编译文档，而如果你已经完成对最新文档的编译，AucTeX 会建议你查看最新的 pdf，而不是再次对文档进行编译(如果需要更新文档的交叉索引信息，可能需要多次的编译)。</p>
<p>如果 AucTeX 给出的建议命令不合适，你可以键入 TAB 查看当前可用的命令，然后再指定 AucTeX 运行相应的合适命令。</p>
<p>在对于自定义查看文档命令的设置中，不推荐使用原来的&#8217;TeX-output-view-style&#8217;，而更推荐灵活性更强的 &#8216;TeX-view-program-list&#8217;与&#8221;TeX-view-program-selection&#8221;。&#8217;TeX-output-view-style&#8217; 是直接绑定指定类型与相应的 viewer，而对于后者，在不同系统平台之间你需要定义阅读器，并且对于不同的类型灵活绑定。</p>
<p>&#8216;TeX-view-program-list&#8217; 控制 AucTeX 预定义的 viewer，包括符号名与具体定义所调用的命令或函数，预定义为 &#8216;TeX-view-program-list-builtin&#8217; 的内容，有兴趣可以查看一下该变量的内容。如果需要自定义，如在 windows 平台上，可能会定义 SumatraPDF 查看 pdf 文档，而把相应的符号名记为 SumatraPDF，那就可以使用如下的命令去定义。</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('p41581code93'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4158193"><td class="code" id="p41581code93"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> TeX-view-program-<span style="color: #b1b100;">list</span>
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;SumatraPDF &quot;</span>SumatraPDF<span style="color: #66cc66;">.</span>exe <span style="color: #66cc66;">%</span>o<span style="color: #ff0000;">&quot;)))</span></pre></td></tr></table></div>

<p>当然仅仅只是定义了符号名，而对于该符号名所对应的具体 viewer 在该平台是否可用，是需要使用者自己去选择控制的。更通用而言，你可能需要同时使用Linux 与 Windows 系统，那你需要分别定义其上平台的 viewer，如下的设置中就分别定义了 SumatraPDF, Gsview 用于 Windows 平台，Okular, Evince, Firefox用于Linux 平台。</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('p41581code94'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4158194"><td class="code" id="p41581code94"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> TeX-view-program-<span style="color: #b1b100;">list</span>
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;SumatraPDF&quot;</span> <span style="color: #ff0000;">&quot;SumatraPDF.exe %o&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Gsview&quot;</span> <span style="color: #ff0000;">&quot;gsview32.exe %o&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Okular&quot;</span> <span style="color: #ff0000;">&quot;okular --unique %o&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Evince&quot;</span> <span style="color: #ff0000;">&quot;evince %o&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Firefox&quot;</span> <span style="color: #ff0000;">&quot;firefox %o&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>对于如上的示例而言，在 Windows 平台上绑定 SumatraPDF 为 pdf viewer，Miktex 的组件 Yap 为 dvi viewer，而在 Linux 平台上，或许需要 Okular 作为pdf 与 dvi 的 viewer。当然对于 Gnomer 而言，Evince 应该是比 Okular 更好的选择。</p>
<p>PS:</p>
<ul>
<li>
<p>对于 windows 平台而言，需要确保命令在 PATH 路径下，如果没有在 PATH 路径下，请使用路径全名进行调用。</p>
</li>
<li>
<p>由于自己没有 MacOsX 平台使用经验，所以没有对此作相关的 viewer 设置如果有需要，也可以自己设置。</p>
</li>
</ul>
<p>在设置好了 viewer 之后，就需要在不同类型的文件类型与相应的 viewer 之间进行绑定。&#8217;TeX-view-program-selection&#8217; 变量用于指定如何用 viewer 查看指定类型的文件。</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('p41581code95'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4158195"><td class="code" id="p41581code95"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span>
 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> system-type 'windows-nt<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-hook 'LaTeX-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> TeX-view-program-selection '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>output-pdf <span style="color: #ff0000;">&quot;SumatraPDF&quot;</span><span style="color: #66cc66;">&#41;</span>
                                                 <span style="color: #66cc66;">&#40;</span>output-dvi <span style="color: #ff0000;">&quot;Yap&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
 <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> system-type 'gnu/linux<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>add-hook 'LaTeX-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> TeX-view-program-selection '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>output-pdf <span style="color: #ff0000;">&quot;Okular&quot;</span><span style="color: #66cc66;">&#41;</span>
                                                 <span style="color: #66cc66;">&#40;</span>output-dvi <span style="color: #ff0000;">&quot;Okular&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>可以看出，使用后者绑定 viewer 与指定类型相对要更灵活的多，而 AucTeX 手册也推荐此种方式，而且感觉可读性也更好。而在以后的版本中，可能会移除&#8217;TeX-output-view-style&#8217; 变量。</p>
<h3>进阶使用</h3>
<h4>编译片段文件</h4>
<p>编译片段文件是个很实用的功能，如果你的文档很庞大，但是你只是需要看一下最近编辑修改过的片段，这时就很有用。</p>
<p>用快捷键设置好一个片段(region)，然后按下 &#8216;C-c C-r&#8217; 编译文件，然后再按 &#8216;C-c C-r&#8217; 就可以查看片段编译后的文件了。</p>
<p>编译片段文件的过程中，AucTeX 先首先生成 _region_.tex 文件，然后再依次进行编译和查看的操作，当然你也可以设置 &#8216;TeX-region&#8217; 控制生成的文件名。而为了生成 _region_.tex 文件，AucTeX 需要知道那些是文档开始需要的内容(例如文档类，载入的宏包和自定义信息)，那些是文档结束的内容。在 AucTeX 中，这两者是由变量&#8217;TeX-header-end&#8217; 与 &#8216;TeX-trailer-start&#8217; 控制的。前者在 LaTeX mode 中默认为 &#8216;\begin{document}，而后者默认为\end{document}，因此AucTeX 会截取文件开始到 &#8216;TeX-header-end&#8217; 的内容和片段内容以及&#8217;TeX-trailer-start&#8217; 的内容组成 _region_.tex 文件。也可以简单的理解成 AucTeX 把原来文件的文档内容替换成了片段内容的过程。</p>
<p>此外，设置好 region，按 &#8216;C-c C-t C-r&#8217; 可以固定一个 &#8220;region&#8221;，即使光标位置改变，设定的将要部分编译的&#8221;region&#8221;也不会改变，可以随时修改&#8221;region&#8221;中的内容，再按 &#8216;C-c C-t C-r&#8217; 取消该&#8221;region&#8221;。</p>
<h4>多文件管理</h4>
<p>在协作文档时，为了便于对文档进行管理，一般都会把文档根据内容拆分成几个部分，搭配使用 LaTeX 的 \include(\input in plainTeX) 命令对文件进行组织。</p>
<p>举个例子，假设当前目录下有三个 tex 文件，master.tex, sectone.tex, secttwo.tex，其内容分别如下。</p>
<p>master.tex:</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="left2">Download <a href="http://emacser.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=41581&amp;download=master.tex">master.tex</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4158196"><td class="code" id="p41581code96"><pre class="latex" style="font-family:monospace;"><span style="color: #E02020; ">\</span><a href="http://www.golatex.de/wiki/index.php?title=%5Cdocumentclass"><span style="color: #800000;">documentclass</span></a><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">article</span><span style="color: #E02020; ">}</span>
<span style="color: #C00000; font-weight: normal;">\begin</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">document</span></span><span style="color: #E02020; ">}</span>
<span style="color: #E02020; ">\</span><a href="http://www.golatex.de/wiki/index.php?title=%5Cinclude"><span style="color: #800000;">include</span></a><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">sectone</span><span style="color: #E02020; ">}</span>
<span style="color: #E02020; ">\</span><a href="http://www.golatex.de/wiki/index.php?title=%5Cinclude"><span style="color: #800000;">include</span></a><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">secttwo</span><span style="color: #E02020; ">}</span>
<span style="color: #C00000; font-weight: normal;">\end</span><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;"><span style="color: #0000D0; font-weight: normal;">document</span></span><span style="color: #E02020; ">}</span></pre></td></tr></table></div>

<p>sectone.tex:</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="left2">Download <a href="http://emacser.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=41581&amp;download=sectone.tex">sectone.tex</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4158197"><td class="code" id="p41581code97"><pre class="latex" style="font-family:monospace;"><span style="color: #E02020; ">\</span><a href="http://www.golatex.de/wiki/index.php?title=%5Csection"><span style="color: #800000;">section</span></a><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">one</span><span style="color: #E02020; ">}</span>
hello, world!</pre></td></tr></table></div>

<p>secttwo.tex:</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="left2">Download <a href="http://emacser.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=41581&amp;download=secttwo.tex">secttwo.tex</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4158198"><td class="code" id="p41581code98"><pre class="latex" style="font-family:monospace;"><span style="color: #E02020; ">\</span><a href="http://www.golatex.de/wiki/index.php?title=%5Csection"><span style="color: #800000;">section</span></a><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">two</span><span style="color: #E02020; ">}</span>
Don't be evil!</pre></td></tr></table></div>

<p>用 AucTeX 编辑 secttwo.tex 文件时，编译文件时就会出错，因为 AucTeX 无法知道当前文件所属的 master 文件，因此需要通知 AucTeX master 文件的信息。</p>
<p>为了便于对文件进行组织和管理，AucTeX 允许你为文件设置文件变量(file variables)。因此你可以把 sectwo.tex 修改成如下内容。</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="left2">Download <a href="http://emacser.com/wp-content/plugins/wp-codebox/wp-codebox.php?p=41581&amp;download=secttwo.tex">secttwo.tex</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4158199"><td class="code" id="p41581code99"><pre class="latex" style="font-family:monospace;"><span style="color: #E02020; ">\</span><a href="http://www.golatex.de/wiki/index.php?title=%5Csection"><span style="color: #800000;">section</span></a><span style="color: #E02020; ">{</span><span style="color: #2020C0; font-weight: normal;">two</span><span style="color: #E02020; ">}</span>
Don't be evil!
<span style="color: #2C922C; font-style: italic;">%%% Local Variables:</span>
<span style="color: #2C922C; font-style: italic;">%%% TeX-master: &quot;master&quot;</span>
<span style="color: #2C922C; font-style: italic;">%%% End:</span></pre></td></tr></table></div>

<p>现在再编译 secttwo.tex 文件，AucTeX 就可以知道 master.tex 文件为 master文件，AucTeX 会转去编译 master.tex 文件。因此，你需要在每个 tex 文件末尾添加相应的信息，文件一多，就会变得很繁琐。因此，AucTeX 提供了&#8217;TeX-master&#8217; 变量，可以设置其为 &#8220;master&#8221;，这样就可以通知所有的文件 master 文件总为 master.tex 文件。</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('p41581code100'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41581100"><td class="code" id="p41581code100"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>setq-default TeX-master <span style="color: #ff0000;">&quot;master&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>当然，如果你不需要对多文件进行组织和管理，设置 &#8216;TeX-master&#8217; 为 t 即可，即假设当前的文件总为 master 文件。</p>
<h3>reftex 与 preview 的使用</h3>
<p>reftex 和 preview 是使用 tex 的两个很方便的插件，reftex 为是 emacs 内置的插件，preview 也是 AucTeX 的组成部件。这两个组件使用的不是很多，但还是很有用。此处仅仅是对它们多简要的介绍，如果需要，可以查看相应的文档。</p>
<p>reftex 可以按文档目录结构浏览。在 LaTeX 缓冲中，按 C-c =，Emacs 会打开一个类似文档的目录的缓冲。</p>
<p>当然 reftex 的功能远远比此强大，更方便之处是配合 bibtex 可以很方便的插入参考文献。</p>
<p>preview 的好处是可以是 tex 文件中的数学公式和图片可视化，于相应的命令处用图片替代，当然这需要你的 emacs 开启图片支持和 ghostscript。</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/auctex.htm' t='Emacs 中的 TeX 排版系统' d='' tag='auctex,bigclean,Emacs,markdown,tex' 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/mew.htm" title="用Mew收发邮件 (2010年05月21日)">用Mew收发邮件</a> (82)</li>
	<li><a href="http://emacser.com/about.htm" title="关于 (2009年11月4日)">关于</a> (20)</li>
	<li><a href="http://emacser.com/emms.htm" title="Emacs下的多媒体系统 &#8211; EMMS (2010年03月8日)">Emacs下的多媒体系统 &#8211; EMMS</a> (20)</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/non-programmer.htm" title="非程序员的Emacs使用心得 (2010年12月27日)">非程序员的Emacs使用心得</a> (24)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/auctex.htm/feed</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Emacs开发VC程序</title>
		<link>http://emacser.com/dev-vc.htm</link>
		<comments>http://emacser.com/dev-vc.htm#comments</comments>
		<pubDate>Fri, 17 Sep 2010 15:07:03 +0000</pubDate>
		<dc:creator>fangzhzh</dc:creator>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[CEDET]]></category>
		<category><![CDATA[compile]]></category>
		<category><![CDATA[debug]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[eclipse]]></category>
		<category><![CDATA[ede]]></category>
		<category><![CDATA[edit]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[gud]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[progrmming]]></category>
		<category><![CDATA[snippet]]></category>
		<category><![CDATA[studio]]></category>
		<category><![CDATA[term]]></category>
		<category><![CDATA[vc]]></category>
		<category><![CDATA[Visual]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[yasnippet]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[补全]]></category>
		<category><![CDATA[配色]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41548</guid>
		<description><![CDATA[  vimers都说emacs慢，Eclipse, Visual Studio, Netbeans笑而不语。
                                 -- 佚名


背景

前些日子，微软宣布Visual studio 2010的EMACS扩展。此前，Visual studio 2005 6.01已然引入了Emacs的键盘模拟，这次又将Visual studio 的Emacs化更进一步，这种事发生在Microsoft这样无利不起早的企业,原因呢,你懂得。
话说，武功再高，也怕菜刀。Emacs玩的再溜，也保不齐哪天你要去开发Visual studio 程序。习惯了Emacs的高效，使用Visual studio 就是一个杯具1。这种情况，一般一颗红心，两手准备。一颗红心：cosplay，两手准备：1.Visual studio 扮Emacs 2Emacs扮Visual studio [...]]]></description>
			<content:encoded><![CDATA[<pre>  vimers都说emacs慢，Eclipse, Visual Studio, Netbeans笑而不语。
                                 -- 佚名</pre>
<p><img class="alignright" src="screenshots/microsoft_visual_studio.jpg" alt="" /></p>
<div class="outline-3">
<h3 id="sec-1">背景</h3>
<div class="outline-text-3">
<p>前些日子，<a href="http://blogs.msdn.com/b/visualstudio/archive/2010/09/01/emacs-emulation-extension-now-available.aspx" target="_blank">微软宣布Visual studio 2010的EMACS扩展</a>。此前，<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a><del>2005</del> 6.0<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup>已然引入了<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>的键盘模拟，这次又将<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a>的<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>化更进一步，这种事发生在<a href="http://www.microsoft.com/en/us/default.aspx" target="_blank">Microsoft</a>这样无利不起早的企业,原因呢,你懂得。<span id="more-41548"></span><br />
话说，武功再高，也怕菜刀。<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>玩的再溜，也保不齐哪天你要去开发<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a>程序。习惯了<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>的高效，使用<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a>就是一个杯具<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup>。这种情况，一般一颗红心，两手准备。一颗红心：cosplay，两手准备：1.<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a>扮<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a> 2<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>扮<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a>。</p>
</div>
<div class="outline-4">
<h4 id="sec-1_1">VC扮EMACS</h4>
<div class="outline-text-4">
<ul>
<li> 非官方扩展式<a href="http://sourceforge.net/projects/visEMACS/" target="_blank">visEMACS</a></li>
<li> 官方的<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>扩展<sup><a class="footref" name="fnr.2" href="#fn.2">2</a></sup></li>
</ul>
<p>不过，我对这种方式的经验总结：享受不到<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>的周到体贴，却净受VS的大小姐脾气了。不给力啊，不给力。不过，作为出差旅行，远程登陆，客户服务时，没有<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>可用时，让<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a>模拟一把<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>，也不失为一种没有办法的好办法了。</p>
<p>这个方法不是本文的重点，所以不深入。</p>
</div>
</div>
<div class="outline-4">
<h4 id="sec-1_2">EMACS扮VC</h4>
</div>
</div>
<div class="outline-3">
<h3 id="sec-2">配置EMACS为IDE</h3>
<div class="outline-text-3">
<p>一个基本的IDE，必备功能：编辑，编译，调试。</p>
</div>
<div class="outline-4">
<h4 id="sec-2_1">编辑</h4>
<div class="outline-text-4">
<p>应该很多人都很眼红<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio</a>的销魂的插件<a href="http://www.wholetomato.com/" target="_blank">visual assist x</a>吧。实时语法检查，快速打开文件，h,cpp文件，回到刚才编辑的地方，函数跳转，自动补全，插入模板。</p>
<p>可以号称操作系统的<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>怎么可能没有这些功能呢？尽管这些不在本文范围，但是稍稍提及功能在<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>中的对应，有兴趣想深入的请<a href="#www.google.com">Google</a>, <a href="#www.duckduckgo.com">Duckduckgo</a>, <a href="#www.wikipedia.com">Wikipedia</a>.</p>
<table border="2" cellspacing="0" cellpadding="6" rules="groups">
<caption> </caption>
<col align="left"></col>
<col align="left"></col>
<tbody>
<tr>
<td>VAX功能</td>
<td>EMACS对应功能</td>
</tr>
<tr>
<td>实时语法检查</td>
<td><a href="http://flymake.sourceforge.net/" target="_blank">Flymake</a> <sup><a class="footref" name="fnr.3" href="#fn.3">3</a></sup></td>
</tr>
<tr>
<td>快速打开文件</td>
<td><a href="http://ecb.sourceforge.net/" target="_blank">ECB</a>, <a href="#sec-2_1_1">快速打开文件</a></td>
</tr>
<tr>
<td>h,cpp跳转</td>
<td><a href="http://cedet.sourceforge.net/" target="_blank">CEDET</a> <sup><a class="footref" name="fnr.4" href="#fn.4">4</a></sup></td>
</tr>
<tr>
<td>回到刚才编辑的地方</td>
<td>Recent-jump<sup><a class="footref" name="fnr.5" href="#fn.5">5</a></sup></td>
</tr>
<tr>
<td>函数跳转</td>
<td><a href="http://cedet.sourceforge.net/" target="_blank">CEDET</a> <sup><a class="footref" name="fnr.4.2" href="#fn.4">4</a></sup></td>
</tr>
<tr>
<td>自动补全</td>
<td><a href="http://www.emacswiki.org/emacs/AutoComplete" target="_blank">Auto-complete</a> <sup><a class="footref" name="fnr.6" href="#fn.6">6</a></sup></td>
</tr>
<tr>
<td>插入模板</td>
<td><a href="http://code.google.com/p/yasnippet/" target="_blank">Yasnippet</a> <sup><a class="footref" name="fnr.7" href="#fn.7">7</a></sup></td>
</tr>
</tbody>
</table>
<ul>
<li>快速打开文件<br />
至于快速打开文件一项，我感觉<a href="http://ecb.sourceforge.net/" target="_blank">ECB</a>做的并不是特别好，如果C++程序的头文件和实现文件没有在一个文件夹，很难找到。所以我用了一个比较笨的方法，生成文件的列表到一个文件，使用<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>的查找功能和打开当前光标下文件的功能 find-file-at-point，我把它编定到了C-c C-f。这个过程还有两个副产物供cscope和etags用。确认你的机器上有cscope, find, etags<sup><a class="footref" name="fnr.8" href="#fn.8">8</a></sup>,将以下代码成为uptags.bat，放到系统的pathz中的某个文件夹下。</p>
<pre>%1
cd %2
rm TAGS
rm cscope.files
rm filelist.txt
rm cscope.in.out
rm cscope.out
rm cscope.po.out
if "%3" EQU "java" set PARAM=-name "*.java" -print
if "%3" EQU "c++" set PARAM=-name "*.cpp" -print -o -name "*.r" -print -o -name "*.[hcrHs]" -print -o -name "*.hpp" -print -o -name "*.lua" -print
echo %PARAM%
find . %PARAM% &gt; cscope.files
less cscope.files | xargs etags -aR
cscope -bkq -i cscope.files
cp cscope.files filelist.txt
find . -name "*.txt" -print &gt;&gt;  filelist.txt</pre>
<p>假设我们的C++工程在d:\mydocuments\workspace\cpp\，那么调用方法<sup><a class="footref" name="fnr.9" href="#fn.9">9</a></sup>为：</p>
<pre>uptags d: d:\mydocuments\workspace\cpp\ c++</pre>
<p>java工程在d:\mydocuments\workspace\java\， 那么调用方法为：</p>
<pre>uptags d: d:\mydocuments\workspace\java\ java</pre>
<p>那么打开文件helloworld.cpp的操作就是：C-x b filelist.txt , C-s helloworld.cpp, C-c C-f, RET。确实，稍显复杂，期待有更好的方法。</li>
</ul>
</div>
</div>
<div class="outline-4">
<h4 id="sec-2_2">编译</h4>
<div class="outline-text-4">
<p>编译的话基本上还是要靠<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a>自带的工具：nmake<sup><a class="footref" name="fnr.10" href="#fn.10">10</a></sup>，msdev。本文主要介绍msdev。</p>
<ul>
<li>使用msdev.exe<br />
msdev.exe位于安装路径下的bin目录，如我本机使用<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a>6.0，目录为&#8221;C:\Program Files\Microsoft Visual Studio\VC98\bin&#8221;。 直接调用msdev.exe，即启动<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio</a>的UI界面，同时msdev.exe也接受命令行调用。我们看其帮助。</p>
<pre>msdev /?
msdev /?
Usage:
  MSDEV [myprj.dsp|mywksp.dsw]    - load project/workspace
    []        - load source file
    /?            - display usage information
    /EX         - execute a VBScript macro
    /OUT         - redirect command line output to a file
    /USEENV            - ignore tools.options.directories settings
    /MAKE [] [...]    - build specified target(s)
          [
 -
 ]
          [[
|ALL] - [DEBUG|RELEASE|ALL]]
          /CLEAN        - delete intermediate files but don't build
          /REBUILD        - clean and build
          /NORECURSE    - don't build dependent projects</pre>
<p>假设我们有这么一个工程，路径为d:\Mydocuments\workbench\，工程目录结构，Configuration如下图<br />
<a href="http://emacser.com/uploads/sampleWorkspace.png"><img class="alignnone size-medium wp-image-41551" src="http://emacser.com/uploads/sampleWorkspace-300x268.png" alt="" width="300" height="268" /></a></li>
<li>可以通过命令msdev.exe来编译工程test2<sup><a class="footref" name="fnr.11" href="#fn.11">11</a></sup>。
<pre>C:\Program Files\Microsoft Visual Studio\VC98\bin\msdev.exe test2.dsw /Make  /NORECURSE</pre>
<p>同样，使用clean，rebuild可以清除、重编译该工程。将test2 改为test21，test23，即改变编译对象。 总这样写也很麻烦，而且为了在<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>中调用 ，我们将其写成一个批处理。</p>
<pre>d:
cd  d:\Mydocuments\workbench\
set project=%1
set target=%2
if  ==  set project=test2
if  ==  set target=/NORECURSE
msdev test2.dsw /Make  %target%</pre>
<p>保存为makTest2.bat。调用方式为：</p>
<pre>makeTest2 [工程 [目标]]</pre>
<p>默认为编译test2 的 /NORECURSE。如果要编译test23的rebuild，调用方式为：</p>
<pre>makeTest2 test23 /REBUILD</pre>
</li>
</ul>
</div>
</div>
<div class="outline-4">
<h4 id="sec-2_3">调试</h4>
<div class="outline-text-4">
<p>实际上，如果有了编辑，编译，那么调试就不需要了。因为调试器是一切罪恶他妈<sup><a class="footref" name="fnr.12" href="#fn.12">12</a></sup>。</p>
<p>哈哈，当然是开玩笑的了。作为一个有思想的程序员，要认清楚，编译器，调试器都只是恶魔，程序员本身，也就是我们，才是恶魔他妈（当然大部分是他爹^_^ ）。</p>
<p>哈哈，那么作为恶魔的产生者，我们当然要丰富自己的技能，而调试就是一个必杀技。我杀，bug闪……..</p>
<ul>
<li>cdb-gud<br />
要用<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>调试<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a>的程序，首先需要一个el – <a href="http://www.emacswiki.org/emacs/grandunifieddebugger#toc5" target="_blank">cdb-gud.el</a> 。cdb-gud使用<a href="http://www.microsoft.com/en/us/default.aspx" target="_blank">Microsoft</a>的命令行调试器cdb来调试程序。 cdb-gud.el只需下载，然后在.emacs中使用下面语句，cdb-gud就随时待命了。</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('p41548code105'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41548105"><td class="code" id="p41548code105"><pre class="lisp" style="font-family:monospace;"> +cdb <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#91;</span>http<span style="color: #66cc66;">:</span>//msdn<span style="color: #66cc66;">.</span>microsoft<span style="color: #66cc66;">.</span>com/en-us/vstudio/default<span style="color: #66cc66;">.</span>aspx<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#91;</span>Visual studio <span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#93;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">when</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> system-type 'windows-nt<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>load-file <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>调用cdb-gud: M-x cdb RET。</li>
<li><a href="http://www.microsoft.com/en/us/default.aspx" target="_blank">Microsoft</a>命令行调试器cdb.exe<br />
如果你是一个Windows程序员，Windbg听说过吗？如果没有听说过，我建议你去看看《<a href="http://book.douban.com/subject/3088353/" target="_blank">软件调试</a>》，这本书讲的非常的透彻。 注意，这是一本厚度为1000页的砖头书。如果你没有耐心去读这么厚的书，那么还有一个选择，《<a href="http://book.douban.com/subject/2302201/" target="_blank">Windows用户态程序高效排错</a>》， 内容236页，内容写的不多，但是书内提供的资源。 两本书排名不分先后。那么cdb就在Windbg的安装目录下。Windbg是Windows下的能用户态调试核心态调试的强大的图形界面的调试器。那么，简而言之，尽管不太准确<sup><a class="footref" name="fnr.13" href="#fn.13">13</a></sup>，cdb就是非图形界面的调试用户态程序的windbg。</p>
<p>简要介绍一下cdb：cdb就是一个命令行的调试器，over。</p>
<p>深入探讨一学cdb: 我想很深入的探讨一下cdb，但是实在是没有如此深厚的内功，但是我可以推荐一些内容供有兴趣的去深入。</p>
<ul>
<li> WINDBG安装目录内的debugger.chm</li>
<li> <a href="http://windbg.info/doc/1-common-cmds.html" target="_blank">windbg info</a></li>
<li> <a href="http://msdn.microsoft.com/en-us/library/ff551063.aspx" target="_blank">MSDN的帮助</a></li>
</ul>
<p>强烈推荐将<a href="http://windbg.info/doc/1-common-cmds.html" target="_blank">windbg info</a> 打印出来在手边供不时查阅之需。</p>
<p>现在，来启动cdb-gud吧：M-x cdb RET</p>
<p>Showtime<sup><a class="footref" name="fnr.14" href="#fn.14">14</a></sup>!</li>
<li>例子<br />
建立一个<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx" target="_blank">Visual studio </a>的console典型的Hello world工程（比如刚才的test2），源代码如下<sup><a class="footref" name="fnr.15" href="#fn.15">15</a></sup>：</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('p41548code106'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41548106"><td class="code" id="p41548code106"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;stdafx.h&quot;</span>
<span style="color: #339933;">#include</span>
<span style="color: #993333;">void</span> assign <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> a<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> n<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #993333;">int</span> a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
  assign<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> <span style="color: #0000dd;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>通过上边程序，我们期待打出所有0-99的数，每个数是间隔一个制表符，每十个数打出一个换行。</p>
<p>我们编译运行代码，得到结果：</p>
<pre>-858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460
-858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460
-858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460
-858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460
-858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460
-858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460
-858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460
-858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460
-858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460
-858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460  -858993460</pre>
<p>有点奇怪，为什么没有得到我们需要的东西呢？？</p>
<p>从代码中貌似看不到直接的证据证明我们的代码逻辑的错误。我们就祭出cdb。</p>
<p>M-x cdb RET</p>
<p>minibuffer: cdb d:\Mydocuments\workbench\test2\debug\test2.exe 会有以下界面提示。</p>
<pre>Microsoft (R) Windows Debugger Version 6.11.0001.404 X86
Copyright (c) Microsoft Corporation. All rights reserved.

CommandLine: d:/Mydocuments/workbench/tmp/VCTest/test2/test/Debug/test.exe
Symbol search path is: C:\symbolsXpSp3;d:/Mydocuments/workbench/via/helios/coyote/Bin/MULTIMEDIA_PRO_240x320_Debug
Executable search path is:
*** WARNING: Unable to verify checksum for test.exe
ModLoad: 00400000 0042c000   test.exe
ModLoad: 7c900000 7c9b2000   ntdll.dll
ModLoad: 7c800000 7c8f6000   C:\WINDOWS\system32\kernel32.dll
(a90.1eb8): Break instruction exception - code 80000003 (first chance)
eax=00241eb4 ebx=7ffd9000 ecx=00000000 edx=00000001 esi=00241f48 edi=00241eb4
eip=7c90120e esp=0012fb20 ebp=0012fc94 iopl=0         nv up ei pl nz na po nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000202
ntdll!DbgBreakPoint:
7c90120e cc              int     3
0:000&gt; cdb: Reading initial command 'l+*;l-s'
Source options are ffffffff:
     1/t - Step/trace by source line
     2/l - List source line at prompt
     4/s - List source code at prompt
     8/o - Only show source code at prompt
Source options are fffffffb:
     1/t - Step/trace by source line
     2/l - List source line at prompt
     8/o - Only show source code at prompt
0:000&gt;</pre>
<pre>0:000: bp main</pre>
<p>bp 表示打断点，断点的方式有几种：函数名，文件行数，内存地址。</p>
<p>但是我最喜欢的还是：当调试过程已经在运行，*在<a href="http://www.gnu.org/software/emacs/" target="_blank">Emacs</a>中打开文件，走到需要打断点的行，C-x space*，断点就打到该行，很给力啊。</p>
<pre>Breakpoint 0 hit
test!main:
0040d880 55              push    ebp
0:000&gt; p
test!main+0x1e:
0040d89e 6a64            push    64h
0:000&gt; t
test!ILT+15(?assignYAXQAHHZ):
00401014 e907c80000      jmp     test!assign (0040d820)
0:000&gt; p
test!assign:
0040d820 55              push    ebp
0:000&gt; p
test!assign+0x18:
0040d838 c745fc00000000  mov     dword ptr [ebp-4],0  ss:0023:0012fd8c=cccccccc</pre>
<p>g==go，所以表示开始运行程序。</p>
<p>p 单步跟踪，不进入子函数。</p>
<p>t 单步跟踪，但是进入子函数。</p>
<p>不出意外，当你使用p或者t跟踪程序的时候，源代码窗口已经打开，同时随着跟踪，相应的代码行也会高亮。</p>
<pre>0:000&gt; dv
              a = 0x0012fdf0
              n = 100
              i = -858993460
0:000&gt; p
test!assign+0x32:
0040d852 8b55fc          mov     edx,dword ptr [ebp-4] ss:0023:0012fd8c=00000000
0:000&gt; dv
              a = 0x0012fdf0
              n = 100
              i = 0
0:000&gt; dt a[0]
Local var @ 0x12fd98 Type a[ 100]
[0] 0x0012fdf0
 -&gt; -858993460
0:000&gt; dt a[1]
Local var @ 0x12fd98 Type a[0]
[1] 0x0012fdf0
 -&gt; -858993460
0:000&gt; dt a[i]
Local var @ 0x12fd98 Type a[1]
[0] 0x0012fdf0
 -&gt; -858993460</pre>
<p>dv：显示当前的局部变量。</p>
<p>dt: 显示指定的变量。</p>
<p>当前发现为什么a数组的值怎么是负数，不是期待的0呢？</p>
<pre>0:000&gt; k
ChildEBP RetAddr
0012fd90 0040d8ac test!assign+0x32 [D:\Mydocuments\workbench\tmp\VCTest\test2\test\test.cpp @ 10]
0012ff80 00401209 test!main+0x2c [D:\Mydocuments\workbench\tmp\VCTest\test2\test\test.cpp @ 21]
0012ffc0 7c817077 test!mainCRTStartup+0xe9 [crt0.c @ 206]
WARNING: Stack unwind information not available. Following frames may be wrong.
0012fff0 00000000 kernel32!RegisterWaitForInputIdle+0x49
0:000&gt; .frame 1
01 0012ff80 00401209 test!main+0x2c [D:\Mydocuments\workbench\tmp\VCTest\test2\test\test.cpp @ 21]
0:000&gt; dv
           argc = 1
              i = -858993460
Type information missing error for a
0:000&gt;</pre>
<p>k：打印出当前的栈内容</p>
<p>.frame：跳转到栈中的第几帧，当前为第0帧。</p>
<p>在.frame 1后，我们注意到以下代码：</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('p41548code107'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41548107"><td class="code" id="p41548code107"><pre class="c" style="font-family:monospace;"><span style="color: #993333;">int</span> a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>貌似a[ 100]没有初始化吧。</p>
<pre>0:000&gt; q</pre>
<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('p41548code108'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41548108"><td class="code" id="p41548code108"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &quot;stdafx.h&quot;</span>
<span style="color: #339933;">#include</span>
<span style="color: #993333;">void</span> assign <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> a<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #993333;">int</span> n<span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> n<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> i<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
  <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span><span style="color: #339933;">*</span> argv<span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
&nbsp;
  <span style="color: #993333;">int</span> a<span style="color: #009900;">&#91;</span><span style="color: #0000dd;">100</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">=</span><span style="color: #009900;">&#123;</span><span style="color: #0000dd;">0</span><span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
  assign<span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span> <span style="color: #0000dd;">100</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&amp;</span>lt<span style="color: #339933;">;</span> <span style="color: #0000dd;">100</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span>
  <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #0000dd;">0</span> <span style="color: #339933;">==</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">%</span> <span style="color: #0000dd;">10</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
      <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <a href="http://www.opengroup.org/onlinepubs/009695399/functions/printf.html"><span style="color: #000066;">printf</span></a><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%d<span style="color: #000099; font-weight: bold;">\t</span>&quot;</span><span style="color: #339933;">,</span> a<span style="color: #009900;">&#91;</span>i<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
  <span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>编译运行，结果：</p>
<pre>test\debug\test.exe

0 1 2 3 4 5 6 7 8 9
10  11  12  13  14  15  16  17  18  19
20  21  22  23  24  25  26  27  28  29
30  31  32  33  34  35  36  37  38  39
40  41  42  43  44  45  46  47  48  49
50  51  52  53  54  55  56  57  58  59
60  61  62  63  64  65  66  67  68  69
70  71  72  73  74  75  76  77  78  79
80  81  82  83  84  85  86  87  88  89
90  91  92  93  94  95  96  97  98  99</pre>
<p>那么cdb简单使用就介绍完了。</p>
<p>然而，其实很多cdb的强大功能都没有介绍到：</p>
<ul>
<li> 可以调试程序崩溃时留下的内存转储文件dump，调出其堆栈休息。</li>
<li> 可以附挂到一个正在运行的程序。</li>
<li> 远程调试</li>
<li> 显示，执行代码</li>
<li> 处理断点（支持复杂的条件断点）</li>
<li> 读写内存地址</li>
<li> 反汇编</li>
<li> 多线程调试</li>
</ul>
</li>
<li>Windows符号文件<br />
对于一般的console程序，可能这样就够了。但是在调试广大的Windows程序时，哪能不接触Windows的API啊，调试这些个玩意儿，才是让人头痛的东西呢，没有源代码！！cdb的一个机制可以让你没有源代码的情况下看到很多Windows的公开数据结构。</p>
<p>首先，先查看自己的系统的版本，在我的电脑-&gt;右键-&gt;属性，我可以看到我的系统是Microsoft Windos XP Professional Service Pace 3， 那么我就来<a href="http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx" target="_blank">这里</a>下载Windows的相应的符号文件。</p>
<p>将其安装到本机，比如：C:\symbolsXpSp3。添加环境变量：_NT_ALT_SYMBOL_PATH，设其值为安装目录。</p>
<p>经此设置，cdb在调试时就可以看到Windows API的符号文件。更多内容，还请参考帮助文档或者我推荐的两本书。</li>
</ul>
</div>
</div>
</div>
<div>
<h2 class="footnotes">Footnotes:</h2>
<div>
<p class="footnote"><sup><a class="footnum" name="fn.1" href="#fnr.1">1</a></sup> <a href="http://www.sethi.org/classes/comp270/lab_notes/lab_02_introduction_visual_cpp.html">@木鱼指出</a> 6.0中的Epsilon即为emacs模式。 <del>可查到资料中最早的是2005，</del> <a href="http://msdn.microsoft.com/en-us/library/ms165509%28VS.80%29.aspx">来源猛击我</a>。 <del>但是有可能更早，如果有资料，麻烦请留言告之.</del></p>
<p class="footnote"><sup><a class="footnum" name="fn.2" href="#fnr.2">2</a></sup> 此处没有贬低<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx">Visual studio </a>的意思，只是我中<a href="http://www.gnu.org/software/emacs/">Emacs</a>的毒已太深，用其它什么都不爽:)</p>
<p class="footnote"><sup><a class="footnum" name="fn.3" href="#fnr.3">3</a></sup> 下载链接<a href="http://visualstudiogallery.msdn.microsoft.com/en-us/09dc58c4-6f47-413a-9176-742be7463f92">Visual studio Emacs emulation addon</a></p>
<p class="footnote"><sup><a class="footnum" name="fn.4" href="#fnr.4">4</a></sup> flymake配置见<a href="http://marcelotoledo.com/2007/07/11/emacs-flymake/">http://marcelotoledo.com/2007/07/11/emacs-flymake/</a></p>
<p class="footnote"><sup><a class="footnum" name="fn.5" href="#fnr.5">5</a></sup> <a href="http://cedet.sourceforge.net/">CEDET</a>配置见<a href="http://emacser.com/c-cedet.htm">http://emacser.com/c-cedet.htm</a></p>
<p class="footnote"><sup><a class="footnum" name="fn.6" href="#fnr.6">6</a></sup> recent-jump 配置见<a href="http://liuminzhao.com/emacs/recent-jump-el-for-emacs/">http://liuminzhao.com/emacs/recent-jump-el-for-emacs/</a></p>
<p class="footnote"><sup><a class="footnum" name="fn.7" href="#fnr.7">7</a></sup> auto-complete 配置见<a href="http://emacser.com/auto-complete.htm">http://emacser.com/auto-complete.htm</a></p>
<p class="footnote"><sup><a class="footnum" name="fn.8" href="#fnr.8">8</a></sup> yasnippet主页<a href="http://code.google.com/p/yasnippet/">http://code.google.com/p/yasnippet/</a></p>
<p class="footnote"><sup><a class="footnum" name="fn.9" href="#fnr.9">9</a></sup> cygwin, mingw, msys, unixutils</p>
<p class="footnote"><sup><a class="footnum" name="fn.10" href="#fnr.10">10</a></sup> 好吧，我承认这个调用方法很蛋疼，如果你的工程比较少的话，其实可以将路径，程序类型什么的写到文件里，多整几个文件即可。upCppProject1Tags.bat, upCppProject2Tags.bat,upJavaPro1Tags.bat,upJavaPro2Tags.bat。</p>
<p class="footnote"><sup><a class="footnum" name="fn.11" href="#fnr.11">11</a></sup> <a href="http://www.gnu.org/software/emacs/windows/Developing-with-Emacs.html">此文</a> 介绍了如何使用nmake，但是恕我直言，我在<a href="http://msdn.microsoft.com/en-us/vstudio/default.aspx">Visual studio </a>的安装目录里没有找到nmake。</p>
<p class="footnote"><sup><a class="footnum" name="fn.12" href="#fnr.12">12</a></sup> 如果不成功，请注意检查大小写和空格。</p>
<p class="footnote"><sup><a class="footnum" name="fn.13" href="#fnr.13">13</a></sup> 调试器，恶魔之母 <a href="http://stackoverflow.com/questions/602138/is-a-debugger-the-mother-of-all-evil">http://stackoverflow.com/questions/602138/is-a-debugger-the-mother-of-all-evil</a></p>
<p class="footnote"><sup><a class="footnum" name="fn.14" href="#fnr.14">14</a></sup> 其实，用户态的windbg是图形界面的cdb。</p>
<p class="footnote"><sup><a class="footnum" name="fn.15" href="#fnr.15">15</a></sup> 谨以此名纪念我经历的一个软件项目：Showtime 0.7。</p>
<p class="footnote"><sup><a class="footnum" name="fn.16" href="#fnr.16">16</a></sup> 请注意，这是实验代码，所以请忽略魔幻数，程序是否有意义等话题。</p>
</div>
</div>
<div>
<div>
<p class="footnote"><sup><a class="footnum" name="fn.15" href="#fnr.15">15</a></sup> 请注意，这是实验代码，所以请忽略魔幻数，程序是否有意义等话题。</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/dev-vc.htm' t='Emacs开发VC程序' d='' tag='C/C++,CEDET,compile,debug,development,eclipse,ede,edit,Emacs,emacser,emacser.com,gud,IDE,org,progrmming,snippet,studio,term,vc,Visual,windows,yasnippet,光标,插件,补全,配色' 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/emacs-beginner-must-know.htm" title="Emacs初学者必知必会 (2010年01月24日)">Emacs初学者必知必会</a> (8)</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/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (345)</li>
	<li><a href="http://emacser.com/emacs-cpp-dev.htm" title="在Emacs下用C/C++编程 (2010年10月25日)">在Emacs下用C/C++编程</a> (33)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/dev-vc.htm/feed</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>折腾Emacs</title>
		<link>http://emacser.com/torture-emacs.htm</link>
		<comments>http://emacser.com/torture-emacs.htm#comments</comments>
		<pubDate>Mon, 16 Aug 2010 17:37:24 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[配置]]></category>
		<category><![CDATA[ahei]]></category>
		<category><![CDATA[ann]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[ctrl]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[eval-after-load]]></category>
		<category><![CDATA[face]]></category>
		<category><![CDATA[highlight]]></category>
		<category><![CDATA[mode-line]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[speedbar]]></category>
		<category><![CDATA[textmate]]></category>
		<category><![CDATA[theme]]></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=41522</guid>
		<description><![CDATA[作者: 小强
传说中神一样编辑器的Emacs向来以难学难用，喜欢折腾人著称。三天打渔两天晒网的我，居然心甘情愿地被它折腾了5，6年之久，期间苦乐不足为外人道也。

不过，以我的使用感觉，Emacs 更象是匹烈马：初时很难驾驭，可一旦征服，使用起来便得心应手，威力无穷。尽管被它折腾的不轻，但也因此学会了很多提高工作效率的小技巧。而在用 Emacs 编辑时更是可以做到心无旁骛，任由思路驰骋纵横在键盘间，达到一种所谓“流”的状态。


虽说如此，长久以来，还是有很多小细节让自己在使用Emacs的时候很是不爽，最近一周稍有闲暇，本着磨刀不误砍柴工的精神，也来折腾了一下 Emacs，居然被我搞定了几个困扰已久的配置。整理记录一下，希望能帮到遇到同样问题的朋友们。

Emacs 中文字体配置

这是最让我恼火的配置之一，在 Emacs 23 以前，由于底层不是 Unicode ，经常会遇到中文乱码的问题。好在 Emacs 23 中底层统一用 Unicode 重新实现了，现在不会再有乱码的问题，可是字体的配置却很麻烦，网上有很多的例子和文档，但都或多或少有些问题，总是不能尽善尽美。


最简单的字体设置方式是

?View Code LISP&#40;set-default-font &#34;-outline-Lucida Console-normal-normal-normal-mono-*-*-*-*-*-*-iso10646-1&#34; 1&#41;

但它的问题是，该设置只对初始的窗口（ Frame ）有效，对于新窗口 (如speedbar，或用快捷键 Ctrl-x 5 2 分出来的窗口）无效。改成下面的设置方法，字体设置对初始窗口和后面的新窗口就都会生效了。

?View Code LISP&#40;setq default-frame-alist &#40;font . &#34;Lucida Console 12&#34;&#41;&#41;

还有个问题，就是对中英文混排文本的字体支持，简单的方法是使用同时包含中文和英文的字体。网上有好心人把中文和等宽英文字体合并为新的字体，方便编程使用。比如我以前配置里用的“微软雅黑Monaco”字体就很不错。

?View Code LISP&#40;setq default-frame-alist &#40;font . &#34;微软雅黑Monaco 12&#34;&#41;&#41;

这种方法的缺点在于，你没办法单独换英文字体或中文字体，只能新做一个字体整体换掉。另外，网上做的字体里面，并没有包含斜体，显示的时候不够丰富。


其实 Emacs 本身支持根据字符编码去找合适的字体，不过需要按编码详细的设置，让 Emacs 明白遇到汉字编码要用宋体，而不是楷体或“Lucida Console”。

?View Code LISP1
2
3
4
&#40;set-fontset-font
    &#40;frame-parameter [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://blog.zhuoqiang.me/archives/torture-emacs/" target="_blank"><span style="color: #0000ff;"><b>小强</b></span></a></p>
<p>传说中神一样编辑器的Emacs向来以难学难用，喜欢折腾人著称。三天打渔两天晒网的我，居然心甘情愿地被它折腾了5，6年之久，期间苦乐不足为外人道也。<span id="more-41522"></span></p>
<p>
不过，以我的使用感觉，Emacs 更象是匹烈马：初时很难驾驭，可一旦征服，使用起来便得心应手，威力无穷。尽管被它折腾的不轻，但也因此学会了很多提高工作效率的小技巧。而在用 Emacs 编辑时更是可以做到心无旁骛，任由思路驰骋纵横在键盘间，达到一种所谓“流”的状态。
</p>
<p>
虽说如此，长久以来，还是有很多小细节让自己在使用Emacs的时候很是不爽，最近一周稍有闲暇，本着磨刀不误砍柴工的精神，也来折腾了一下 Emacs，居然被我搞定了几个困扰已久的配置。整理记录一下，希望能帮到遇到同样问题的朋友们。
</p>
<h3>Emacs 中文字体配置</h3>
<p>
这是最让我恼火的配置之一，在 Emacs 23 以前，由于底层不是 Unicode ，经常会遇到中文乱码的问题。好在 Emacs 23 中底层统一用 Unicode 重新实现了，现在不会再有乱码的问题，可是字体的配置却很麻烦，网上有很多的例子和文档，但都或多或少有些问题，总是不能尽善尽美。
</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('p41522code128'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522128"><td class="code" id="p41522code128"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>set-default-font <span style="color: #ff0000;">&quot;-outline-Lucida Console-normal-normal-normal-mono-*-*-*-*-*-*-iso10646-1&quot;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>但它的问题是，该设置只对初始的窗口（ Frame ）有效，对于新窗口 (如speedbar，或用快捷键 Ctrl-x 5 2 分出来的窗口）无效。改成下面的设置方法，字体设置对初始窗口和后面的新窗口就都会生效了。</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('p41522code129'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522129"><td class="code" id="p41522code129"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> default-frame-alist <span style="color: #66cc66;">&#40;</span>font <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;Lucida Console 12&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>还有个问题，就是对中英文混排文本的字体支持，简单的方法是使用同时包含中文和英文的字体。网上有好心人把中文和等宽英文字体合并为新的字体，方便编程使用。比如我以前配置里用的“微软雅黑Monaco”字体就很不错。</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('p41522code130'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522130"><td class="code" id="p41522code130"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> default-frame-alist <span style="color: #66cc66;">&#40;</span>font <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;微软雅黑Monaco 12&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这种方法的缺点在于，你没办法单独换英文字体或中文字体，只能新做一个字体整体换掉。另外，网上做的字体里面，并没有包含斜体，显示的时候不够丰富。
</p>
<p>
其实 Emacs 本身支持根据字符编码去找合适的字体，不过需要按编码详细的设置，让 Emacs 明白遇到汉字编码要用宋体，而不是楷体或“Lucida Console”。</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('p41522code131'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522131"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41522code131"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>set-fontset-font
    <span style="color: #66cc66;">&#40;</span>frame-parameter <span style="color: #b1b100;">nil</span> 'font<span style="color: #66cc66;">&#41;</span>
    'han
    <span style="color: #66cc66;">&#40;</span>font-spec <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #ff0000;">&quot;Microsoft Yahei&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">size</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>除了 han 以外，还有 kana, symbol, cjk-misc, bopomofo 这些编码集也要一并设置好。可以用 elisp 的 dolist 做循环操作，减少不必要的复制粘贴</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('p41522code132'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522132"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41522code132"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>charset '<span style="color: #66cc66;">&#40;</span>kana han <span style="color: #b1b100;">symbol</span> cjk-misc bopomofo<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>set-fontset-font <span style="color: #66cc66;">&#40;</span>frame-parameter <span style="color: #b1b100;">nil</span> 'font<span style="color: #66cc66;">&#41;</span>
                      charset
                      <span style="color: #66cc66;">&#40;</span>font-spec <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #ff0000;">&quot;Microsoft Yahei&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">size</span> <span style="color: #cc66cc;">12</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><b>切记不能图省事，直接把 unicode 字符编码集的字体设成中文</b>，这样的话，在 Windows 平台上，原来的英文字体设置就失效了</p>
<p>还有一点，原来对英文字体的设置方法要改成下面这样才能和中文的配合，否则 Emacs 会忽略英文字体的设置 ( 起码在 Windows 平台上是这样 )，所以最终的版本是：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code133'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522133"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p41522code133"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; Setting English Font</span>
<span style="color: #66cc66;">&#40;</span>set-face-attribute
  'default <span style="color: #b1b100;">nil</span> <span style="color: #66cc66;">:</span><span style="color: #555;">font</span> <span style="color: #ff0000;">&quot;Consolas 12&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Chinese Font</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>charset '<span style="color: #66cc66;">&#40;</span>kana han <span style="color: #b1b100;">symbol</span> cjk-misc bopomofo<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>set-fontset-font <span style="color: #66cc66;">&#40;</span>frame-parameter <span style="color: #b1b100;">nil</span> 'font<span style="color: #66cc66;">&#41;</span>
                      charset
                      <span style="color: #66cc66;">&#40;</span>font-spec <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #ff0000;">&quot;Microsoft Yahei&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">size</span> <span style="color: #cc66cc;">12</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>
字体的选择上，中文我比较喜欢微软雅黑字体，英文的字体我选择等宽字体方便编程。一般常使用 Monaco 或者 Consolas。Monaco 是那种一见倾心型的，字体设计的高挑修长，有种拉丁美人的性感。Consolas 是微软为新的 Visual Studio 专门打造的编程字体，虽然乍看没有 Monaco 那么精艳，可是相当耐看，如同小家碧玉，是个“居家过日子”的实用字体。听说 “DejaVu Sans Mono” 也不错，准备有时间试试看。
</p>
<p>
到这里，基本上 Emacs 的字体设置算是能赶上其它的编辑器了。可是，做为神一般的编辑器，只是赶上其它编辑器这也太丢人。下面要挑战一下自我，让神器发挥它应有的威力：<b>如何能够根据用户的喜好和操作系统的字体库来做最符合用户心意的字体设定呢？</b><br />
换言之，我想要的功能是：Emacs 你能不能做到，如果系统有雅黑字体，就请帮忙用雅黑，否则（如 Linux 系统上默认没有雅黑）就请用开源字体文泉驿微米黑。查了一下，网上没有现成的例子，只好挽起袖子，自己研究 elisp 编程动手写了一个设置字体的函数。</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('p41522code134'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522134"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41522code134"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> qiang-font-existsp <span style="color: #66cc66;">&#40;</span>font<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;">null</span> <span style="color: #66cc66;">&#40;</span>x-list-fonts font<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>其次，要按顺序找到一个字体列表( list ) 中第一个已经安装可用的字体，下面是个例子</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('p41522code135'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522135"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41522code135"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defvar font-<span style="color: #b1b100;">list</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Microsoft Yahei&quot;</span> <span style="color: #ff0000;">&quot;文泉驿等宽微米黑&quot;</span> <span style="color: #ff0000;">&quot;黑体&quot;</span> <span style="color: #ff0000;">&quot;新宋体&quot;</span> <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>require 'cl<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;; find-if is in common list package</span>
<span style="color: #66cc66;">&#40;</span>find-<span style="color: #b1b100;">if</span> #'qiang-font-existsp font-<span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>还要有个辅助函数，用来产生带上 font size 信息的 font 描述文本</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('p41522code136'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522136"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41522code136"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> qiang-make-font-string <span style="color: #66cc66;">&#40;</span>font-<span style="color: #b1b100;">name</span> font-size<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;">and</span> <span style="color: #66cc66;">&#40;</span>stringp font-size<span style="color: #66cc66;">&#41;</span> 
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">equal</span> <span style="color: #ff0000;">&quot;:&quot;</span> <span style="color: #66cc66;">&#40;</span>string <span style="color: #66cc66;">&#40;</span>elt font-size <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;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;%s%s&quot;</span> font-<span style="color: #b1b100;">name</span> font-size<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;%s %s&quot;</span> font-<span style="color: #b1b100;">name</span> font-size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这里绕的地方是，如果传入的 font-size 是“:pixelsize=18”这样的话，字体名称和它之间不能有空格。如果是普通的数字的话（ 12或“12”)，需要有个空格分隔字体名称和字体大小。</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('p41522code137'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522137"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code" id="p41522code137"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> qiang-set-font <span style="color: #66cc66;">&#40;</span>english-fonts
                       english-font-size
                       chinese-fonts
                       <span style="color: #66cc66;">&amp;</span>optional chinese-font-size<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;english-font-size could be set to <span style="color: #000099; font-weight: bold;">\&quot;</span>:pixelsize=18<span style="color: #000099; font-weight: bold;">\&quot;</span> or a integer.
If set/leave chinese-font-size to nil, it will follow english-font-size&quot;</span>
  <span style="color: #66cc66;">&#40;</span>require 'cl<span style="color: #66cc66;">&#41;</span>                         <span style="color: #808080; font-style: italic;">; for find if</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>en-font <span style="color: #66cc66;">&#40;</span>qiang-make-font-string
                  <span style="color: #66cc66;">&#40;</span>find-<span style="color: #b1b100;">if</span> #'qiang-font-existsp english-fonts<span style="color: #66cc66;">&#41;</span>
                  english-font-size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>zh-font <span style="color: #66cc66;">&#40;</span>font-spec <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #66cc66;">&#40;</span>find-<span style="color: #b1b100;">if</span> #'qiang-font-existsp chinese-fonts<span style="color: #66cc66;">&#41;</span>
                            <span style="color: #66cc66;">:</span><span style="color: #555;">size</span> chinese-font-size<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;">;; Set the default English font</span>
    <span style="color: #808080; font-style: italic;">;; </span>
    <span style="color: #808080; font-style: italic;">;; The following 2 method cannot make the font settig work in new frames.</span>
    <span style="color: #808080; font-style: italic;">;; (set-default-font &quot;Consolas:pixelsize=18&quot;)</span>
    <span style="color: #808080; font-style: italic;">;; (add-to-list 'default-frame-alist '(font . &quot;Consolas:pixelsize=18&quot;))</span>
    <span style="color: #808080; font-style: italic;">;; We have to use set-face-attribute</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;Set English Font to %s&quot;</span> en-font<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>set-face-attribute
     'default <span style="color: #b1b100;">nil</span> <span style="color: #66cc66;">:</span><span style="color: #555;">font</span> en-font<span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">;; Set Chinese font </span>
    <span style="color: #808080; font-style: italic;">;; Do not use 'unicode charset, it will cause the english font setting invalid</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;Set Chinese Font to %s&quot;</span> zh-font<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>charset '<span style="color: #66cc66;">&#40;</span>kana han <span style="color: #b1b100;">symbol</span> cjk-misc bopomofo<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>set-fontset-font <span style="color: #66cc66;">&#40;</span>frame-parameter <span style="color: #b1b100;">nil</span> 'font<span style="color: #66cc66;">&#41;</span>
                        charset
                        zh-font<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 字体设置就是小菜一碟了</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('p41522code138'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522138"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41522code138"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>qiang-set-font
 '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Consolas&quot;</span> <span style="color: #ff0000;">&quot;Monaco&quot;</span> <span style="color: #ff0000;">&quot;DejaVu Sans Mono&quot;</span> <span style="color: #ff0000;">&quot;Monospace&quot;</span> <span style="color: #ff0000;">&quot;Courier New&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;:pixelsize=18&quot;</span>
 '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Microsoft Yahei&quot;</span> <span style="color: #ff0000;">&quot;文泉驿等宽微米黑&quot;</span> <span style="color: #ff0000;">&quot;黑体&quot;</span> <span style="color: #ff0000;">&quot;新宋体&quot;</span> <span style="color: #ff0000;">&quot;宋体&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这样设置，Emacs 会优先选用 Consolas + “雅黑”的组合。如果“雅黑”没有装的话，就使用“文泉驿等宽微米黑”，依此类推。这份字体配置不用改动就能在不同的操作系统字体环境下面使用，相信应该没有其它编辑器有这么变态的后备字体列表设置了吧。至此，Emacs 在字体设置这方面总算是“体面”地稍稍胜出了其它编辑器。把上面的三个函数加到配置文件 .emacs 里赶快看看效果吧。
</p>
<h3>Emacs 字体大小的调整</h3>
<p>
在用 Emacs 做演示或代码审查的时候，经常需要调整默认的字体大小，以前常常为了这个而手忙脚乱。最近才知道，原来 Emacs 默认就有快捷键支持动态调整字体大小：
</p>
<ul>
<li>放大字体: Ctrl-x Ctrl-+ 或 Ctrl-x Ctrl-=</li>
<li>缩小字体: Ctrl-x Ctrl&#8211;</li>
<li>重置字体: Ctrl-x Ctrl-0</li>
</ul>
<p>更酷的是，如果要放大或缩小多次，在第二次直接按 ＋，－，0 就可以了，比如，放大 3 次： Ctrl-x Ctrl-= = = 。另外，Shift + 鼠标左键 也能唤出调整字体大小的弹出菜单。</p>
<p>
不过，能不能象网络浏览器和最新版的 Visual Studio 2010 那样，用 Ctrl 加上鼠标滚轮操作来设置字体大小呢，毕竟大部分人已经习惯了这种方式了。既然是无所不能的 Emacs，那当然没问题了，把下面的配置加入 .emacs 里再试试看 <img src='http://emacser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </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('p41522code139'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522139"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p41522code139"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; For Linux</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-mouse-4&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-increase<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-mouse-5&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-decrease<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; For Windows</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-wheel-up&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-increase<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-wheel-down&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-decrease<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
<h3>添加删除注释</h3>
<p>
写程序的，要经常和注释打交道，注释和反注释一段代码是家常便饭。可惜，Emacs 虽然有这个功能，默认的配置却并不好用：
</p>
<ul>
<li>注释/反注释这两个功能默认没有绑定快捷键</li>
<li>需要先选中一段区域才能调用注释功能，哪怕只想注释/反注释当前行</li>
<li>好在有一个 Alt-; 的快捷键，默认绑定了 comment-dwim，能注释/反注释当前激活的区域。如果没有激活区域，就在当前行末加注释</li>
</ul>
<p>其实 Alt-; 默认绑定的 comment-dwim 已经很理想了，可是，还是不够 dwim ( Do What I Mean )。能不能变成，如果没有激活的区域，就注释/反注释当前行，仅当在行尾的时候才在行尾加注释呢？下面的配置就是参考别人配置写的 “照我说的做”注释函数:</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('p41522code140'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522140"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p41522code140"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> qiang-comment-dwim-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;Replacement for the comment-dwim command.
If no region is selected and current line is not blank and we are not at the end of the line,
then comment current line.
Replaces default behaviour of comment-dwim, when it inserts comment at the end of 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>comment-normalize-vars<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;">and</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span>region-active-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</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;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>comment-or-uncomment-region <span style="color: #66cc66;">&#40;</span>line-beginning-position<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>line-end-position<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>comment-dwim 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>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\M</span>-;&quot;</span> 'qiang-comment-dwim-line<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这样一来，注释和反注释代码的操作只使用一个 Alt-; 键就全部搞定了，Emacs 会心领神会地“照我说的做”。</p>
<h3>复制当前行</h3>
<p>
这是个经常要用到的操作，以前要么老老实实 Mark 当前行的行首和行尾，然后复制。整个按键流程是：
</p>
<ol>
<li>Ctrl-a 光标到行首</li>
<li>Ctrl-Shift-Space 设置标记</li>
<li>Ctrl-e 光标到行尾。如此这一行就被选为激活的区域了</li>
<li>Alt-w 复制当前激活的区域</li>
</ol>
<p>要么按我比较习惯的操作先剪切当前行，再撤消上一次的剪切操作</p>
<ol>
<li>Ctrl-a 光标到行首</li>
<li>Ctrl-k 剪切至行屋，该行消失</li>
<li>Ctrl-/ 撤消上一次的操作，该行重现</li>
</ol>
<p>可以看到，方案二比方案一省一次按键，而且 Ctrl 键不用松开。不过，如此基本的操作要按三个键还是太麻烦了，而且方案二会让文件变成被编辑过的状态。其实，可以发挥一下“按我说的做”的精神。为什么不把 Alt-w 变的更聪明一些，当没有激活的区域时就复制当前的一整行呢？ 说做就做:
</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('p41522code141'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522141"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code" id="p41522code141"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; Smart copy, if no region active, it simply copy the current whole line</span>
<span style="color: #66cc66;">&#40;</span>defadvice kill-line <span style="color: #66cc66;">&#40;</span>before check-position activate<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;">member</span> major-mode
              '<span style="color: #66cc66;">&#40;</span>emacs-lisp-mode scheme-mode lisp-mode
                                c-mode c++-mode objc-mode js-mode
                                latex-mode plain-tex-mode<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;">and</span> <span style="color: #66cc66;">&#40;</span>eolp<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span>bolp<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;">progn</span> <span style="color: #66cc66;">&#40;</span>forward-char <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>just-one-space <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>backward-char <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;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defadvice kill-ring-save <span style="color: #66cc66;">&#40;</span>before slick-copy activate compile<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;When called interactively with no active region, copy a single line instead.&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> mark-active <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>region-beginning<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>region-end<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;Copied line&quot;</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>line-beginning-position<span style="color: #66cc66;">&#41;</span>
                       <span style="color: #66cc66;">&#40;</span>line-beginning-position <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><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defadvice kill-region <span style="color: #66cc66;">&#40;</span>before slick-cut activate compile<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;When called interactively with no active region, kill a single line instead.&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive
   <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> mark-active <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>region-beginning<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>region-end<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>line-beginning-position<span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span>line-beginning-position <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><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Copy line from point to the end, exclude the line break</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> qiang-copy-line <span style="color: #66cc66;">&#40;</span>arg<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Copy lines (as many as prefix argument) in the 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>kill-ring-save <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>line-end-position<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                  <span style="color: #808080; font-style: italic;">;; (line-beginning-position (+ 1 arg)))</span>
  <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;%d line%s copied&quot;</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> <span style="color: #cc66cc;">1</span> arg<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #ff0000;">&quot;s&quot;</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: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;M-k&quot;</span><span style="color: #66cc66;">&#41;</span> 'qiang-copy-line<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
上面还多加了一个配置，就是把 Alt-k 设成复制光标所在处到行尾。与 kill-line 的 Ctrl-k 对应。这样一来，如果是要拷贝一整行的话，只要将光标移动到该行任意位置，按下 Alt-w 就行了。如果是复制某个位置到行尾的文字的话，就把光标移到起始位置处，按 Alt-k 。比默认的操作简化了很多。
</p>
<h3>拷贝代码自动格式化</h3>
<p>Emacs 里对代码的格式化支持的非常好，不但可以在编辑的时候自动帮你格式化，还可以选中一块代码，按 Ctrl-Alt-\ 对这块代码重新进行格式化。如果要粘贴一块代码的话，粘贴完了紧接着按 Ctrl-Alt-\ 就可以把新加入的代码格式化好。可是，对于这种粘贴加上重新格式化的机械操作，Emacs 应该可以将它自动化才能配得上它的名气，把下面的代码加到配置文件里，你的 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('p41522code142'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522142"><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
</pre></td><td class="code" id="p41522code142"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>command '<span style="color: #66cc66;">&#40;</span>yank yank-pop<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eval</span>
   `<span style="color: #66cc66;">&#40;</span>defadvice <span style="color: #66cc66;">,</span>command <span style="color: #66cc66;">&#40;</span>after indent-region activate<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> current-prefix-arg<span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">member</span> major-mode
                   '<span style="color: #66cc66;">&#40;</span>emacs-lisp-mode
                     lisp-mode
                     clojure-mode
                     scheme-mode
                     haskell-mode
                     ruby-mode
                     rspec-mode
                     python-mode
                     c-mode
                     c++-mode
                     objc-mode
                     latex-mode
                     js-mode
                     plain-tex-mode<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>mark-even-if-inactive transient-mark-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span>indent-region <span style="color: #66cc66;">&#40;</span>region-beginning<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>region-end<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;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>你可以加入或删除一些 mode 名称来定制上面的配置。
</p>
<h3>Emacs 与 Windows 系统的整合</h3>
<p>在注册表中加入下面的项，右键上下文菜单中就会多出 “Emacs”，你可以使用它快速用 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('p41522code143'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522143"><td class="code" id="p41522code143"><pre class="text" style="font-family:monospace;">[HKEY_CLASSES_ROOT\AllFilesystemObjects\Shell\Emacs\command]
@=&quot;\&quot;D:\\full\\path\\to\\emacs\\bin\\emacsclientw.exe\&quot; -n -a \&quot;D:\\full\\path\\to\\emacs\\bin\\runemacs.exe\&quot; \&quot;%1\&quot;&quot;</pre></td></tr></table></div>

<p>
这里调用 emacsclientw.exe 是为了使用 server-mode 来避免再打开一个 Emacs 实例，-n 参数指明不需要等待 Emacs (server) 编辑结束就直接返回，-a 指明一个替代品：如果找不到 Emacs server，那就通过 &#8220;runemacs.exe &#8221; 启动一个 Emacs 实例来编辑。 不要忘了在 .emacs 里加入 (server-mode 1) 来自动启动 emacs server。
</p>
<p>
有些工具在使用外部工具时命令行不能带任何参数，遇到这种情况，只能写一个 BATCH 文件把上面的命令包装一下：
</p>
<pre>
D:\full\path\to\emacs\bin\emacsclientw.exe -n -a "D:\full\path\to\emacs\bin\runemacs.exe" %*
</pre>
<p>
如果装了 Visual Studio, 那么，在 Visual Studio 的菜单 Tools 下面可以通过 External Tools 加入一个自定义的外部工具。外部工具的命令可以使用上面定义的 emacsclientw.exe, 参数那栏加上 </p>
<pre>
-n -a "D:\full\path\to\emacs\bin\runemacs.exe" +$(CurLine) $(ItemPath)”
</pre>
<p>将这个外部工具设上一个方便的快捷键，比如我就设成 Alt-F1，这样每次用 Visual Studio 浏览代码时，如果看到想编辑的内容，直接 Alt-F1 就可以把 Emasc 呼出，光标会自动放在文件刚刚看的那行上面。编辑完了后再 Alt-Tab 就可以切会 Visual Studio 了。你可能还需要设置 Visual Studio 自动重新载入改过的文件，避免每次都弹出对话框让你确认是否重新载入。
</p>
<h3>Emacs 的配色</h3>
<p>
我以前的 Emacs 配色非常简单，黑底白字。用的时间长了会腻，而且，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('p41522code144'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522144"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41522code144"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> default-frame-alist
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>cursor-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;purple&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>cursor-type <span style="color: #66cc66;">.</span> box<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>foreground-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;white&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>background-color <span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;black&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
<p>
这两天在网上搜 Emacs 相关配置的时候，无意见发现了一个很漂亮的配置。一个好心人用了下 Mac 上的神级编辑器 TextMate。发现里面的 Blackboard 颜色主题很养眼，于是就把这个配色方案写成了一个 color-theme 移到了 Emacs 上，效果<a href="http://blog.jdhuntington.com/2008/11/emacs-color-theme-blackboard.html" target="_blank">相当赞</a>。
</p>
<p>
我在使用这个主题时做了三处调整</p>
<ul>
<li>变量声明的颜色改为 绿宝石色，与函数声明的颜色相区别</li>
<li>背景底色由黑板色改为纯黑色，增加对比度</li>
<li>当前行高亮色改为深蓝色(#001)，不让它太明显</li>
</ul>
<p>下面是我调整后的主题</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code145'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522145"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
</pre></td><td class="code" id="p41522code145"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; Blackboard Colour Theme for Emacs.</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; Defines a colour scheme resembling that of the original TextMate Blackboard colour theme.</span>
<span style="color: #808080; font-style: italic;">;; To use add the following to your .emacs file (requires the color-theme package):</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; (require 'color-theme)</span>
<span style="color: #808080; font-style: italic;">;; (color-theme-initialize)</span>
<span style="color: #808080; font-style: italic;">;; (load-file &quot;~/.emacs.d/themes/color-theme-blackboard.el&quot;)</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; And then (color-theme-blackboard) to activate it.</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; MIT License Copyright (c) 2008 JD Huntington </span>
<span style="color: #808080; font-style: italic;">;; Credits due to the excellent TextMate Blackboard theme</span>
<span style="color: #808080; font-style: italic;">;;</span>
<span style="color: #808080; font-style: italic;">;; All patches welcome</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> color-theme-blackboard <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Color theme by JD Huntington, based off the TextMate Blackboard theme, created 2008-11-27&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>color-theme-install
   '<span style="color: #66cc66;">&#40;</span>color-theme-blackboard
     <span style="color: #66cc66;">&#40;</span>
      <span style="color: #808080; font-style: italic;">;; (background-color . &quot;#0C1021&quot;)</span>
      <span style="color: #66cc66;">&#40;</span>background-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;black&quot;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>background-mode <span style="color: #66cc66;">.</span> dark<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>border-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;black&quot;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>cursor-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;#A7A7A7&quot;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>foreground-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;#F8F8F8&quot;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>mouse-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;sienna1&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #808080; font-style: italic;">;; (default ((t (:background &quot;#0C1021&quot; :foreground &quot;#F8F8F8&quot;))))</span>
     <span style="color: #66cc66;">&#40;</span>default <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;black&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#F8F8F8&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>blue <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;blue&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>bold <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">bold</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>bold-italic <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">bold</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>border-glyph <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</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;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>buffers-tab <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;#0C1021&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#F8F8F8&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-builtin-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#F8F8F8&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-comment-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">italic</span> t <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#AEAEAE&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-constant-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#D8FA3C&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-doc-string-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;DarkOrange&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-function-name-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#FF6400&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-keyword-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#FBDE2D&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-preprocessor-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;Aquamarine&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-reference-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;SlateBlue&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>
&nbsp;
     <span style="color: #66cc66;">&#40;</span>font-lock-regexp-grouping-backslash <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#E9C062&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-regexp-grouping-construct <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;red&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>
&nbsp;
     <span style="color: #66cc66;">&#40;</span>font-lock-string-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#61CE3C&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-type-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#8DA6CE&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #808080; font-style: italic;">;(font-lock-variable-name-face ((t (:foreground &quot;#FF6400&quot;))))</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-variable-name-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;#40E0D0&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>font-lock-warning-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">bold</span> t <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;Pink&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>gui-element <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;#D4D0C8&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;black&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>region <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;#253B76&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>mode-line <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;grey75&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;black&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #808080; font-style: italic;">;(highlight ((t (:background &quot;#222222&quot;))))</span>
     <span style="color: #66cc66;">&#40;</span>highlight <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;#001&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>highline-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;SeaGreen&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>italic <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</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;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>left-margin <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</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;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>text-cursor <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;yellow&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;black&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>toolbar <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</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;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>underline <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">nil</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">underline</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;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>zmacs-region <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;snow&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;ble&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
<p>
使用的话需要先安装 color-theme 包，将上面的配色存为 color-theme-blackboard.el 放在 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('p41522code146'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41522146"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41522code146"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'color-theme<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>eval-after-load <span style="color: #ff0000;">&quot;color-theme&quot;</span>
  '<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span>
     <span style="color: #66cc66;">&#40;</span>color-theme-initialize<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>color-theme-blackboard<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>
来看看我配置的使用 Consolas + “雅黑” + blackboard-theme的Emacs：</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/qiang-emacs.png" rel="lightbox"><img src="screenshots/thumbs/thumbs_qiang-emacs.png"/></a><p class="wp-caption-text">小强的Emacs</p></div>
<p>
虽说10个人会配出 11 种不同的 Emacs，不过我这个还算是芙蓉出水，落落大方吧 <img src='http://emacser.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />
</p>
</p>
<p>
折腾到此结束，“整容”过后的 Emacs 更加的漂亮听话了。话说回来，Emacs 实在是要与时俱进，多和苹果学学，改进一下自己难学难用的形象，最好将这些好用的 UI 操作设为默认配置。毕竟对最终用户来说这样的折腾也只能偶尔为之，老是将心思花在配置这神一样的编辑器上面，自己早晚也要成为半仙。</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/torture-emacs.htm' t='折腾Emacs' d='' tag='ahei,ann,C/C++,ctrl,cursor,Emacs,eval-after-load,face,highlight,mode-line,python,screenshot,speedbar,textmate,theme,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/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (185)</li>
	<li><a href="http://emacser.com/emacs.htm" title="Emacs长啥样 (2009年11月5日)">Emacs长啥样</a> (15)</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/emaci.htm" title="Emacs才是世界上最强大的IDE － 用Emaci阅读文件 (2010年04月12日)">Emacs才是世界上最强大的IDE － 用Emaci阅读文件</a> (88)</li>
</ul>

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

