<?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; ahei</title>
	<atom:link href="http://emacser.com/author/admin/feed" rel="self" type="application/rss+xml" />
	<link>http://emacser.com</link>
	<description>没有我做不到的，只有你想不到的</description>
	<lastBuildDate>Thu, 17 May 2012 14:05:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>使用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> (99)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</li>
	<li><a href="http://emacser.com/emacs-gdb.htm" title="在Emacs中使用gdb调试程序 (2010年03月29日)">在Emacs中使用gdb调试程序</a> (48)</li>
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (45)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (198)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs_graphviz_ds.htm/feed</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>在Emacs中使用twitter/新浪微博</title>
		<link>http://emacser.com/twittering-mode.htm</link>
		<comments>http://emacser.com/twittering-mode.htm#comments</comments>
		<pubDate>Tue, 10 May 2011 14:33:34 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[好玩的]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[irc]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[状态栏]]></category>
		<category><![CDATA[配色]]></category>

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

* 新手上路


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


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


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


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


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

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

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/twittering-mode.htm/feed</wfw:commentRss>
		<slash:comments>76</slash:comments>
		</item>
		<item>
		<title>钗黛双收：若你也同Vim难割舍，却又看Emacs情切切</title>
		<link>http://emacser.com/vimvsemacs.htm</link>
		<comments>http://emacser.com/vimvsemacs.htm#comments</comments>
		<pubDate>Mon, 21 Feb 2011 02:48:45 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[学习Emacs]]></category>

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




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




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


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


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


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


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



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


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


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


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


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




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


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


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


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



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


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


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


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


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


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


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




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

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



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


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


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


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


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


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


惘于环肥燕瘦，颦怅蹙茫


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




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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/vimvsemacs.htm' t='钗黛双收：若你也同Vim难割舍，却又看Emacs情切切' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/vimvsemacs.htm/feed</wfw:commentRss>
		<slash:comments>95</slash:comments>
		</item>
		<item>
		<title>GNU Emacs的终极扩展管理工具 &#8212; el-get</title>
		<link>http://emacser.com/el-get.htm</link>
		<comments>http://emacser.com/el-get.htm#comments</comments>
		<pubDate>Fri, 21 Jan 2011 02:52:23 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>

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

Let&#8217;s el-get together

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

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

当前这些方法的不足之处

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

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

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

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

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

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

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41801code13'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4180113"><td class="code" id="p41801code13"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; So the idea is that you copy/paste this code into your *scratch* buffer,</span>
<span style="color: #808080; font-style: italic;">;; hit C-j, and you have a working el-get.</span>
<span style="color: #66cc66;">&#40;</span>url-retrieve
 <span style="color: #ff0000;">&quot;https://github.com/dimitri/el-get/raw/master/el-get-install.el&quot;</span>
 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>s<span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">&#40;</span>end-of-buffer<span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">&#40;</span>eval-print-last-sexp<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41801code14'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4180114"><td class="code" id="p41801code14"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> el-get-sources
      '<span style="color: #66cc66;">&#40;</span>el-<span style="color: #b1b100;">get</span>
      package
      auto-complete
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #b1b100;">name</span> magit
      <span style="color: #66cc66;">:</span><span style="color: #555;">after</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-x C-z&quot;</span><span style="color: #66cc66;">&#41;</span> 'magit-status<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>el-<span style="color: #b1b100;">get</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

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

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

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


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


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


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




1 skeleton 

1.1 iexp 
1.2 isrc 
1.3 iprop 
1.4 ihtml 


2 eLisp 

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/org-mode-tricks.htm' t='Org-mode写作的几个快捷方式' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/org-mode-tricks.htm/feed</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>非程序员的Emacs使用心得</title>
		<link>http://emacser.com/non-programmer.htm</link>
		<comments>http://emacser.com/non-programmer.htm#comments</comments>
		<pubDate>Mon, 27 Dec 2010 03:33:42 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[中级]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[ahei]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[hippie-expand]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[配色]]></category>

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

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




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

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






1 关于写字 


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


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


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

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

<p>
Key binding
</p>

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

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

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

<p>
Key binding
</p>

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

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

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

<p>
Key binding
</p>

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

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

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

<p>
Key binding
</p>

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

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

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

<p>
Key binding
</p>

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

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

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

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

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

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/non-programmer.htm/feed</wfw:commentRss>
		<slash:comments>25</slash:comments>
		</item>
		<item>
		<title>Emacs &amp; cflow 生成函数调用树</title>
		<link>http://emacser.com/emacs-cflow.htm</link>
		<comments>http://emacser.com/emacs-cflow.htm#comments</comments>
		<pubDate>Mon, 29 Nov 2010 02:16:36 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[小技巧]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41742</guid>
		<description><![CDATA[作者: tubo
介绍 Emacs 中使用cflow制作函数的调用树



1 Introduction to cflow 
2 Emacs &#38; cflow 
3 Links 




1 Introduction to cflow 


GNU cflow analyzes a collection of C source files and prints a graph, charting control flow within the program.


GNU cflow is able to produce both direct and inverted flowgraphs for C sources. Optionally a cross-reference listing can
be generated. [...]]]></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>介绍 Emacs 中使用cflow制作函数的调用树<span id="more-41742"></span></p>
<div id="table-of-contents">
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 Introduction to cflow </a></li>
<li><a href="#sec-2">2 Emacs &amp; cflow </a></li>
<li><a href="#sec-3">3 Links </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-3">
<h3 id="sec-1"><span class="section-number-3">1</span> Introduction to cflow </h3>
<div class="outline-text-3" id="text-1">
<p>
GNU cflow analyzes a collection of C source files and prints a graph, charting control flow within the program.
</p>
<p>
GNU cflow is able to produce both direct and inverted flowgraphs for C sources. Optionally a cross-reference listing can<br />
be generated. Two output formats are implemented: POSIX and GNU (extended).
</p>
<p>
Input files can optionally be preprocessed before analyzing.
</p>
<p>
The package also provides Emacs major mode for examining the produced flowcharts in Emacs.
</p>
<p>
以上内容取自 cflow 的网站: <a href="http://www.gnu.org/software/cflow/manual/html_node/Intro.html#Intro">http://www.gnu.org/software/cflow/manual/html_node/Intro.html#Intro</a>。
</p>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> Emacs &amp; cflow </h3>
<div class="outline-text-3" id="text-2">
<p>
cflow 的代码包中提供了cflow-mode.el (cflow-1.3/elisp/cflow.el)，  该文件提供了 emacs 的 cflow-mode，<br />
用于显示 cflow 输出的内容，但该文件中并未提供自动生成指定函数的 call tree<br />
的功能，用起来多少有点不方便。
</p>
<p>
下面是一个简单的 elisp 函数，通过该函数可以为指定的函数生成调用树。
</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('p41742code56'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4174256"><td class="code" id="p41742code56"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'cflow-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defvar cmd <span style="color: #b1b100;">nil</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defvar cflow-buf <span style="color: #b1b100;">nil</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defvar cflow-buf-<span style="color: #b1b100;">name</span> <span style="color: #b1b100;">nil</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> yyc/cflow-<span style="color: #b1b100;">function</span> <span style="color: #66cc66;">&#40;</span>function-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Get call graph of inputed function. &quot;</span>
  <span style="color: #808080; font-style: italic;">;(interactive &quot;sFunction name:\n&quot;)</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> <span style="color: #66cc66;">&#40;</span>senator-jump-interactive <span style="color: #ff0000;">&quot;Function name: &quot;</span>
                                                    <span style="color: #b1b100;">nil</span> <span style="color: #b1b100;">nil</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><span style="color: #b1b100;">setq</span> cmd <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;cflow  -b --main=%s %s&quot;</span> function-<span style="color: #b1b100;">name</span> 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;">setq</span> cflow-buf-<span style="color: #b1b100;">name</span> <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;**cflow-%s:%s**&quot;</span>
                               <span style="color: #66cc66;">&#40;</span>file-name-nondirectory buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span>
                               function-<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> cflow-buf <span style="color: #66cc66;">&#40;</span>get-buffer-create cflow-buf-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>set-buffer cflow-buf<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> buffer-read-only <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>erase-buffer<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert <span style="color: #66cc66;">&#40;</span>shell-command-to-string cmd<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>pop-to-buffer cflow-buf<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;">&#40;</span>cflow-mode<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
函数中使用了 CEDET 提供的 senator-jump-interactive 用于实现函数名的自动补全，如果你的机器上没有 CEDET， 那么就把<br />
(interactive &#8220;sFunction name:\n&#8221;) 的注释去掉，而将后面的那句话注释掉即可。
</p>
<p>
用法很简单，将上面的代码添加到 ~/.emacs 中后，重新载入配置文件，然后打开一个 C 文件，<br />
M-x， 输入： yyc/cflow-function ， 随后在 Mini-buffer 中输入函数名字，<br />
回车，即可生成一个新的 buffer, 并在其中填写了生成的调用树。
</p>
<p>
如下图所示：<br />
  <div class="wp-caption alignnone" style="width: 160px"><a href="https://dea.googlecode.com/svn/trunk/screenshots/cflow.png" rel="lightbox"><img src="https://dea.googlecode.com/svn/trunk/screenshots/thumbs/thumbs_cflow.png" height="150"/></a><p class="wp-caption-text">cflow</p></div></p>
<p>在调用树中，还可以通过键盘从调用树中跳转到相应的源代码中，具体可以参阅 cflow<br />
提供的 cflow.el。
</p>
<p>
这样， cflow 配置 GNU Global 和 cedet ， 代码的阅读和理解效率会大大提高。
</p>
</div>
</div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3"><span class="section-number-3">3</span> Links </h3>
<div class="outline-text-3" id="text-3">
<p>
<b>1.</b> cflow 网址： <a href="http://www.gnu.org/software/cflow">http://www.gnu.org/software/cflow</a>
</p>
<p>
<b>2.</b> cflow 下载地址： <a href="http://mirrors.kernel.org/gnu/cflow/cflow-1.3.tar.bz2">http://mirrors.kernel.org/gnu/cflow/cflow-1.3.tar.bz2</a>
</p>
<p>
<b>3.</b> cflow Documentation: <a href="http://www.gnu.org/software/cflow/manual/html_node/index.html">http://www.gnu.org/software/cflow/manual/html_node/index.html</a>
</p>
</div>
</div>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-cflow.htm' t='Emacs &amp;#038; cflow 生成函数调用树' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-cflow.htm/feed</wfw:commentRss>
		<slash:comments>18</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> (198)</li>
	<li><a href="http://emacser.com/built-in-cedet.htm" title="用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET (2010年05月10日)">用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET</a> (99)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</li>
	<li><a href="http://emacser.com/emacs-cpp-dev.htm" title="在Emacs下用C/C++编程 (2010年10月25日)">在Emacs下用C/C++编程</a> (37)</li>
	<li><a href="http://emacser.com/w3m.htm" title="Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页 (2009年11月23日)">Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页</a> (46)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-simple-use.htm/feed</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>Emacs补全利器：auto-complete+gccsense</title>
		<link>http://emacser.com/emacs-gccsense.htm</link>
		<comments>http://emacser.com/emacs-gccsense.htm#comments</comments>
		<pubDate>Mon, 08 Nov 2010 03:03:02 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[自动补全]]></category>

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



1 前言 
2 简介 
3 安装 

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


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




1 前言 

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




2 简介 

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




3 安装 



3.1 配置auto-complete 

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

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





3.2 配置gcc-code-assist 

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



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

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41713code68'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171368"><td class="code" id="p41713code68"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">; auto complete</span>
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'load-path <span style="color: #ff0000;">&quot;/mydoc/lib/emacs-plugins/auto-complete&quot;</span><span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#40;</span>require 'auto-complete-config<span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#40;</span>add-to-<span style="color: #b1b100;">list</span> 'ac-dictionary-directories <span style="color: #ff0000;">&quot;/mydoc/lib/emacs-plugins/auto-complete/ac-dict&quot;</span><span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#40;</span>ac-config-default<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
</div>
</div>
<div id="outline-container-3_2" class="outline-4">
<h4 id="sec-3_2"><span class="section-number-4">3.2</span> 配置gcc-code-assist </h4>
<div class="outline-text-4" id="text-3_2">
<p>gcc-code-assist就是在gcc代码基础上改的，主要用来从代码中提取补全信息
</p>
<ol>
<li>
下载：<a href="http://cx4a.org/software/gccsense/#Downloads">http://cx4a.org/software/gccsense/#Downloads</a><br />
编译安装之前，准备好环境，debian系统如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41713code69'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171369"><td class="code" id="p41713code69"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #c20cb9; font-weight: bold;">install</span> build-essential libgmp3-dev libmpfr-dev <span style="color: #c20cb9; font-weight: bold;">flex</span> ruby rubygems libsqlite3-ruby</pre></td></tr></table></div>

<p>其它系统，如freebsd、macos请自行参考用户手册。
</li>
<li>
配置安装：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41713code70'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171370"><td class="code" id="p41713code70"><pre class="bash" style="font-family:monospace;">$ <span style="color: #c20cb9; font-weight: bold;">tar</span> xvjf gcc-code-assist-<span style="color: #000000; font-weight: bold;">*</span>.tar.bz2  
$ <span style="color: #7a0874; font-weight: bold;">cd</span> gcc-code-assist-<span style="color: #000000; font-weight: bold;">*</span>  
$ .<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--program-suffix</span>=-code-assist <span style="color: #660033;">--enable-languages</span>=c,<span style="color: #c20cb9; font-weight: bold;">c++</span> <span style="color: #660033;">--disable-bootstrap</span> <span style="color: #660033;">--disable-multilib</span>  
$ <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #666666; font-style: italic;"># -j2  </span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span></pre></td></tr></table></div>

<p>安装成功之后执行下，如果有正常输出，就说明安装成功：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41713code71'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171371"><td class="code" id="p41713code71"><pre class="bash" style="font-family:monospace;">$ gcc-code-assist <span style="color: #660033;">--version</span>  
$ g++-code-assist <span style="color: #660033;">--version</span></pre></td></tr></table></div>

</li>
</ol>
</div>
</div>
<div id="outline-container-3_3" class="outline-4">
<h4 id="sec-3_3"><span class="section-number-4">3.3</span> 安装配置gccsense </h4>
<div class="outline-text-4" id="text-3_3">
<p>gccsense这个包包含一些辅助函数，以及编辑器的插件
</p>
<ol>
<li>
解压缩之后，执行：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41713code72'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171372"><td class="code" id="p41713code72"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> gccsense-<span style="color: #000000; font-weight: bold;">*</span>
$ <span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">cp</span> bin<span style="color: #000000; font-weight: bold;">/*</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>local<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span></pre></td></tr></table></div>

</li>
<li>
执行一下命令，确保安装成功：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41713code73'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171373"><td class="code" id="p41713code73"><pre class="bash" style="font-family:monospace;">$ gccrec <span style="color: #660033;">--version</span> 
$ autopch <span style="color: #660033;">--version</span></pre></td></tr></table></div>

</li>
<li>
emacs的插件文件为etc/gccsense.el，放到插件目录然后，在.emacs里面加入</p>

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

<p>即可。<br />
由于我的gccsense.el放到了。/mydoc/lib/emacs-plugins/c下，并且把auto-complete的补全命令绑定到了M+/上，所以这部分配置如下：</p>

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

<p>ok，搞定。
</li>
</ol>
</div>
</div>
</div>
<div id="outline-container-4" class="outline-3">
<h3 id="sec-4"><span class="section-number-3">4</span> 主要模块介绍 </h3>
<div class="outline-text-3" id="text-4">
<p>在介绍使用前，简单介绍下几个主要模块的作用
</p>
<ul>
<li>
gcc-code-assist<br />
gcc4.4代码基础上改的那位，用来从被补全代码中分析出补全信息
</li>
<li>
gccrec<br />
编译一个文件，往往要加上编译参数的，比如自定义的include地址。但是编辑器在补全的时候，是不知道这些的，硬生生地调用gcc-code-assist来“模拟编译”，参数补全造成的错误会扰乱补全信息的获取。<br />
gccrec就是为了解决这个问题，在使用编辑器补全之前，需要执行一次gccrec，它会将编译参数信息存到~/.gccrec这个sqlite3的数据库中。具体用法参见下一节的示例。
</li>
<li>
autopch<br />
用来启用预编译头，来提高速度。<br />
autopch的相关部分请各位看官自行参考用户手册吧，后面的示例代码简单，不需要这个东西。
</li>
</ul>
</div>
</div>
<div id="outline-container-5" class="outline-3">
<h3 id="sec-5"><span class="section-number-3">5</span> 实例 </h3>
<div class="outline-text-3" id="text-5">
<ol>
<li>
准备一个测试cpp文件，test.cpp：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41713code76'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171376"><td class="code" id="p41713code76"><pre class="lisp" style="font-family:monospace;">#include <span style="color: #66cc66;">&lt;</span>string<span style="color: #66cc66;">&gt;</span>  
using namespace std<span style="color: #808080; font-style: italic;">;  </span>
int main<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>  
<span style="color: #66cc66;">&#123;</span>  
    string s<span style="color: #808080; font-style: italic;">;</span>
<span style="color: #66cc66;">&#125;</span></pre></td></tr></table></div>

</li>
<li>
使用gccrec记录编译命令</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41713code77'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4171377"><td class="code" id="p41713code77"><pre class="bash" style="font-family:monospace;">gccrec g++-code-assist test.cpp</pre></td></tr></table></div>

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

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

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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-gccsense.htm' t='Emacs补全利器：auto-complete+gccsense' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-gccsense.htm/feed</wfw:commentRss>
		<slash:comments>58</slash:comments>
		</item>
		<item>
		<title>我的 GNU Emacs 配置&#8221;程序&#8221;</title>
		<link>http://emacser.com/my-emacs-config.htm</link>
		<comments>http://emacser.com/my-emacs-config.htm#comments</comments>
		<pubDate>Mon, 01 Nov 2010 02:08:59 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[配置]]></category>

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



1 我的 GNU Emacs 配置程序 

1.1 .emacs 
1.2 color-theme.el 
1.3 settings.el 
1.4 keybindings.el 
1.5 plugins.el 
1.6 outline-minor-mode 
1.7 org-mode.el 
1.8 dove-ext.el 






1 我的 GNU Emacs 配置程序 


呃……一般来说大家都叫“配置文件”，是吧。当然我也是这么叫的。那就让我们还是继续延续这个名字，就叫 Emacs配置文件。


那么配置文件是我们定制和扩展Emacs最重要的地方，一般来说，最常用的配置文件是 .emacs 。当然也可以是别的文件，具体可以查阅 GNU Emacs Manual。


然而随着使用的日久，日积月累，定制的设置越来越多， .emacs 变得越来越庞大，渐渐的就会增大到难以维护的地步。直到某日在 emacser.cn 看到王纯业的 组织 .emacs 的文件内容的技巧，将配置信息分成多个文件，维护的困难才稍稍得以缓解。但是即使是拆分以后，文件仍然会变得很大，而且还在不断增大，维护起来仍然压力很大。有没有好的解决办法呢？ ahei 的DEA我还没有去仔细看过，毕竟他那个太大了，我的配置还没有大到那个地步。我希望的是简洁高效的解决办法。能够在我的配置文件里面只有我最关心的内容，不带一点多余的东西呢？


直到最近开始着手探索 Lisp，体会到 Lisp语言强大的描述能力和抽象能力，随即萌发了将众多的配置细节直接用写成简洁清晰的 list ，然后用 Lisp Code进行处理，这样就可以去掉配置文件里面那些无穷无尽的方法调用了。 走了这个路子之后，原来的“配置文件”就摇身一变，变成“配置程序”了。



1.1 .emacs 


闲话不说了，开始捞干的吧。让我们先从最基本的 .emacs 开始。在这种方式下 [...]]]></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>
<div id="table-of-contents">
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 我的 GNU Emacs 配置程序 </a>
<ul>
<li><a href="#sec-1.1">1.1 .emacs </a></li>
<li><a href="#sec-1.2">1.2 color-theme.el </a></li>
<li><a href="#sec-1.3">1.3 settings.el </a></li>
<li><a href="#sec-1.4">1.4 keybindings.el </a></li>
<li><a href="#sec-1.5">1.5 plugins.el </a></li>
<li><a href="#sec-1.6">1.6 outline-minor-mode </a></li>
<li><a href="#sec-1.7">1.7 org-mode.el </a></li>
<li><a href="#sec-1.8">1.8 dove-ext.el </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> 我的 GNU Emacs 配置程序 </h3>
<div class="outline-text-3" id="text-1">
<p>
呃……一般来说大家都叫“配置文件”，是吧。当然我也是这么叫的。那就让我们还是继续延续这个名字，就叫 Emacs配置文件。
</p>
<p>
那么配置文件是我们定制和扩展Emacs最重要的地方，一般来说，最常用的配置文件是 <code>.emacs</code> 。当然也可以是别的文件，具体可以查阅 <a href="http://www.gnu.org/software/emacs/manual/html_node/emacs/Init-File.html#Init-File" target="_blank">GNU Emacs Manual</a>。<span id="more-41709"></span>
</p>
<p>
然而随着使用的日久，日积月累，定制的设置越来越多， <code>.emacs</code> 变得越来越庞大，渐渐的就会增大到难以维护的地步。直到某日在 emacser.cn 看到王纯业的 <a href="http://ann77.emacser.com/Emacs/EmacsOrginzeDotEmacs.html" target="_blank">组织 .emacs 的文件内容的技巧</a>，将配置信息分成多个文件，维护的困难才稍稍得以缓解。但是即使是拆分以后，文件仍然会变得很大，而且还在不断增大，维护起来仍然压力很大。有没有好的解决办法呢？ ahei 的DEA我还没有去仔细看过，毕竟他那个太大了，我的配置还没有大到那个地步。我希望的是简洁高效的解决办法。能够在我的配置文件里面只有我最关心的内容，不带一点多余的东西呢？
</p>
<p>
直到最近开始着手探索 Lisp，体会到 Lisp语言强大的描述能力和抽象能力，随即萌发了将众多的配置细节直接用写成简洁清晰的 <code>list</code> ，然后用 Lisp Code进行处理，这样就可以去掉配置文件里面那些无穷无尽的方法调用了。 走了这个路子之后，原来的“配置文件”就摇身一变，变成“配置程序”了。
</p>
</div>
<div id="outline-container-1.1" class="outline-4">
<h4 id="sec-1.1"><span class="section-number-4">1.1</span> .emacs </h4>
<div class="outline-text-4" id="text-1.1">
<p>
闲话不说了，开始捞干的吧。让我们先从最基本的 <code>.emacs</code> 开始。在这种方式下 <code>.emacs</code> 文件就非常简单了。它的核心部分一共只有两行。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code95'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170995"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41709code95"><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;~/Shell/config/emacs.el&quot;</span> <span style="color: #ff0000;">&quot;~/Shell/config/emacs.init&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapc</span> 'load <span style="color: #66cc66;">&#40;</span>directory-files <span style="color: #ff0000;">&quot;~/Shell/config/emacs.init&quot;</span> t <span style="color: #ff0000;">&quot;^[a-zA-Z0-9].*.el$&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
第一行通过 <code>load-path</code> 注册扩展文件的所在位置。第二行通过 <code>mapcar</code> 函数逐个装载 &#8220;<code>~/Shell/config/emacs.init</code>&#8221; 目录下的所有配置文件。就是这么简单。其余的内容多数都是 Emacs Customization 添加的代码。或者换句话说，现在的 <code>.emacs</code> 文件完全留给 Emacs用了。
</p>
<p>
其实在采用这种方式之前，我是不用什么 Customization 的。当然，不用的代价是显而易见的。问题在于在原来那种配置方式之下， <code>.emacs</code> 本身就已经够烦够乱了，如果 Emacs的 Customization 再往里面添乱，就更难维护和控制了。不过现在没事了。我自己使用的一共只有两行，剩下的所有地方随便它写吧。所以呢，我现在至少还用 Customization修改了一下 ansi-color，默认颜色里面的深蓝色的目录实在是太刺眼了。
</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('p41709code96'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170996"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p41709code96"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>custom-set-variables
  <span style="color: #808080; font-style: italic;">;; custom-set-variables was added by Custom.</span>
  <span style="color: #808080; font-style: italic;">;; If you edit it by hand, you could mess it up, so be careful.</span>
  <span style="color: #808080; font-style: italic;">;; Your init file should contain only one such instance.</span>
  <span style="color: #808080; font-style: italic;">;; If there is more than one, they won't work right.</span>
 '<span style="color: #66cc66;">&#40;</span>ansi-color-faces-vector <span style="color: #66cc66;">&#91;</span>default default default italic underline bold bold-italic modeline<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
 '<span style="color: #66cc66;">&#40;</span>ansi-color-names-vector <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;black&quot;</span> <span style="color: #ff0000;">&quot;red&quot;</span> <span style="color: #ff0000;">&quot;PaleGreen&quot;</span> <span style="color: #ff0000;">&quot;yellow&quot;</span> <span style="color: #ff0000;">&quot;DodgerBlue1&quot;</span> <span style="color: #ff0000;">&quot;magenta&quot;</span> <span style="color: #ff0000;">&quot;cyan&quot;</span> <span style="color: #ff0000;">&quot;white&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
另外，还有一个地方需要提到一下， 在 <code>.emacs</code> 里面我还保留了一段中文字体的设置。以前 emacser.com 里面有人发过字体设置的东西。但是由于 GNU Emacs 23以后基本都在 daemon方式下工作，如果直接使用原来那种方式设置中文字体的话，在 emacsclient中是无效的，所以要把它加到 <code>make-frame</code> 的hook里面。这样每次 <code>emacsclient -c</code> 生成的 frame就都是指定的中文字体了。 当然这下面这个函数还有一个缺陷，就是如果不是使用 daemon 方式的话…… 你懂得，鱼和熊掌，不可兼得。
</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('p41709code97'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170997"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p41709code97"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>add-hook 'after-make-frame-functions
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</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><span style="color: #66cc66;">&gt;=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">length</span> <span style="color: #66cc66;">&#40;</span>frame-<span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>set-fontset-font  <span style="color: #ff0000;">&quot;fontset-startup&quot;</span> 'chinese-gbk <span style="color: #66cc66;">&#40;</span>font-spec <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #ff0000;">&quot;文泉驿微米黑&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">nil</span> 'prepend<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#41;</span> t
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-1.2" class="outline-4">
<h4 id="sec-1.2"><span class="section-number-4">1.2</span> color-theme.el </h4>
<div class="outline-text-4" id="text-1.2">
<p>
那么我自己的配置信息写在哪些地方呢？让我们看看 &#8220;<code>~/Shell/config/emacs.init</code>&#8220;目录下的都有哪些文件
</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('p41709code98'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170998"><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="p41709code98"><pre class="shell" style="font-family:monospace;">2 : 2023 : 13:03:26 : ~/Shell/config/emacs.init 
dove@bash-4.1$ du -sh *.el
8.0K    calendar-setup.el
28K color-theme.el
28K dove-ext.el
4.0K    keybindings.el
8.0K    org-mode.el
8.0K    plugins.el
4.0K    settings.el
&nbsp;
2 : 2024 : 13:03:35 : ~/Shell/config/emacs.init 
dove@bash-4.1$ du -sh .emacs
4.0K    .emacs
&nbsp;
2 : 2025 : 13:04:07 : ~/Shell/config/emacs.init 
dove@bash-4.1$</pre></td></tr></table></div>

<p>
就是这些地方了。每个文件的作用从文件名上就能清晰的看出来。只有这个&#8221;<code>dove-ext.el</code>&#8220;文件需要解释一下，这里存放的是我自己编写的所有扩展函数。
</p>
<p>
下面让我们逐个看一看这些文件的内容。&#8221;<code>calendar-setup.el</code>&#8221; 就不说了，这个文件基本上就是从网上搜来的，我自己也就是定义几个节日而已。
</p>
<p>
&#8220;<code>color-theme.el</code>&#8221; 是主题设置文件。基本上就是 <code>color-theme-gnome2</code> 的翻版，我自己做了一些简单的修改。之所以把他存在一个单独的文件里面主要是因为 <code>color-theme</code> 实在是太长了，放在哪个文件里都会影响其他的内容。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code99'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170999"><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="p41709code99"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>eval-when-compile    <span style="color: #66cc66;">&#40;</span>require 'color-theme<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> my-color-theme <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Color theme created 2010-04-09.&quot;</span>
<span style="color: #808080; font-style: italic;">;  (interactive)</span>
  <span style="color: #66cc66;">&#40;</span>color-theme-install
   '<span style="color: #66cc66;">&#40;</span>my-color-theme
<span style="color: #808080; font-style: italic;">;     ((background-color . &quot;#102C29&quot;)</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>background-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;darkslategrey&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;     (( background-color . &quot;black&quot;)</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;LightGray&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;      ... ... ... ... theme 太长，中间省略了</span>
     <span style="color: #66cc66;">&#40;</span>woman-bold-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;">weight</span> bold<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>woman-italic-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;beige&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>woman-unknown-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;LightSalmon&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>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;dark cyan&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;cyan&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>
&nbsp;
<span style="color: #66cc66;">&#40;</span>eval-when-compile <span style="color: #66cc66;">&#40;</span>require 'color-theme<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>color-theme-initialize<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>add-hook 'after-make-frame-functions 
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>arg<span style="color: #66cc66;">&#41;</span>
        <span style="color: #ff0000;">&quot;&quot;</span>
        <span style="color: #66cc66;">&#40;</span>my-color-theme<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> t<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
另外我在加载 color-theme 的时候做了一个处理，把 <code>my-color-theme</code> 加到 <code>after-make-frame-functions</code> 这个 hook里面去，这样只有创建 frame的时候才会执行 <code>my-color-theme</code> 。  如果不是 <code>X</code> 环境，例如用 <code>emacs -nw</code> 的时候，就不要加载 <code>my-color-theme</code> 了。因为这个主题到了终端模式下，那个背景颜色根本没法看（汗一个）。虽然偶自己从来都是工作在 <code>X</code> 里面的。
</p>
<p>
这个问题在网上找到的有些解决办法是判断一下是不是 <code>window-system</code> ，这种办法到了 daemon模式下是会出错的。看来 Emacs 23 以后的 daemon 模式下的配置方法还是需要进一步深入研究的。什么东西都放到 <code>after-make-frame-functions</code> 这个地方毕竟也不是个事儿。
</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> settings.el </h4>
<div class="outline-text-4" id="text-1.3">
<p>
下一个来看的是 settings.el。 settings 的任务其实很简单，就是设置全局变量。全局变量的设置就是 <code>setq</code> 嘛。这个事情简单的不能再简单了。但是无数的 <code>setq</code> 无论是写起来还是读起来都会让人很郁闷。还好，我们记得 <code>setq</code> 不但可以设置一个变量，它实际上可以处理一个 <code>list</code> 。嗨，既然说它可以，为什么还要让他闲着呢？ 让我们动手吧，把所有的变量和值写在一个 <code>list</code> 里面，多余的 <code>setq</code> 通通都删掉吧。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code100'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709100"><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="p41709code100"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>menu-bar-mode -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>tool-bar-mode -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>icomplete-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>scroll-bar-mode -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;(ruler-mode -1)</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> save-abbrevs t
      x-select-enable-clipboard               t
      ispell-dictionary                       <span style="color: #ff0000;">&quot;english&quot;</span>
      frame-title-format                      <span style="color: #ff0000;">&quot;%b %n %I&quot;</span>
      inhibit-startup-message                 t
      column-number-mode                      t
<span style="color: #808080; font-style: italic;">;         ... ... ... ... 内容太多，中间省略</span>
      ido-toggle-regexp                       t
      dim<span style="color: #66cc66;">:</span><span style="color: #555;">switch-window-relative</span>              <span style="color: #b1b100;">nil</span>
      shell-file-<span style="color: #b1b100;">name</span>                         <span style="color: #ff0000;">&quot;/usr/bin/bash&quot;</span>
      default-major-mode                      'text-mode
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Misc</span>
<span style="color: #66cc66;">&#40;</span>setq-default abbrev-mode                    t
          line-spacing                   <span style="color: #cc66cc;">4</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>setenv <span style="color: #ff0000;">&quot;EMACSSHELL&quot;</span>                         shell-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-1.4" class="outline-4">
<h4 id="sec-1.4"><span class="section-number-4">1.4</span> keybindings.el </h4>
<div class="outline-text-4" id="text-1.4">
<p>
再接下来是 &#8220;<code>keybindings.el</code>&#8221; 。这个文件定义所有的按键绑定。通常我们定义 key binding 的时候都是使用 <code>(global-set-key (kbd "C-c x) 'some-function)</code> 问题是 <code>global-set-key</code> 没有像 <code>setq</code> 那么方便的 <code>list</code> 处理方式。怎么办？ 那就写一个吧。还能怎么办呢？ 这就是 <code>set-key-bindings</code>
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code101'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709101"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p41709code101"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> set-key-bindings <span style="color: #66cc66;">&#40;</span>action bindingList<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span>lst<span style="color: #66cc66;">&#41;</span>
      <span style="color: #ff0000;">&quot;&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>x <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>y <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">last</span> lst<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;">funcall</span> action x y<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> bindingList <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
这个 <code>set-key-bindings</code> 接收一个函数作为指令，告诉它需要做什么，然后再接收一个 <code>list</code> ，作为数据。然后通过 <code>mapcar</code> 遍历这个 <code>list</code> ，对其中的每一个元素执行接受到的指令。
</p>
<p>
这就是 Lisp语言非常精彩的地方。Lisp 不仅仅能够处理 list，更重要的是它能够像传递数据一样简单方便的传递指令(函数)。这个强大的特性使得我可以不必把 <code>global-set-key</code> 硬性的写在 <code>set-key-bindings</code> 里面。为什么要这样呢？还用说吗？如果我想要做 <code>local-set-key</code> 我会怎么做？ 我不许要去修改 <code>set-key-bindings</code> ，我只需要把 <code>local-set-key</code> 作为指令传递给它就行了。换句话说我可以传递任何指令给它，告诉它做任何事，而不需要再做任何修改。在 Lisp的世界里，没有无聊的 <code>case sth in something</code> 。
</p>
<p>
扯远了，让我们还回到按键绑定上来。现在就可以把按键和功能写成一个简单的 <code>list</code> ，交给 <code>set-key-bindings</code> 去处理了。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code102'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709102"><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
</pre></td><td class="code" id="p41709code102"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>set-key-bindings 'global-set-key   
 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> 
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>f2<span style="color: #66cc66;">&#93;</span>                            calendar<span style="color: #66cc66;">&#41;</span>
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>shift f2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>                    remember<span style="color: #66cc66;">&#41;</span>
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>f5<span style="color: #66cc66;">&#93;</span>                            revert-buffer<span style="color: #66cc66;">&#41;</span>
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>f10<span style="color: #66cc66;">&#93;</span>                           rename-buffer<span style="color: #66cc66;">&#41;</span>
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>f11<span style="color: #66cc66;">&#93;</span>                           query-replace<span style="color: #66cc66;">&#41;</span>
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>shift f11<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>                   query-replace-regexp<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;         ... ... ... ... 按键太多，中间省略</span>
     <span style="color: #808080; font-style: italic;">;; copy paste operations </span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-=&quot;</span><span style="color: #66cc66;">&#41;</span>                 'set-mark-command<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c l&quot;</span><span style="color: #66cc66;">&#41;</span>               'copy-line<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c w&quot;</span><span style="color: #66cc66;">&#41;</span>               'copy-word<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-S-k&quot;</span><span style="color: #66cc66;">&#41;</span>               <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #ff0000;">&quot; &quot;</span> <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>kill-visual-line -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c s&quot;</span><span style="color: #66cc66;">&#41;</span>               'thing-copy-string-to-mark<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c a&quot;</span><span style="color: #66cc66;">&#41;</span>               'thing-copy-parenthesis-to-mark<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c p&quot;</span><span style="color: #66cc66;">&#41;</span>               'copy-paragraph<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-x a d&quot;</span><span style="color: #66cc66;">&#41;</span>             'delete-region<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;         ... ... ... ... 按键太多，中间省略</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c c&quot;</span><span style="color: #66cc66;">&#41;</span>               '<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot; &quot;</span> <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> emaci-mode  <span style="color: #66cc66;">&#40;</span>emaci-mode-off<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>emaci-mode-on<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;M-DEL&quot;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><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;Act as the obsolete dove-backward-kill-word &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><span style="color: #b1b100;">if</span> arg 
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>arg <span style="color: #66cc66;">&#40;</span>- <span style="color: #cc66cc;">0</span> 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>dove-forward-kill-word arg<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span>dove-forward-kill-word -<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;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-1.5" class="outline-4">
<h4 id="sec-1.5"><span class="section-number-4">1.5</span> plugins.el </h4>
<div class="outline-text-4" id="text-1.5">
<p>
<code>plugins.el</code> 的作用是引用各种网上下载的第三方扩展。简单来说就是成堆成堆的 <code>(require 'something)</code> 。由于 <code>require</code> 函数只需要一个参数，这意味着我们将只需要一个一维的 <code>list</code> ，这样会比 keybinding.el 的情况更简单一些。下面是 <code>require-extensions</code> 函数。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code103'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709103"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41709code103"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> require-extensions <span style="color: #66cc66;">&#40;</span>action lst<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">mapcar</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span>ext<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> action ext<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
有了这个函数，我们就可以进行非常简单的工作了——删掉 <code>require</code> ，换成 <code>list</code> 。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code104'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709104"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
</pre></td><td class="code" id="p41709code104"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require-extensions 'require
 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> 
  'tabbar 
  'switch-window
  'thing-edit
  'second-sel
  'browse-kill-ring+
  'bbdb
  'gnuplot
  'muse-mode
  'ibuffer
  'w3m-load
  'rect-mark
  'ido
  'multi-term
  'lusty-explorer
  'oddmuse
  'emaci
  'move-text
  'uniquify
  'hide-region
<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
至于每一个扩展的个别配置，就分别写在文件的后面了。
</p>
<p>
可以看到，我用的扩展并不多。因为每天工作当中基本就在 <code>shell-mode</code> ， <code>sh-mode</code> 和 <code>org-mode</code> 这几个模式当中打转转。下班之后大概是用 <code>emacs-lisp-mode</code> 。
</p>
</div>
</div>
<div id="outline-container-1.6" class="outline-4">
<h4 id="sec-1.6"><span class="section-number-4">1.6</span> outline-minor-mode </h4>
<div class="outline-text-4" id="text-1.6">
<p>
在这里比较值得一提的还有一个 <code>outline-minor-mode</code> 的设置。这个模式实在是一个很有用的东西。甚至在 <code>shell-mode</code> 里面我都会打开它。但是针对每一个不同的 mode 设置各自的 <code>outline-regexp</code> ， 对，我是想说是挺烦人的。也许你们要比我 nice，好让人羡慕啊。 好，言归正传，我选择写一个函数来搞定它。我叫它 <code>set-outline-minor-mode-regexp</code> 。 只是，这次，事情稍微有点复杂。
</p>
<p>
首先这个函数的环境比较特殊，所以相对来说就会比较复杂。因为他是用在 <code>add-hook</code> 函数当中的，这意味着我没有机会直接传递我要的数据给 <code>set-outline-minor-mode-regexp</code> 。我需要绕一下，用一个全局变量 <code>outline-minor-mode-list</code> 来存储数据，并且这次的数据会是一个二维的 <code>list</code> ，所以处理也会复杂一些。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code105'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709105"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p41709code105"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> outline-minor-mode-<span style="color: #b1b100;">list</span> 
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> '<span style="color: #66cc66;">&#40;</span>emacs-lisp-mode <span style="color: #ff0000;">&quot;(defun&quot;</span><span style="color: #66cc66;">&#41;</span>
        '<span style="color: #66cc66;">&#40;</span>shell-mode <span style="color: #ff0000;">&quot;.*[bB]ash.*[#<span style="color: #000099; font-weight: bold;">\$</span>] &quot;</span><span style="color: #66cc66;">&#41;</span>
        '<span style="color: #66cc66;">&#40;</span>sh-mode <span style="color: #ff0000;">&quot;function&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
 <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
这里就是我说的这个函数，也许你们可以帮我把它写的更简单一些。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code106'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709106"><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="p41709code106"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> set-outline-minor-mode-regexp <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #66cc66;">&#40;</span>outline-minor-mode <span style="color: #cc66cc;">1</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>regexp-<span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> outline-minor-mode-<span style="color: #b1b100;">list</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>find-regexp
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>lst<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;&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>innerList <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lst<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> innerList
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> innerList<span style="color: #66cc66;">&#41;</span> major-mode<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> innerList<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>pop lst<span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> find-regexp lst<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><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>make-local-variable 'outline-regexp<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> outline-regexp <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> find-regexp regexp-<span style="color: #b1b100;">list</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>set-key-bindings 'local-set-key
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c C-t&quot;</span><span style="color: #66cc66;">&#41;</span> 'hide-body<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c C-a&quot;</span><span style="color: #66cc66;">&#41;</span> 'show-all<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c C-e&quot;</span><span style="color: #66cc66;">&#41;</span> 'show-entry<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;            (kbd &quot;C-c C-d&quot;) 和 shell-mode 冲突，所以继续沿用 C-c @ C-d，不做自定义</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>
然后针对每一个需要的模式添加 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('p41709code107'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709107"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41709code107"><pre class="lisp" style="font-family:monospace;"> <span style="color: #66cc66;">&#40;</span>add-hook 'shell-mode-hook 'set-outline-minor-mode-regexp t<span style="color: #66cc66;">&#41;</span>
 <span style="color: #66cc66;">&#40;</span>add-hook 'sh-mode-hook 'set-outline-minor-mode-regexp t<span style="color: #66cc66;">&#41;</span>
 <span style="color: #66cc66;">&#40;</span>add-hook 'emacs-lisp-mode-hook 'set-outline-minor-mode-regexp  t<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
最后在 函数里面还要提到的一点是 <code>(make-local-variable 'outline-regexp)</code> 。我在这里显式的把 <code>outline-regexp</code> 作成 buffer local 了。如果不这样做的话， <code>sh-mode</code> 中的 <code>outline-regexp</code> 赋值会很诡异的覆盖掉 <code>shell-mode</code> 里面的值。虽然我还不太清楚为什么在别的 mode 里面就没有问题。灵异中……
</p>
</div>
</div>
<div id="outline-container-1.7" class="outline-4">
<h4 id="sec-1.7"><span class="section-number-4">1.7</span> org-mode.el </h4>
<div class="outline-text-4" id="text-1.7">
<p>
最后是 <code>org-mode.el</code> ， 我不知道再提到这个文件是不是还有必要。因为这里在没有什么神奇的地方了。这里只是一些关于 <code>org-mode</code> 的一些设置， 还有……一些 skeleton 定义。因为基本上 <code>org-mode</code> 的默认设置就已经蛮好用了（我用的是 7.01h 版），所以现在这个文件内的内容基本上就是 skeleton 定义。只是因为他们还没有变得足够多，所以我还没有把它们分成一个单独的文件来管理。那么就说说 skeleton 吧。最近比较常用的 skeleton 主要是以下这些：
</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('p41709code108'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709108"><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
</pre></td><td class="code" id="p41709code108"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-skeleton iexp 
  <span style="color: #ff0000;">&quot;Input #+BEGIN_EXAMPLE #+END_EXAMPLE in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #ff0000;">&quot;#+BEGIN_EXAMPLE<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #ff0000;">&quot;#+END_EXAMPLE&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton isrc 
  <span style="color: #ff0000;">&quot;Input #+begin_src #+end_src in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #ff0000;">&quot;#+begin_src lisp <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #ff0000;">&quot;#+end_src&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton iprop 
  <span style="color: #ff0000;">&quot;Input :PROPERTIES: :END: in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #ff0000;">&quot;:PROPERTIES:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #ff0000;">&quot;:END:&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton insert-emacser-code
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;#+BEGIN_HTML<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #ff0000;">&quot;&lt;pre lang=<span style="color: #000099; font-weight: bold;">\&quot;</span>lisp<span style="color: #000099; font-weight: bold;">\&quot;</span> line=<span style="color: #000099; font-weight: bold;">\&quot;</span>1<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _<span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #ff0000;">&quot;</span></pre></td></tr></table></div>

<p>\n&#8221;<br />
&#8220;#+END_HTML\n&#8221;<br />
)</p>
<p>(define-abbrev org-mode-abbrev-table &#8220;iexp&#8221; &#8220;&#8221; &#8216;iexp)<br />
(define-abbrev org-mode-abbrev-table &#8220;isrc&#8221; &#8220;&#8221; &#8216;isrc)<br />
(define-abbrev org-mode-abbrev-table &#8220;iprop&#8221; &#8220;&#8221; &#8216;iprop)<br />
(define-abbrev org-mode-abbrev-table &#8220;ihtml&#8221;  &#8220;&#8221; &#8216;insert-emacser-code)</p>
</pre>
<p>
很容易看出来，有了这些东西以后，在写 <code>org</code> 文档的时候会很方便。并且，为了能够对已经存在的代码添加 <code>#+BEGIN_EXAMPLE</code> <code>#+begin_src</code> 等等定义，我还编写了几个扩展函数：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code109'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709109"><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
</pre></td><td class="code" id="p41709code109"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> i-babel-<span style="color: #b1b100;">quote</span> <span style="color: #66cc66;">&#40;</span>beg end str1 str2<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>goto-char end<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>forward-line <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert str2<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>newline<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>goto-char beg<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>forward-line -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>newline<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert str1<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> iexp <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot; &quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;%s %s&quot;</span> beg end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>i-babel-<span style="color: #b1b100;">quote</span> beg end <span style="color: #ff0000;">&quot;#+BEGIN_EXAMPLE&quot;</span> <span style="color: #ff0000;">&quot;#+END_EXAMPLE&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> isrc <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot; &quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;%s %s&quot;</span> beg end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>i-babel-<span style="color: #b1b100;">quote</span> beg end <span style="color: #ff0000;">&quot;#+begin_src &quot;</span> <span style="color: #ff0000;">&quot;#+end_src&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> i<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>insert <span style="color: #ff0000;">&quot;=&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char beg<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>insert <span style="color: #ff0000;">&quot;=&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>+ end <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
最后呢，我把一些 Shell当中比较常用的命令也定义成了 skeleton 。之所以不在 Shell profile 当中定义它，一方面是因为在我的工作中每天都要接触到大量的 Unix/Linux机器，放在 Emacs 里面的话呢，所有的命令都只需要定义一次，就可以在任意一个机器上使用。另外一方面呢，就是 skeleton，包括 abbrev 都是 Emacs 内部的东西，也就是说他们只会把定义的命令扩展开来，而并不会直接的去执行他，只有当我看到扩展结果并且按下回车，comint.el才会把相应的命令转交给 shell process 去执行，这在很多时候要比 shell 本身的 alias 和 function 机制安全的多的多。以下是一些示例：
</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('p41709code110'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p41709110"><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
</pre></td><td class="code" id="p41709code110"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-skeleton kill-multiple-proces
  <span style="color: #ff0000;">&quot;Build killing multiple process command list&quot;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;ps -ef | grep -i &quot;</span> _ <span style="color: #ff0000;">&quot; | awk '{ print <span style="color: #000099; font-weight: bold;">\&quot;</span>kill -9 <span style="color: #000099; font-weight: bold;">\&quot;</span> $2 }'&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev shell-mode-abbrev-table <span style="color: #ff0000;">&quot;killps&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> 'kill-multiple-proces<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton gunzip-tar
  <span style="color: #ff0000;">&quot;unzip .tar.gz package in where -z is not available&quot;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;gunzip -cd &quot;</span> _ <span style="color: #ff0000;">&quot; | tar -xf - &quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton def_listener 
  <span style="color: #ff0000;">&quot;Define a listener in a WMQ QMgr&quot;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;DEF LISTENER(LST) TRPTYPE(TCP) PORT(&quot;</span> _ <span style="color: #ff0000;">&quot;) CONTROL(QMGR)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev shell-mode-abbrev-table <span style="color: #ff0000;">&quot;deflst&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> 'def_listener<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton def_clusrcvr
  <span style="color: #ff0000;">&quot;Define a Cluster Receiver Channel in a WMQ QMgr&quot;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;DEF CHL(TO.QMCOD.4.FTECA) CHLTYPE(CLUSRCVR) CONNAME('&quot;</span> _ <span style="color: #ff0000;">&quot;') CLUSTER(FTECA)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev shell-mode-abbrev-table <span style="color: #ff0000;">&quot;defclusrcvr&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> 'def_clusrcvr<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
对于很多更简单的命令，直接就定义在 abbrev 里面了。
</p>
</div>
</div>
<div id="outline-container-1.8" class="outline-4">
<h4 id="sec-1.8"><span class="section-number-4">1.8</span> dove-ext.el </h4>
<div class="outline-text-4" id="text-1.8">
<p>
最后的最后，是 <code>dove-ext.el</code> 。这个文件的内容都是我自己编写的各种扩展函数。包括上面提到的部分和更多还没有被提到的。 你可以到 <a href="http://www.emacswiki.org/emacs/DavidYoung" target="_blank">EmacsWiki</a> 上去浏览这些函数。
</p>
</div>
</div>
</div>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/my-emacs-config.htm' t='我的 GNU Emacs 配置&amp;#8221;程序&amp;#8221;' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/my-emacs-config.htm/feed</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
	</channel>
</rss>

