<?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中文网</title>
	<atom:link href="http://emacser.com/feed" rel="self" type="application/rss+xml" />
	<link>http://emacser.com</link>
	<description>没有我做不到的，只有你想不到的</description>
	<lastBuildDate>Sat, 04 Sep 2010 11:40:53 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>折腾Emacs</title>
		<link>http://emacser.com/torture-emacs.htm</link>
		<comments>http://emacser.com/torture-emacs.htm#comments</comments>
		<pubDate>Mon, 16 Aug 2010 17:37:24 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[配置]]></category>
		<category><![CDATA[ahei]]></category>
		<category><![CDATA[ann]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[ctrl]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[eval-after-load]]></category>
		<category><![CDATA[face]]></category>
		<category><![CDATA[highlight]]></category>
		<category><![CDATA[mode-line]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[speedbar]]></category>
		<category><![CDATA[textmate]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[颜色]]></category>
		<category><![CDATA[鼠标]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41522</guid>
		<description><![CDATA[作者: 小强
传说中神一样编辑器的Emacs向来以难学难用，喜欢折腾人著称。三天打渔两天晒网的我，居然心甘情愿地被它折腾了5，6年之久，期间苦乐不足为外人道也。

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


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

Emacs 中文字体配置

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


最简单的字体设置方式是

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

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

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

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

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

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


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

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code20'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152220"><td class="code" id="p41522code20"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>set-default-font <span style="color: #ff0000;">&quot;-outline-Lucida Console-normal-normal-normal-mono-*-*-*-*-*-*-iso10646-1&quot;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

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

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code22'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152222"><td class="code" id="p41522code22"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> default-frame-alist <span style="color: #66cc66;">&#40;</span>font <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;微软雅黑Monaco 12&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这种方法的缺点在于，你没办法单独换英文字体或中文字体，只能新做一个字体整体换掉。另外，网上做的字体里面，并没有包含斜体，显示的时候不够丰富。
</p>
<p>
其实 Emacs 本身支持根据字符编码去找合适的字体，不过需要按编码详细的设置，让 Emacs 明白遇到汉字编码要用宋体，而不是楷体或“Lucida Console”。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code23'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152223"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41522code23"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>set-fontset-font
    <span style="color: #66cc66;">&#40;</span>frame-parameter <span style="color: #b1b100;">nil</span> 'font<span style="color: #66cc66;">&#41;</span>
    'han
    <span style="color: #66cc66;">&#40;</span>font-spec <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #ff0000;">&quot;Microsoft Yahei&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">size</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>除了 han 以外，还有 kana, symbol, cjk-misc, bopomofo 这些编码集也要一并设置好。可以用 elisp 的 dolist 做循环操作，减少不必要的复制粘贴</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code24'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152224"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41522code24"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>charset '<span style="color: #66cc66;">&#40;</span>kana han <span style="color: #b1b100;">symbol</span> cjk-misc bopomofo<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>set-fontset-font <span style="color: #66cc66;">&#40;</span>frame-parameter <span style="color: #b1b100;">nil</span> 'font<span style="color: #66cc66;">&#41;</span>
                      charset
                      <span style="color: #66cc66;">&#40;</span>font-spec <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #ff0000;">&quot;Microsoft Yahei&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">size</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p><b>切记不能图省事，直接把 unicode 字符编码集的字体设成中文</b>，这样的话，在 Windows 平台上，原来的英文字体设置就失效了</p>
<p>还有一点，原来对英文字体的设置方法要改成下面这样才能和中文的配合，否则 Emacs 会忽略英文字体的设置 ( 起码在 Windows 平台上是这样 )，所以最终的版本是：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code25'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152225"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p41522code25"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; Setting English Font</span>
<span style="color: #66cc66;">&#40;</span>set-face-attribute
  'default <span style="color: #b1b100;">nil</span> <span style="color: #66cc66;">:</span><span style="color: #555;">font</span> <span style="color: #ff0000;">&quot;Consolas 12&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Chinese Font</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>charset '<span style="color: #66cc66;">&#40;</span>kana han <span style="color: #b1b100;">symbol</span> cjk-misc bopomofo<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>set-fontset-font <span style="color: #66cc66;">&#40;</span>frame-parameter <span style="color: #b1b100;">nil</span> 'font<span style="color: #66cc66;">&#41;</span>
                      charset
                      <span style="color: #66cc66;">&#40;</span>font-spec <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #ff0000;">&quot;Microsoft Yahei&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">size</span> <span style="color: #cc66cc;">12</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
<p>
字体的选择上，中文我比较喜欢微软雅黑字体，英文的字体我选择等宽字体方便编程。一般常使用 Monaco 或者 Consolas。Monaco 是那种一见倾心型的，字体设计的高挑修长，有种拉丁美人的性感。Consolas 是微软为新的 Visual Studio 专门打造的编程字体，虽然乍看没有 Monaco 那么精艳，可是相当耐看，如同小家碧玉，是个“居家过日子”的实用字体。听说 “DejaVu Sans Mono” 也不错，准备有时间试试看。
</p>
<p>
到这里，基本上 Emacs 的字体设置算是能赶上其它的编辑器了。可是，做为神一般的编辑器，只是赶上其它编辑器这也太丢人。下面要挑战一下自我，让神器发挥它应有的威力：<b>如何能够根据用户的喜好和操作系统的字体库来做最符合用户心意的字体设定呢？</b><br />
换言之，我想要的功能是：Emacs 你能不能做到，如果系统有雅黑字体，就请帮忙用雅黑，否则（如 Linux 系统上默认没有雅黑）就请用开源字体文泉驿微米黑。查了一下，网上没有现成的例子，只好挽起袖子，自己研究 elisp 编程动手写了一个设置字体的函数。</p>
<p>
首先，我们要能判断某个字体在系统中是否安装:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code26'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152226"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41522code26"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> qiang-font-existsp <span style="color: #66cc66;">&#40;</span>font<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">null</span> <span style="color: #66cc66;">&#40;</span>x-list-fonts font<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>其次，要按顺序找到一个字体列表( list ) 中第一个已经安装可用的字体，下面是个例子</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code27'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152227"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41522code27"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defvar font-<span style="color: #b1b100;">list</span> '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Microsoft Yahei&quot;</span> <span style="color: #ff0000;">&quot;文泉驿等宽微米黑&quot;</span> <span style="color: #ff0000;">&quot;黑体&quot;</span> <span style="color: #ff0000;">&quot;新宋体&quot;</span> <span style="color: #ff0000;">&quot;宋体&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>require 'cl<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;; find-if is in common list package</span>
<span style="color: #66cc66;">&#40;</span>find-<span style="color: #b1b100;">if</span> #'qiang-font-existsp font-<span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>还要有个辅助函数，用来产生带上 font size 信息的 font 描述文本</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code28'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152228"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41522code28"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> qiang-make-font-string <span style="color: #66cc66;">&#40;</span>font-<span style="color: #b1b100;">name</span> font-size<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span>stringp font-size<span style="color: #66cc66;">&#41;</span> 
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">equal</span> <span style="color: #ff0000;">&quot;:&quot;</span> <span style="color: #66cc66;">&#40;</span>string <span style="color: #66cc66;">&#40;</span>elt font-size <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;%s%s&quot;</span> font-<span style="color: #b1b100;">name</span> font-size<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;%s %s&quot;</span> font-<span style="color: #b1b100;">name</span> font-size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这里绕的地方是，如果传入的 font-size 是“:pixelsize=18”这样的话，字体名称和它之间不能有空格。如果是普通的数字的话（ 12或“12”)，需要有个空格分隔字体名称和字体大小。</p>
<p>有了这些函数，下面出场的就是自动设置字体函数了:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code29'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152229"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="code" id="p41522code29"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> qiang-set-font <span style="color: #66cc66;">&#40;</span>english-fonts
                       english-font-size
                       chinese-fonts
                       <span style="color: #66cc66;">&amp;</span>optional chinese-font-size<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;english-font-size could be set to <span style="color: #000099; font-weight: bold;">\&quot;</span>:pixelsize=18<span style="color: #000099; font-weight: bold;">\&quot;</span> or a integer.
If set/leave chinese-font-size to nil, it will follow english-font-size&quot;</span>
  <span style="color: #66cc66;">&#40;</span>require 'cl<span style="color: #66cc66;">&#41;</span>                         <span style="color: #808080; font-style: italic;">; for find if</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>en-font <span style="color: #66cc66;">&#40;</span>qiang-make-font-string
                  <span style="color: #66cc66;">&#40;</span>find-<span style="color: #b1b100;">if</span> #'qiang-font-existsp english-fonts<span style="color: #66cc66;">&#41;</span>
                  english-font-size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>zh-font <span style="color: #66cc66;">&#40;</span>font-spec <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #66cc66;">&#40;</span>find-<span style="color: #b1b100;">if</span> #'qiang-font-existsp chinese-fonts<span style="color: #66cc66;">&#41;</span>
                            <span style="color: #66cc66;">:</span><span style="color: #555;">size</span> chinese-font-size<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">;; Set the default English font</span>
    <span style="color: #808080; font-style: italic;">;; </span>
    <span style="color: #808080; font-style: italic;">;; The following 2 method cannot make the font settig work in new frames.</span>
    <span style="color: #808080; font-style: italic;">;; (set-default-font &quot;Consolas:pixelsize=18&quot;)</span>
    <span style="color: #808080; font-style: italic;">;; (add-to-list 'default-frame-alist '(font . &quot;Consolas:pixelsize=18&quot;))</span>
    <span style="color: #808080; font-style: italic;">;; We have to use set-face-attribute</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;Set English Font to %s&quot;</span> en-font<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>set-face-attribute
     'default <span style="color: #b1b100;">nil</span> <span style="color: #66cc66;">:</span><span style="color: #555;">font</span> en-font<span style="color: #66cc66;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;">;; Set Chinese font </span>
    <span style="color: #808080; font-style: italic;">;; Do not use 'unicode charset, it will cause the english font setting invalid</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;Set Chinese Font to %s&quot;</span> zh-font<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>charset '<span style="color: #66cc66;">&#40;</span>kana han <span style="color: #b1b100;">symbol</span> cjk-misc bopomofo<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>set-fontset-font <span style="color: #66cc66;">&#40;</span>frame-parameter <span style="color: #b1b100;">nil</span> 'font<span style="color: #66cc66;">&#41;</span>
                        charset
                        zh-font<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>利用这个函数，Emacs 字体设置就是小菜一碟了</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code30'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152230"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41522code30"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>qiang-set-font
 '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Consolas&quot;</span> <span style="color: #ff0000;">&quot;Monaco&quot;</span> <span style="color: #ff0000;">&quot;DejaVu Sans Mono&quot;</span> <span style="color: #ff0000;">&quot;Monospace&quot;</span> <span style="color: #ff0000;">&quot;Courier New&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;:pixelsize=18&quot;</span>
 '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Microsoft Yahei&quot;</span> <span style="color: #ff0000;">&quot;文泉驿等宽微米黑&quot;</span> <span style="color: #ff0000;">&quot;黑体&quot;</span> <span style="color: #ff0000;">&quot;新宋体&quot;</span> <span style="color: #ff0000;">&quot;宋体&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这样设置，Emacs 会优先选用 Consolas + “雅黑”的组合。如果“雅黑”没有装的话，就使用“文泉驿等宽微米黑”，依此类推。这份字体配置不用改动就能在不同的操作系统字体环境下面使用，相信应该没有其它编辑器有这么变态的后备字体列表设置了吧。至此，Emacs 在字体设置这方面总算是“体面”地稍稍胜出了其它编辑器。把上面的三个函数加到配置文件 .emacs 里赶快看看效果吧。
</p>
<h3>Emacs 字体大小的调整</h3>
<p>
在用 Emacs 做演示或代码审查的时候，经常需要调整默认的字体大小，以前常常为了这个而手忙脚乱。最近才知道，原来 Emacs 默认就有快捷键支持动态调整字体大小：
</p>
<ul>
<li>放大字体: Ctrl-x Ctrl-+ 或 Ctrl-x Ctrl-=</li>
<li>缩小字体: Ctrl-x Ctrl&#8211;</li>
<li>重置字体: Ctrl-x Ctrl-0</li>
</ul>
<p>更酷的是，如果要放大或缩小多次，在第二次直接按 ＋，－，0 就可以了，比如，放大 3 次： Ctrl-x Ctrl-= = = 。另外，Shift + 鼠标左键 也能唤出调整字体大小的弹出菜单。</p>
<p>
不过，能不能象网络浏览器和最新版的 Visual Studio 2010 那样，用 Ctrl 加上鼠标滚轮操作来设置字体大小呢，毕竟大部分人已经习惯了这种方式了。既然是无所不能的 Emacs，那当然没问题了，把下面的配置加入 .emacs 里再试试看 <img src='http://emacser.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code31'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152231"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p41522code31"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; For Linux</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&amp;lt;C-mouse-4&amp;gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-increase<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&amp;lt;C-mouse-5&amp;gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-decrease<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; For Windows</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&amp;lt;C-wheel-up&amp;gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-increase<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&amp;lt;C-wheel-down&amp;gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-decrease<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
<h3>添加删除注释</h3>
<p>
写程序的，要经常和注释打交道，注释和反注释一段代码是家常便饭。可惜，Emacs 虽然有这个功能，默认的配置却并不好用：
</p>
<ul>
<li>注释/反注释这两个功能默认没有绑定快捷键</li>
<li>需要先选中一段区域才能调用注释功能，哪怕只想注释/反注释当前行</li>
<li>好在有一个 Alt-; 的快捷键，默认绑定了 comment-dwim，能注释/反注释当前激活的区域。如果没有激活区域，就在当前行末加注释</li>
</ul>
<p>其实 Alt-; 默认绑定的 comment-dwim 已经很理想了，可是，还是不够 dwim ( Do What I Mean )。能不能变成，如果没有激活的区域，就注释/反注释当前行，仅当在行尾的时候才在行尾加注释呢？下面的配置就是参考别人配置写的 “照我说的做”注释函数:</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code32'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152232"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p41522code32"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> qiang-comment-dwim-line <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Replacement for the comment-dwim command.
If no region is selected and current line is not blank and we are not at the end of the line,
then comment current line.
Replaces default behaviour of comment-dwim, when it inserts comment at the end of the line.&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;*P&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>comment-normalize-vars<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span>region-active-p<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span>looking-at <span style="color: #ff0000;">&quot;[ <span style="color: #000099; font-weight: bold;">\t</span>]*$&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>comment-or-uncomment-region <span style="color: #66cc66;">&#40;</span>line-beginning-position<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>line-end-position<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>comment-dwim arg<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\M</span>-;&quot;</span> 'qiang-comment-dwim-line<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这样一来，注释和反注释代码的操作只使用一个 Alt-; 键就全部搞定了，Emacs 会心领神会地“照我说的做”。</p>
<h3>复制当前行</h3>
<p>
这是个经常要用到的操作，以前要么老老实实 Mark 当前行的行首和行尾，然后复制。整个按键流程是：
</p>
<ol>
<li>Ctrl-a 光标到行首</li>
<li>Ctrl-Shift-Space 设置标记</li>
<li>Ctrl-e 光标到行尾。如此这一行就被选为激活的区域了</li>
<li>Alt-w 复制当前激活的区域</li>
</ol>
<p>要么按我比较习惯的操作先剪切当前行，再撤消上一次的剪切操作</p>
<ol>
<li>Ctrl-a 光标到行首</li>
<li>Ctrl-k 剪切至行屋，该行消失</li>
<li>Ctrl-/ 撤消上一次的操作，该行重现</li>
</ol>
<p>可以看到，方案二比方案一省一次按键，而且 Ctrl 键不用松开。不过，如此基本的操作要按三个键还是太麻烦了，而且方案二会让文件变成被编辑过的状态。其实，可以发挥一下“按我说的做”的精神。为什么不把 Alt-w 变的更聪明一些，当没有激活的区域时就复制当前的一整行呢？ 说做就做:
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code33'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152233"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code" id="p41522code33"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; Smart copy, if no region active, it simply copy the current whole line</span>
<span style="color: #66cc66;">&#40;</span>defadvice kill-line <span style="color: #66cc66;">&#40;</span>before check-position activate<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">member</span> major-mode
              '<span style="color: #66cc66;">&#40;</span>emacs-lisp-mode scheme-mode lisp-mode
                                c-mode c++-mode objc-mode js-mode
                                latex-mode plain-tex-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span>eolp<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> <span style="color: #66cc66;">&#40;</span>bolp<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
          <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span> <span style="color: #66cc66;">&#40;</span>forward-char <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>just-one-space <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>backward-char <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defadvice kill-ring-save <span style="color: #66cc66;">&#40;</span>before slick-copy activate compile<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;When called interactively with no active region, copy a single line instead.&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> mark-active <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>region-beginning<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>region-end<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;Copied line&quot;</span><span style="color: #66cc66;">&#41;</span>
                 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>line-beginning-position<span style="color: #66cc66;">&#41;</span>
                       <span style="color: #66cc66;">&#40;</span>line-beginning-position <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defadvice kill-region <span style="color: #66cc66;">&#40;</span>before slick-cut activate compile<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;When called interactively with no active region, kill a single line instead.&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive
   <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> mark-active <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>region-beginning<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>region-end<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>line-beginning-position<span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span>line-beginning-position <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Copy line from point to the end, exclude the line break</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> qiang-copy-line <span style="color: #66cc66;">&#40;</span>arg<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Copy lines (as many as prefix argument) in the kill ring&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;p&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>kill-ring-save <span style="color: #66cc66;">&#40;</span>point<span style="color: #66cc66;">&#41;</span>
                  <span style="color: #66cc66;">&#40;</span>line-end-position<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
                  <span style="color: #808080; font-style: italic;">;; (line-beginning-position (+ 1 arg)))</span>
  <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;%d line%s copied&quot;</span> arg <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span> arg<span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot;&quot;</span> <span style="color: #ff0000;">&quot;s&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;M-k&quot;</span><span style="color: #66cc66;">&#41;</span> 'qiang-copy-line<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
上面还多加了一个配置，就是把 Alt-k 设成复制光标所在处到行尾。与 kill-line 的 Ctrl-k 对应。这样一来，如果是要拷贝一整行的话，只要将光标移动到该行任意位置，按下 Alt-w 就行了。如果是复制某个位置到行尾的文字的话，就把光标移到起始位置处，按 Alt-k 。比默认的操作简化了很多。
</p>
<h3>拷贝代码自动格式化</h3>
<p>Emacs 里对代码的格式化支持的非常好，不但可以在编辑的时候自动帮你格式化，还可以选中一块代码，按 Ctrl-Alt-\ 对这块代码重新进行格式化。如果要粘贴一块代码的话，粘贴完了紧接着按 Ctrl-Alt-\ 就可以把新加入的代码格式化好。可是，对于这种粘贴加上重新格式化的机械操作，Emacs 应该可以将它自动化才能配得上它的名气，把下面的代码加到配置文件里，你的 Emacs 就会拥有这种能力了</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code34'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152234"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
</pre></td><td class="code" id="p41522code34"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">dolist</span> <span style="color: #66cc66;">&#40;</span>command '<span style="color: #66cc66;">&#40;</span>yank yank-pop<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eval</span>
   `<span style="color: #66cc66;">&#40;</span>defadvice <span style="color: #66cc66;">,</span>command <span style="color: #66cc66;">&#40;</span>after indent-region activate<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">and</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">not</span> current-prefix-arg<span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">member</span> major-mode
                   '<span style="color: #66cc66;">&#40;</span>emacs-lisp-mode
                     lisp-mode
                     clojure-mode
                     scheme-mode
                     haskell-mode
                     ruby-mode
                     rspec-mode
                     python-mode
                     c-mode
                     c++-mode
                     objc-mode
                     latex-mode
                     js-mode
                     plain-tex-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>mark-even-if-inactive transient-mark-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span>indent-region <span style="color: #66cc66;">&#40;</span>region-beginning<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>region-end<span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>你可以加入或删除一些 mode 名称来定制上面的配置。
</p>
<h3>Emacs 与 Windows 系统的整合</h3>
<p>在注册表中加入下面的项，右键上下文菜单中就会多出 “Emacs”，你可以使用它快速用 Emacs 编辑任意文件而不用和该文件类型相关联</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code35'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152235"><td class="code" id="p41522code35"><pre class="text" style="font-family:monospace;">[HKEY_CLASSES_ROOT\AllFilesystemObjects\Shell\Emacs\command]
@=&quot;\&quot;D:\\full\\path\\to\\emacs\\bin\\emacsclientw.exe\&quot; -n -a \&quot;D:\\full\\path\\to\\emacs\\bin\\runemacs.exe\&quot; \&quot;%1\&quot;&quot;</pre></td></tr></table></div>

<p>
这里调用 emacsclientw.exe 是为了使用 server-mode 来避免再打开一个 Emacs 实例，-n 参数指明不需要等待 Emacs (server) 编辑结束就直接返回，-a 指明一个替代品：如果找不到 Emacs server，那就通过 &#8220;runemacs.exe &#8221; 启动一个 Emacs 实例来编辑。 不要忘了在 .emacs 里加入 (server-mode 1) 来自动启动 emacs server。
</p>
<p>
有些工具在使用外部工具时命令行不能带任何参数，遇到这种情况，只能写一个 BATCH 文件把上面的命令包装一下：
</p>
<pre>
D:\full\path\to\emacs\bin\emacsclientw.exe -n -a "D:\full\path\to\emacs\bin\runemacs.exe" %*
</pre>
<p>
如果装了 Visual Studio, 那么，在 Visual Studio 的菜单 Tools 下面可以通过 External Tools 加入一个自定义的外部工具。外部工具的命令可以使用上面定义的 emacsclientw.exe, 参数那栏加上 </p>
<pre>
-n -a "D:\full\path\to\emacs\bin\runemacs.exe" +$(CurLine) $(ItemPath)”
</pre>
<p>将这个外部工具设上一个方便的快捷键，比如我就设成 Alt-F1，这样每次用 Visual Studio 浏览代码时，如果看到想编辑的内容，直接 Alt-F1 就可以把 Emasc 呼出，光标会自动放在文件刚刚看的那行上面。编辑完了后再 Alt-Tab 就可以切会 Visual Studio 了。你可能还需要设置 Visual Studio 自动重新载入改过的文件，避免每次都弹出对话框让你确认是否重新载入。
</p>
<h3>Emacs 的配色</h3>
<p>
我以前的 Emacs 配色非常简单，黑底白字。用的时间长了会腻，而且，Emacs 默认的代码高亮配色只能说相当的一般。</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code36'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152236"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41522code36"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> default-frame-alist
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>cursor-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;purple&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>cursor-type <span style="color: #66cc66;">.</span> box<span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>foreground-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;white&quot;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span>background-color <span style="color: #66cc66;">.</span><span style="color: #ff0000;">&quot;black&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

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

</p>
<p>
使用的话需要先安装 color-theme 包，将上面的配色存为 color-theme-blackboard.el 放在 emacs 的 load path 中，在加入下面的配置就好了：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code38'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152238"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41522code38"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'color-theme<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>eval-after-load <span style="color: #ff0000;">&quot;color-theme&quot;</span>
  '<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span>
     <span style="color: #66cc66;">&#40;</span>color-theme-initialize<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>color-theme-blackboard<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
<p>
来看看我配置的使用 Consolas + “雅黑” + blackboard-theme的Emacs：</p>
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/qiang-emacs.png" rel="lightbox"><img src="screenshots/thumbs/thumbs_qiang-emacs.png"/></a><p class="wp-caption-text">小强的Emacs</p></div>
<p>
虽说10个人会配出 11 种不同的 Emacs，不过我这个还算是芙蓉出水，落落大方吧 <img src='http://emacser.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />
</p>
</p>
<p>
折腾到此结束，“整容”过后的 Emacs 更加的漂亮听话了。话说回来，Emacs 实在是要与时俱进，多和苹果学学，改进一下自己难学难用的形象，最好将这些好用的 UI 操作设为默认配置。毕竟对最终用户来说这样的折腾也只能偶尔为之，老是将心思花在配置这神一样的编辑器上面，自己早晚也要成为半仙。</p>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/torture-emacs.htm' t='折腾Emacs' d='' tag='ahei,ann,C,ctrl,cursor,Emacs,eval-after-load,face,highlight,mode-line,python,screenshot,speedbar,textmate,theme,windows,光标,浏览器,配色,配色,颜色,鼠标' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (164)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (111)</li>
	<li><a href="http://emacser.com/w3m.htm" title="Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页 (2009年11月23日)">Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页</a> (14)</li>
	<li><a href="http://emacser.com/emacs.htm" title="Emacs长啥样 (2009年11月5日)">Emacs长啥样</a> (1)</li>
	<li><a href="http://emacser.com/emaci.htm" title="Emacs才是世界上最强大的IDE － 用Emaci阅读文件 (2010年04月12日)">Emacs才是世界上最强大的IDE － 用Emaci阅读文件</a> (85)</li>
</ul>

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

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





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

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

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

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

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

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

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

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

#+END_DITAA

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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-ditaa.htm' t='Emacs中绘图 － ditaa篇' d='' tag='artist-mode,C,ditaa,Emacs,emacser,emacser.com,erc,graphviz,IDE,irc,matlab,muse-mode,org,Org Mode,python,screenshot,wiki-mode,配色,配色' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (164)</li>
	<li><a href="http://emacser.com/from-vi-to-emacs.htm" title="我是如何从vim转向Emacs的 (2010年04月27日)">我是如何从vim转向Emacs的</a> (37)</li>
	<li><a href="http://emacser.com/erc.htm" title="ERC使用简介 (2010年03月22日)">ERC使用简介</a> (34)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (111)</li>
	<li><a href="http://emacser.com/about.htm" title="关于 (2009年11月4日)">关于</a> (14)</li>
</ul>

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

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

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



键绑定
命令
解释


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


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


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


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


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


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


g
google-maps-static-refresh
刷新


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


q
google-maps-static-quit
退出


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


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


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


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


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


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



访问五道口的效果5：

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

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



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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-google-map.htm' t='google-maps-el &amp;#8211; Emacs中的谷歌地图' d='' tag='Emacs,emacser,emacser.com,face,google,google maps,maps,org,颜色' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (43)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (164)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (111)</li>
	<li><a href="http://emacser.com/emaci.htm" title="Emacs才是世界上最强大的IDE － 用Emaci阅读文件 (2010年04月12日)">Emacs才是世界上最强大的IDE － 用Emaci阅读文件</a> (85)</li>
	<li><a href="http://emacser.com/emacs-beginner-must-know.htm" title="Emacs初学者必知必会 (2010年01月24日)">Emacs初学者必知必会</a> (5)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-google-map.htm/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>使用doxymacs写标准代码注释</title>
		<link>http://emacser.com/doxymacs.htm</link>
		<comments>http://emacser.com/doxymacs.htm#comments</comments>
		<pubDate>Mon, 28 Jun 2010 01:36:33 +0000</pubDate>
		<dc:creator>fangzhzh</dc:creator>
				<category><![CDATA[IDE]]></category>
		<category><![CDATA[初级]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[doxymacs]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[鼠标]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41433</guid>
		<description><![CDATA[doxymacs = doxygen+emacs。
如果你不知道doxygen，请移步这里，或者google之。
doxymacs 官网，现在版本是1.8.0。
特性：

从emacs中，查找某个符号的文档，显示在你选择的浏览器中。
在源代码中方便的插入Doxgen Style格式的注释。
可选：实用外部XML parser加速构建完整列表。
高亮Doxygen关键字。

特性1,3,4我用的比较少，重点介绍第二个。
安装
Doxymacs 依赖一下包:
W3      http://www.cs.indiana.edu/usr/local/www/elisp/w3/docs.html
tempo   http://www.lysator.liu.se/~davidk/elisp/
libxml2 http://www.libxml.org/
将doxymacs.el放到load-path路径下，在.emacs中加入下面语句

?View Code LISP&#40;require 'doxymacs&#41;

命令doxymacs-mode就可以启动，如让doxymacs-mode随着c/c++ mode自动启动，

?View Code LISP&#40;add-hook 'c-mode-common-hook 'doxymacs-mode&#41;

代码中插入doxygen注释
如果一切正常，那么在启动一个c/c++文件后，就进入了doxymacs-mode。
可以使用以下快捷键：



命令
英文解释
中文解释


C-c d ?
will look up documentation for the symbol under the point.
查找当前鼠标点下的符号的文档


C-c d r
will rescan your Doxygen tags file.
重新扫描tags文件


C-c d f
will insert a Doxygen comment for the next function.
为函数插入Doxygen注释


C-c d i
will [...]]]></description>
			<content:encoded><![CDATA[<p>doxymacs = doxygen+emacs。<br />
如果你不知道doxygen，请<a href="http://fangzhzh.admindigest.com/2010/06/generating-beautiful-document-for-ur-codes-using-doxygen/" target="_blank">移步这里</a>，或者google之。</p>
<p>doxymacs <a href="http://doxymacs.sourceforge.net/" target="_blank">官网</a>，现在版本是1.8.0。</p>
<p>特性：</p>
<ul>
<li>从emacs中，查找某个符号的文档，显示在你选择的浏览器中。</li>
<li>在源代码中方便的插入Doxgen Style格式的注释。</li>
<li>可选：实用外部XML parser加速构建完整列表。</li>
<li>高亮Doxygen关键字。</li>
</ul>
<p>特性1,3,4我用的比较少，重点介绍第二个。<span id="more-41433"></span></p>
<h3>安装</h3>
<p class="first">Doxymacs 依赖一下包:</p>
<p>W3      <a href="http://www.cs.indiana.edu/usr/local/www/elisp/w3/docs.html" target="_blank">http://www.cs.indiana.edu/usr/local/www/elisp/w3/docs.html</a></p>
<p>tempo   <a href="http://www.lysator.liu.se/~davidk/elisp/" target="_blank">http://www.lysator.liu.se/~davidk/elisp/</a></p>
<p>libxml2 <a href="http://www.libxml.org/" target="_blank">http://www.libxml.org/</a></p>
<p>将doxymacs.el放到load-path路径下，在.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('p41433code43'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4143343"><td class="code" id="p41433code43"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'doxymacs<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>命令doxymacs-mode就可以启动，如让doxymacs-mode随着c/c++ mode自动启动，</p>

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

<h3>代码中插入doxygen注释</h3>
<p class="first">如果一切正常，那么在启动一个c/c++文件后，就进入了doxymacs-mode。<br />
可以使用以下快捷键：</p>
<table class="muse-table" border="2" cellpadding="5">
<tbody>
<tr>
<td>命令</td>
<td>英文解释</td>
<td>中文解释</td>
</tr>
<tr>
<td>C-c d ?</td>
<td>will look up documentation for the symbol under the point.</td>
<td>查找当前鼠标点下的符号的文档</td>
</tr>
<tr>
<td>C-c d r</td>
<td>will rescan your Doxygen tags file.</td>
<td>重新扫描tags文件</td>
</tr>
<tr>
<td>C-c d f</td>
<td>will insert a Doxygen comment for the next function.</td>
<td>为函数插入Doxygen注释</td>
</tr>
<tr>
<td>C-c d i</td>
<td>will insert a Doxygen comment for the current file.</td>
<td>为文件插入Doxygen注释</td>
</tr>
<tr>
<td>C-c d ;</td>
<td>will insert a Doxygen comment for the current member.</td>
<td>为当前成员插入Doxygen注释</td>
</tr>
<tr>
<td>C-c d m</td>
<td>will insert a blank multiline Doxygen comment.</td>
<td>插入多行注释</td>
</tr>
<tr>
<td>C-c d s</td>
<td>will insert a blank singleline Doxygen comment.</td>
<td>插入单行注释</td>
</tr>
<tr>
<td>C-c d @</td>
<td>will insert grouping comments around the current region.</td>
<td>插入环绕当前区域的注释</td>
</tr>
</tbody>
</table>
<p>到此，doxymacs基本就可以工作正常了。<br />
工作流程如下:</p>
<pre>

      +------------+            +------------+          +------------+
      |  coding    |-----------&gt;| commenting |---------&gt;| generating |
      |            |            |            |          | documents  |
      +------------+            +------------+          +------------+
</pre>
<h3>更改默认doxygen注释样式</h3>
<p class="first">方便的插入doxygen注释还不是最精彩的，最精彩的当然是用户自定义样式了。</p>
<h4>改变默认的doxygen注释类别</h4>
</p>
<p>这里我们首先修改变量doxymacs-doxygen-style，doxymacs默认是javaDoc，我们把它改为c++。</p>
<h4>定制doxygen的注释模板</h4>
<p class="first">doxymacs.el中有定义doxymacs-C++-file-comment-template,blablabla。顾名思义，此物就是c++-file-comment的模板。<br />
比如，根据我们公司注释的规定，我在.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('p41433code45'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4143345"><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
</pre></td><td class="code" id="p41433code45"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defconst doxymacs-C++-file-comment-template
 '<span style="color: #66cc66;">&#40;</span>
   <span style="color: #ff0000;">&quot;/******************************************************************************&quot;</span> <span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;* &quot;</span> <span style="color: #ff0000;">&quot;FILE NAME   :&quot;</span>
   <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>file-name-nondirectory <span style="color: #66cc66;">&#40;</span>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;&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #ff0000;">&quot; DESCRIPTION :&quot;</span><span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #ff0000;">&quot;    &quot;</span><span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #ff0000;">&quot; HISTORY     :&quot;</span><span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #ff0000;">&quot;    See Log at end of file&quot;</span><span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #ff0000;">&quot;Copyright (c) 2006, VIA Technologies, Inc.&quot;</span><span style="color: #66cc66;">&gt;</span> n
   <span style="color: #ff0000;">&quot;*&quot;</span> <span style="color: #ff0000;">&quot;******************************************************************************/&quot;</span><span style="color: #66cc66;">&gt;</span> n<span style="color: #66cc66;">&#41;</span>
 <span style="color: #ff0000;">&quot;Default C++-style template for file documentation.&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这样，我在test.cpp文件，实用C-c d i，会生成如下代码</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('p41433code46'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4143346"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p41433code46"><pre class="cpp" style="font-family:monospace;"><span style="color: #ff0000; font-style: italic;">/******************************************************************************
 *
 * FILE NAME   :test.cpp
 *
 * DESCRIPTION :
 *
 *
 *
 * HISTORY     :
 *
 *    See Log at end of file
 *
 *Copyright (c) 2006, VIA Technologies, Inc.
 *******************************************************************************/</span></pre></td></tr></table></div>

<p>如果你使用c++的话，你还有下边几个变量需要定制，</p>
<table class="muse-table" border="2" cellpadding="5">
<tbody>
<tr>
<td>变量</td>
<td>作用</td>
</tr>
<tr>
<td>doxymacs-C++-function-comment-template</td>
<td>函数</td>
</tr>
<tr>
<td>doxymacs-C++-blank-multiline-comment-template</td>
<td>多行注释</td>
</tr>
<tr>
<td>doxymacs-C++-blank-singleline-comment-template</td>
<td>单行注释</td>
</tr>
</tbody>
</table>
<p>使用其他语言类同。</p>
<p>enjoy!</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/doxymacs.htm' t='使用doxymacs写标准代码注释' d='' tag='C,doxymacs,Emacs,org,浏览器,配色,鼠标' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (111)</li>
	<li><a href="http://emacser.com/torture-emacs.htm" title="折腾Emacs (2010年08月17日)">折腾Emacs</a> (62)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (164)</li>
	<li><a href="http://emacser.com/some-elisp-fun.htm" title="介绍一些Emacs功能强大的函数 (2010年06月7日)">介绍一些Emacs功能强大的函数</a> (18)</li>
	<li><a href="http://emacser.com/w3m.htm" title="Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页 (2009年11月23日)">Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页</a> (14)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/doxymacs.htm/feed</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>自定义Emacs工具栏</title>
		<link>http://emacser.com/emacs-toolbar.htm</link>
		<comments>http://emacser.com/emacs-toolbar.htm#comments</comments>
		<pubDate>Wed, 09 Jun 2010 01:03:34 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[Elisp]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[gdb]]></category>
		<category><![CDATA[gud]]></category>
		<category><![CDATA[keymap]]></category>
		<category><![CDATA[meteor]]></category>
		<category><![CDATA[meteor1113]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[semantic]]></category>
		<category><![CDATA[工具栏]]></category>
		<category><![CDATA[截图]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[鼠标]]></category>

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

前几天，emacs@newsmth上jcjbrian发了张他用emacs开发c++的截图，对他的工具栏挺感兴趣，所以向他请教了一下，同时也阅读了相关的info，在我的emacs上加了些自定义的工具栏（下图），在这记录一下以备忘。 

emacs的工具栏配置都存放在tool-bar-map这个keymap里，这个keymap跟我们平时用于键绑定的keymap是一样的1，emacs会根据tool-bar-map的内容自动生成工具栏，如果执行一下下面这段代码，工具栏就没了：


?View Code LISP&#40;setq tool-bar-map &#40;make-sparse-keymap&#41;&#41;


要自定义工具栏，只需要修改tool-bar-map这个变量就可以了，一般我们可以用tool-bar-add-item这个函数来往tool-bar-map里添加工具项。


tool-bar-add-item的原型是这样的：


?View Code LISP&#40;tool-bar-add-item icon def key &#38;rest props&#41;


参数icon设置工具图标，emacs的工具栏可以使用XPM和PBM格式的图标，当emacs 有libxmp支持时会使用XPM格式，没有libxmp库时会寻找PBM格式的图标(Info上还说有XBM格式，我没搞清楚什么情况下使用XBM)。


在etc/images目录下可以看到emacs自带的图标一般都同时有XPM和PBM两种格式，就是为了在没有libxmp库时也能显示工具栏，因为如果我们只有xpm格式的图标而没有libxmp库时，emacs就不在工具栏上显示这个项了。所以我们自己做图标时最好XPM和PBM都准备一份。


icon参数的类型是字符串，只需要传主文件名就可以，扩展名emacs会自己加，比如对图标文件semantic.xpm写成&#8221;semantic&#8221;。


emacs会在image-load-path下查找图标文件，这个变量的值默认为(&#8220;&#8230;/etc/images/&#8221; data-directory load-path)，就是说它除了查找image目录外还会查找所有的load-path，所以如果我们有自己的图标目录，把它加到image-load-path或者load-path都可以。


图标的大小好像没有限制，emacs本身使用的图标是24&#215;24像素的，如果使用了比它大的图标，整个工具栏会自动扩大。


参数def设置这个工具项被按下的执行什么命令，它的格式跟global-set-key里的command格式是一样的。


参数key用来给这个工具项指定一个key，这个key用于唯一标识这个工具项，所以在同一个keymap里key不能重复。


剩下的参数可以设置一些属性项，具体可以设置哪些属性可以看Info &#62; elisp &#62; Keymaps &#62; Menu Keymaps &#62; Defining Menus &#62; Extended Menu Items。常用的几个属性有：



:enable 这个属性的值是一个表达式，emacs对这个表达式求值，如果值为nil时，这个工具项会被禁用。


:visible 这个属性控制这个工具项是否显示，它的类型与:enable是一样的。


:help 这个属性类型是字符串，当鼠标在工具项上停留时会显示这个字符串。


其余的属性我没用过，也没仔细研究它们用来干什么。


举例来说，如果要添加一个工具项用来执行gdb命令，并且只有在c-mode或者c++-mode时才让它有效，可以这样：


?View Code LISP1
2
&#40;tool-bar-add-item &#34;gud/run&#34; 'gdb 'gdb
                [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://emacser.com/about.htm#meteor" target="_blank"><span style="color:#0000ff;"><b>Meteor Liu</b></span></a></p>
<p>
前几天，emacs@newsmth上jcjbrian发了张他用emacs开发c++的<a href="http://www.newsmth.net/bbscon.php?bid=573&amp;id=88480" target="_blank">截图</a>，对他的工具栏挺感兴趣，所以向他请教了一下，同时也阅读了相关的info，在我的emacs上加了些自定义的工具栏（下图），在这记录一下以备忘。 <span id="more-41416"></span></p>
<p><img src="screenshots/emacs-custom-toolbar.png" alt="自定义Emacs工具栏"/></p>
<p>emacs的工具栏配置都存放在tool-bar-map这个keymap里，这个keymap跟我们平时用于键绑定的keymap是一样的<sup><a class="footref" name="fnr.1" href="#fn.1">1</a></sup>，emacs会根据tool-bar-map的内容自动生成工具栏，如果执行一下下面这段代码，工具栏就没了：
</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('p41416code50'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4141650"><td class="code" id="p41416code50"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> tool-bar-map <span style="color: #66cc66;">&#40;</span>make-sparse-keymap<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
要自定义工具栏，只需要修改tool-bar-map这个变量就可以了，一般我们可以用tool-bar-add-item这个函数来往tool-bar-map里添加工具项。
</p>
<p>
tool-bar-add-item的原型是这样的：
</p>

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

<p>
参数icon设置工具图标，emacs的工具栏可以使用XPM和PBM格式的图标，当emacs 有libxmp支持时会使用XPM格式，没有libxmp库时会寻找PBM格式的图标(Info上还说有XBM格式，我没搞清楚什么情况下使用XBM)。
</p>
<p>
在etc/images目录下可以看到emacs自带的图标一般都同时有XPM和PBM两种格式，就是为了在没有libxmp库时也能显示工具栏，因为如果我们只有xpm格式的图标而没有libxmp库时，emacs就不在工具栏上显示这个项了。所以我们自己做图标时最好XPM和PBM都准备一份。
</p>
<p>
icon参数的类型是字符串，只需要传主文件名就可以，扩展名emacs会自己加，比如对图标文件semantic.xpm写成&#8221;semantic&#8221;。
</p>
<p>
emacs会在image-load-path下查找图标文件，这个变量的值默认为(&#8220;&hellip;/etc/images/&#8221; data-directory load-path)，就是说它除了查找image目录外还会查找所有的load-path，所以如果我们有自己的图标目录，把它加到image-load-path或者load-path都可以。
</p>
<p>
图标的大小好像没有限制，emacs本身使用的图标是24&#215;24像素的，如果使用了比它大的图标，整个工具栏会自动扩大。
</p>
<p>
参数def设置这个工具项被按下的执行什么命令，它的格式跟global-set-key里的command格式是一样的。
</p>
<p>
参数key用来给这个工具项指定一个key，这个key用于唯一标识这个工具项，所以在同一个keymap里key不能重复。
</p>
<p>
剩下的参数可以设置一些属性项，具体可以设置哪些属性可以看Info &gt; elisp &gt; Keymaps &gt; Menu Keymaps &gt; Defining Menus &gt; Extended Menu Items。常用的几个属性有：
</p>
<ul>
<li>
:enable 这个属性的值是一个表达式，emacs对这个表达式求值，如果值为nil时，这个工具项会被禁用。</p>
</li>
<li>
:visible 这个属性控制这个工具项是否显示，它的类型与:enable是一样的。</p>
</li>
<li>
:help 这个属性类型是字符串，当鼠标在工具项上停留时会显示这个字符串。</p>
</li>
</ul>
<p>其余的属性我没用过，也没仔细研究它们用来干什么。
</p>
<p>
举例来说，如果要添加一个工具项用来执行gdb命令，并且只有在c-mode或者c++-mode时才让它有效，可以这样：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41416code52'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4141652"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41416code52"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>tool-bar-add-item <span style="color: #ff0000;">&quot;gud/run&quot;</span> 'gdb 'gdb
                   <span style="color: #66cc66;">:</span><span style="color: #555;">enable</span> '<span style="color: #66cc66;">&#40;</span>memq major-mode '<span style="color: #66cc66;">&#40;</span>c++-mode c-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
这样会把gdb这个工具项添加到默认工具栏的最后，如果不想要emacs默认的工具栏，可以先执行(setq tool-bar-map (make-sparse-keymap))把默认的工具栏清空。
</p>
<p>
我的toolbar配置文件在：<a href="http://github.com/meteor1113/dotemacs/blob/master/init-toolbar.el" target="_blank">http://github.com/meteor1113/dotemacs/blob/master/init-toolbar.el</a>
</p>
<div id="footnotes">
<h2 class="footnotes">Footnotes: </h2>
<div id="text-footnotes">
<p class="footnote"><sup><a class="footnum" name="fn.1" href="#fnr.1">1</a></sup> 我读了半天info才明白，emacs的toolbar, menu和平时用global-set-key设置的按键绑定都是相通的，在emacs里，这些通通都保存在keymap里，只是menu和toolbar会多出一些属性设置。关于这些内容可以看看Info &gt; elisp &gt; Keymaps 以及下面的Menu Keymaps。
</p>
</div>
</div>
<div id="postamble">
</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-toolbar.htm' t='自定义Emacs工具栏' d='' tag='C,Emacs,emacser,emacser.com,gdb,gud,keymap,meteor,meteor1113,screenshot,semantic,工具栏,截图,配色,配色,鼠标' 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> (111)</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> (69)</li>
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (43)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (164)</li>
	<li><a href="http://emacser.com/from-vi-to-emacs.htm" title="我是如何从vim转向Emacs的 (2010年04月27日)">我是如何从vim转向Emacs的</a> (37)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-toolbar.htm/feed</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>介绍一些Emacs功能强大的函数</title>
		<link>http://emacser.com/some-elisp-fun.htm</link>
		<comments>http://emacser.com/some-elisp-fun.htm#comments</comments>
		<pubDate>Mon, 07 Jun 2010 05:19:19 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[Elisp]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[ahei]]></category>
		<category><![CDATA[C]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[face]]></category>
		<category><![CDATA[lambda]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[鼠标]]></category>

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



1 字符串类 
2 hook类函数 
3 用来高亮的函数 
4 编译类函数 
5 将这些函数串起来 




1 字符串类 


string-match 函数： 用指定的正则表达式去匹配字符串，将匹配的结果放到 match-data中。（match-data 用于存储emacs中字符串模式匹配中的匹配结果） 让我们看一个例子吧！
例 1：


?View Code LISP1
2
3
&#40;setq mystr &#34;The quick fox jumped quickly.&#34;&#41;
&#40;string-match &#34;\\(qu\\)\\(ick\\)&#34;
                   mystr&#41;   =&#62;副作用：将匹配结果存储到match-data中


这条语句的意思是：用\(qu\)\(ick\) 模式对mystr进行搜索，将匹配的结果存储，并且也存储分组1\(qu\) 和分组2 \(ick\)的匹配结果。


那么怎么取出匹配的结果呢？ 答案是使用 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><span style="color: #0000ff;"><b>xilbert</b></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 hook类函数 </a></li>
<li><a href="#sec-3">3 用来高亮的函数 </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> 字符串类 </h3>
<div class="outline-text-3" id="text-1">
<p>
string-match 函数： 用指定的正则表达式去匹配字符串，将匹配的结果放到 match-data中。（match-data 用于存储emacs中字符串模式匹配中的匹配结果） 让我们看一个例子吧！<span id="more-41421"></span></p>
<p>例 1：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41421code64'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4142164"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41421code64"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mystr <span style="color: #ff0000;">&quot;The quick fox jumped quickly.&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>string-match <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>(qu<span style="color: #000099; font-weight: bold;">\\</span>)<span style="color: #000099; font-weight: bold;">\\</span>(ick<span style="color: #000099; font-weight: bold;">\\</span>)&quot;</span>
                   mystr<span style="color: #66cc66;">&#41;</span>   <span style="color: #66cc66;">=&gt;</span>副作用：将匹配结果存储到match-data中</pre></td></tr></table></div>

<p>
这条语句的意思是：用\(qu\)\(ick\) 模式对mystr进行搜索，将匹配的结果存储，并且也存储分组1\(qu\) 和分组2 \(ick\)的匹配结果。
</p>
<p>
那么怎么取出匹配的结果呢？ 答案是使用 match-string</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('p41421code65'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4142165"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41421code65"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>match-string <span style="color: #cc66cc;">0</span> mystr<span style="color: #66cc66;">&#41;</span>      <span style="color: #66cc66;">=&gt;</span>结果为quick，也就是模式匹配的结果
<span style="color: #66cc66;">&#40;</span>match-string <span style="color: #cc66cc;">1</span> mystr<span style="color: #66cc66;">&#41;</span>      <span style="color: #66cc66;">=&gt;</span>结果为qu   ，也就是第一个分组的匹配结果
<span style="color: #66cc66;">&#40;</span>match-string <span style="color: #cc66cc;">2</span> mystr<span style="color: #66cc66;">&#41;</span>      <span style="color: #66cc66;">=&gt;</span>结果为ick  ，也就是第二个分组的匹配结果</pre></td></tr></table></div>

<p>string-match 是用正则表达式去搜索字符串的，如果你想替换字符串，那怎么办呢？ 那就要用到replace-regexp-in-string。
</p>
<p>
replace-regexp-in-string 函数：
</p>
<p>
用指定的正则表示式对字符串去搜索，将搜索到的模式用指定的字符串对原字符串进行替换。这个函数是非破坏性的，不会将你的原字符串破坏，函数返回的结果就是替换结果。<br />
例1 ：<br />
假如你想将&#8221;d:/gnu/&#8221; 替换为&#8221;d:\\gnu\\&#8221; ，你可以这样写：
</p>

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

<p>
那么为什么将替代字符串写成\\\\,而不是\\  ？ 实际上在emacs的正则表示式中，\\\\才代表一个\,而emacs的普通字符串中\\代表\ 。
</p>
<p>
问题1：emacs 的正则表示达式中\太多了，能不能用个函数将\(hello\) 转化为\\(hello\\) ?<br />
答案 ：我也想知道！在emacs 中，我还没找到哪个函数能将“\(hello\)&#8221;转化为&#8221;\\(hello\\)&#8221;，这是字符串转义的缘故。我只能用一个比较拙劣的方法来帮助我写emacs style regexp ——用一段perl代码：
</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('p41421code67'); return false;">View Code</a> PERL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4142167"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41421code67"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl</span>
<a href="http://perldoc.perl.org/functions/print.html"><span style="color: #000066;">print</span></a> <span style="color: #ff0000;">&quot;please input a raw regexp ,i will generic a emacs style regexp<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$str</span> <span style="color: #339933;">=</span><span style="color: #009999;">&lt;STDIN&gt;</span><span style="color: #339933;">;</span>
<span style="color: #0000ff;">$str</span> <span style="color: #339933;">=~</span> <span style="color: #009966; font-style: italic;">s/\\/\\\\/g</span><span style="color: #339933;">;</span>
<a href="http://perldoc.perl.org/functions/print.html"><span style="color: #000066;">print</span></a> <span style="color: #0000ff;">$str</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>
问题2：如果你想将^ . * $ 等特殊字符作为普通字符，你不想手动写成^ ,\\. 等形式，有什么办法帮助你吗？<br />
答 ：用 regexp-quote 函数。 例：(regexp-quote &#8220;^&#8221;) 自动生成&#8221;^&#8221;
</p>
<p>
问题3：如果你想用正则表达式表达搜索&#8221;hello&#8221; 或&#8221;world&#8221; ,你不想手动写成&#8221;hello\\|world&#8221;，有无简化的办法？<br />
答： regexp-opt 可以办到。  例：(regexp-opt &#8216;(&#8220;hello&#8221; &#8220;world&#8221;)) 输出了&#8221;\\(?:hello\\|world\\)&#8221;
</p>
<p>
让我们再次回到replace-regexp-in-string函数来，它的功能真的很强大，替代字符串中还可以引用分组<br />
例2 ： (replace-regexp-in-string &#8220;\\(hello\\)\\(world\\)&#8221; &#8220;\\2\\1&#8243; &#8220;helloworld&#8221;)<br />
这个表达式的意思是：用\(hello\)\(world\)模式对“helloworld”进行搜索，将搜索到的结果用“\\2\\1”进行替换。函数返回了&#8221;worldhello&#8221;
</p>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> hook类函数 </h3>
<div class="outline-text-3" id="text-2">
<p>
emacs 中存在大量的hook ，有emacs-lisp-mode-hook ，c-mode-hook 等，基本上一个mode就提供了一个hook 。那么hook的本质是什么，我们能不能设计一个自己的hook ？ 实际上，hook 是一个elisp 表，这个表中存放着要被调用的函数的符号(或代码）。<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('p41421code68'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4142168"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p41421code68"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defvar myhook <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;;定义myhook为空表</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'myhook '<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>insert <span style="color: #ff0000;">&quot;fun1 was called &quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">;;将这个匿名函数1加入到myhook表中去</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>add-hook 'myhook '<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>insert <span style="color: #ff0000;">&quot;fun2 was called &quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;;将匿名函数2加入myhook表中去</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>run-hooks 'myhook<span style="color: #66cc66;">&#41;</span> <span style="color: #808080; font-style: italic;">;; =&gt;执行这条语句会在光标后插入fun2 was called fun1 was called</span></pre></td></tr></table></div>

<p>那么为什么会先执行匿名函数2呢，而不是匿名函数1呢？这是因为add-hook 会将函数插入到myhook列表的头部，并且run-hooks 是从myhook头执行到尾的，因此匿名函数2会先执行。<br />
那么这样设计有什么好处呢？好处是比较明显的，比如用户执行了(add-hook &#8216;c-mode-hook &#8216;myfun),其中myfun是要修改了c-mode中的某个变量值的，但不巧的是，系统在此之前就执行了(add-hook &#8216;c-mode-hook &#8216;firstfun),并且firstfun也要设置这个变量的值。那么通过这样设计，你的修改将不会成功（因为你的修改会被系统的系统覆盖），这样就保证了用户不能随意地改变mode的状态，保证了系统的稳定性。
</p>
<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('p41421code69'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4142169"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41421code69"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> myhook <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> myhook<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>      <span style="color: #808080; font-style: italic;">;; =&gt;丢弃myhook中的第一个函数</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> myhook <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">reverse</span> myhook<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #808080; font-style: italic;">;; =&gt;将myhook反转，改变函数执行的顺序</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> myhook <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>               <span style="color: #808080; font-style: italic;">;; =&gt;将myhook清空</span></pre></td></tr></table></div>

</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>
1、hi-lock-set-pattern 函数<br />
它的作用为在当前buffer中对匹配的模式应用用户指定的face<br />
我之前在text-mode 中打开outline-minor-mode，结果标题没有被高亮，经千辛万苦终于将问题解决，这得益于hi-lock-set-pattern函数。我是这样设置的：<br />
先定义一些face ，如下：</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('p41421code70'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4142170"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p41421code70"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defface cyan-face
  '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <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: #ff0000;">&quot;我自定义的cyan face&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defface yellow-face
  '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;yellow&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;我自定义的yellow face&quot;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defface magenta-face
  '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>class color<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;magenta&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;我自定义的magenta face&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>这些face 都是从ahei-face.el中的，那里面还有许多其他的face。
</p>
<p>
然后然加入下面的代码，让outline-minor-mode启动时执行hi-lock-set-pattern，将标题高亮。</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('p41421code71'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4142171"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41421code71"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>add-hook 'outline-minor-mode-hook
          '<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span>hi-lock-set-pattern <span style="color: #ff0000;">&quot;^<span style="color: #000099; font-weight: bold;">\\</span>*[^*]*?$&quot;</span> 'cyan-face<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span>hi-lock-set-pattern <span style="color: #ff0000;">&quot;^<span style="color: #000099; font-weight: bold;">\\</span>*<span style="color: #000099; font-weight: bold;">\\</span>*[^*]*?$&quot;</span> 'yellow-face<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span>hi-lock-set-pattern <span style="color: #ff0000;">&quot;^<span style="color: #000099; font-weight: bold;">\\</span>*<span style="color: #000099; font-weight: bold;">\\</span>*<span style="color: #000099; font-weight: bold;">\\</span>*[^*]*?$&quot;</span> 'magenta-face<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>2、hi-lock-unface-buffer<br />
既然有高亮的函数，就应该有取消高亮的函数，它就是hi-lock-unface-buffer了
</p>
</div>
</div>
<div id="outline-container-4" class="outline-3">
<h3 id="sec-4"><span class="section-number-3">4</span> 编译类函数 </h3>
<div class="outline-text-3" id="text-4">
<p>complie 函数非常强大，它的参数是个编译命令字符串，它会执行这个编译命令，执行完后会打开一个buffer，其主模式为compilation-mode。如果编译出错，会在它打开的buffer中输出出现错误的行数，这时就可以通过点击鼠标跳转到发生错误的代码处。如果编译成功，则会输出编译结果。<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('p41421code72'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4142172"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41421code72"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>compile <span style="color: #ff0000;">&quot;gcc hello.c&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>compile <span style="color: #ff0000;">&quot;c++ hello.cpp&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>compile <span style="color: #ff0000;">&quot;perl hello.pl&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>compile <span style="color: #ff0000;">&quot;d:/python/python25.exe hello.py&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</p>
</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>下面我会用一个例子将上面所讲的大部分函数串起来。<br />
需求 ：我想实现按f5就能编译当前buffer，并且要有错误定位功能，支持的语言可以添加（不要修改已经写好的代码）<br />
实际环境：window xp ，cygwin<br />
由于使用的是cygwin，调用gcc 时，gcc 需要cygwin类型的路径<br />
这是emacs 给出的路径类型： d:/gnu/<br />
在cygwin下是          ：/cygdirve/d/gnu
</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('p41421code73'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4142173"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
</pre></td><td class="code" id="p41421code73"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;;这个函数就是用来转换路径的</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> change-to-cygwin-style-path <span style="color: #66cc66;">&#40;</span>emacs-style-path-on-w32<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>full-path emacs-style-path-on-w32<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>replace-regexp-in-string <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\\</span>(<span style="color: #000099; font-weight: bold;">\\</span>w+?<span style="color: #000099; font-weight: bold;">\\</span>):<span style="color: #000099; font-weight: bold;">\\</span>(<span style="color: #000099; font-weight: bold;">\\</span>w*<span style="color: #000099; font-weight: bold;">\\</span>)&quot;</span> <span style="color: #ff0000;">&quot;/cygdrive/<span style="color: #000099; font-weight: bold;">\\</span>1<span style="color: #000099; font-weight: bold;">\\</span>2&quot;</span> full-path<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>change-to-cygwin-style-path <span style="color: #66cc66;">&#40;</span>buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>defvar my-compile-hook <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;这是主函数，按f5执行此函数</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> my-compile-main-fun <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>run-hooks  'my-compile-hook<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;这个函数用来编译现在用得到的语言写的代码，以后如果要用到其他语言，可以写个函数，然后加入到my-compile-hook中去。</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> orginal-compile-fun <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
   <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>mode major-mode<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>compstr <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cond</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> mode 'c-mode<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> compstr <span style="color: #66cc66;">&#40;</span>concat <span style="color: #ff0000;">&quot;gcc -std=<span style="color: #000099; font-weight: bold;">\&quot;</span>c99<span style="color: #000099; font-weight: bold;">\&quot;</span> &quot;</span> <span style="color: #66cc66;">&#40;</span>change-to-cygwin-style-path <span style="color: #66cc66;">&#40;</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;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> mode 'c++-mode<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> compstr <span style="color: #66cc66;">&#40;</span>concat <span style="color: #ff0000;">&quot;c++  &quot;</span> <span style="color: #66cc66;">&#40;</span>change-to-cygwin-style-path <span style="color: #66cc66;">&#40;</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;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> mode 'emacs-lisp-mode<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span>emacs-lisp-byte-compile<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> mode 'python-mode<span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> compstr <span style="color: #66cc66;">&#40;</span>concat <span style="color: #ff0000;">&quot;python &quot;</span> <span style="color: #66cc66;">&#40;</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;">&#41;</span>
      <span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">or</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> mode 'cperl-mode<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">eq</span> mode 'perl-mode<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> compstr <span style="color: #66cc66;">&#40;</span>concat <span style="color: #ff0000;">&quot;D:/Perl/bin/perl.exe &quot;</span> <span style="color: #66cc66;">&#40;</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;">&#41;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>save-buffer<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> compstr 
    <span style="color: #66cc66;">&#40;</span>compile compstr<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;;将orginal-compile-fun加入my-compile-hook中</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'my-compile-hook 'orginal-compile-fun<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;;将my-compile-main-fun 绑定到f5上</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>f5<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span> 'my-compile-main-fun<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>如果有一天，你要用octave 语言，你可以这样扩展：</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('p41421code74'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4142174"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41421code74"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>add-hook 'my-compile-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><span style="color: #b1b100;">eq</span> major-mode 'octave-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>save-buffer<span style="color: #66cc66;">&#41;</span>
                                    <span style="color: #66cc66;">&#40;</span>compile <span style="color: #66cc66;">&#40;</span>concat <span style="color: #ff0000;">&quot;octave --silent &quot;</span> <span style="color: #66cc66;">&#40;</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;">&#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>使用hook机制是不是很方便呀，这样就不用去修改orginal-compile-fun的代码了。
</p>
<p>
ps：不知不觉罗嗦了这么多，其实我写这篇文章的目的有两个：1、是给初学emacs lisp的人介绍一下emacs字符串的操作和hook的机理以及强大的compile函数，希望有点用处。2、希望高手们也分享一下自己觉得很强大的emacs lisp 函数。
</p>
</div>
</div>
<div id="postamble">
</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/some-elisp-fun.htm' t='介绍一些Emacs功能强大的函数' d='' tag='ahei,C,Emacs,face,lambda,org,python,光标,配色,配色,鼠标' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/torture-emacs.htm" title="折腾Emacs (2010年08月17日)">折腾Emacs</a> (62)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (164)</li>
	<li><a href="http://emacser.com/emacs-beginner-must-know.htm" title="Emacs初学者必知必会 (2010年01月24日)">Emacs初学者必知必会</a> (5)</li>
	<li><a href="http://emacser.com/eval-after-load.htm" title="用eval-after-load避免不必要的elisp包的加载 (2010年04月9日)">用eval-after-load避免不必要的elisp包的加载</a> (19)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (111)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/some-elisp-fun.htm/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Emacs版衫</title>
		<link>http://emacser.com/emacs-tshirt.htm</link>
		<comments>http://emacser.com/emacs-tshirt.htm#comments</comments>
		<pubDate>Sat, 29 May 2010 03:56:20 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[资讯]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[版衫]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41399</guid>
		<description><![CDATA[需要Emacs T-shirt的同志快去水木Emacs版去预定和投票啊! 


	相关日志
	
	高亮C的所有变量和函数 (43)
	针对Emacs中文本编辑的编程简介 (2)
	致Emacs初学者 (56)
	自定义Emacs工具栏 (21)
	用性感的尾巴highlight-tail标记最近的修改 (34)


]]></description>
			<content:encoded><![CDATA[<p>需要Emacs T-shirt的同志快去水木Emacs版去<a href="http://www.newsmth.net/bbscon.php?bid=573&amp;id=88600&amp;ftype=11" target="_blank">预定</a>和<a href="http://www.newsmth.net/bbscon.php?bid=573&amp;id=88753&amp;ftype=11" target="_blank">投票</a>啊! <span id="more-41399"></span></p>

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-tshirt.htm' t='Emacs版衫' d='' tag='Emacs,版衫' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (43)</li>
	<li><a href="http://emacser.com/edit-in-elisp.htm" title="针对Emacs中文本编辑的编程简介 (2010年03月6日)">针对Emacs中文本编辑的编程简介</a> (2)</li>
	<li><a href="http://emacser.com/to-emacs-beginner.htm" title="致Emacs初学者 (2009年11月30日)">致Emacs初学者</a> (56)</li>
	<li><a href="http://emacser.com/emacs-toolbar.htm" title="自定义Emacs工具栏 (2010年06月9日)">自定义Emacs工具栏</a> (21)</li>
	<li><a href="http://emacser.com/highlight-tail.htm" title="用性感的尾巴highlight-tail标记最近的修改 (2010年02月26日)">用性感的尾巴highlight-tail标记最近的修改</a> (34)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-tshirt.htm/feed</wfw:commentRss>
		<slash:comments>27</slash:comments>
		</item>
		<item>
		<title>用Mew收发邮件</title>
		<link>http://emacser.com/mew.htm</link>
		<comments>http://emacser.com/mew.htm#comments</comments>
		<pubDate>Fri, 21 May 2010 02:11:38 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[Email]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[ahei]]></category>
		<category><![CDATA[autoload]]></category>
		<category><![CDATA[bigclean]]></category>
		<category><![CDATA[control]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[mew]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[补全]]></category>
		<category><![CDATA[邮件客户端]]></category>
		<category><![CDATA[配色]]></category>

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

简介
最近也是学习缘故，才重新开始使用邮件列表，只是邮箱里的邮件已经堆积如山了。邮件客户端的选择余地很大，有跨平台的 thunderbird，也有 evolution。emacs 上的邮件客户端有强大的 gnus，但是 gnus 的跨平台性不是很好，太依赖 linux 工具，在 windows 上的配置也比较繁琐。gnus 是单线程的程序，感觉作为新闻阅读器更合适。没有选用 mutt 作为客户端，也是配置繁琐所致，曾经尝试过几次但都失败了。
几番搜索比较后，选择了 mew 作为邮件客户端，一如所有的 emacs 的插件，强大和无穷的定制性。

强大的过滤器定制，在 mew 中称为 refile。而且 mew 自动 refile 还是比较准确和人性化的。
mew 是日本人的作品。因此相比 gnus 对 cjk 的支持要完善。
mew 内建的丰富模式，一共六种，有 summary, virtual meaaage, draft, header, edit, addrbook mode。
mew 的配色相比 gnus 实在是非常的舒服，也是最初吸引自己的原因。

安装
mew 的安装在 linux 下很简单，如果是 gentoo 的话，可以直接通过命令&#8221;emerge app-emacs/mew&#8221; 安装。如果是想要自己来管理各个 elisp 拓展，那可以通过 autotools 进行安装，更推荐前者。
mew 在 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="about.htm#bigclean" target="_blank"><span style="color: #0000ff;"><b>bigclean</b></span></a></p>
<p><img class="alignright" title="Mew" src="screenshots/mew-logo.gif" width="160" height="80"/></p>
<h3>简介</h3>
<p>最近也是学习缘故，才重新开始使用邮件列表，只是邮箱里的邮件已经堆积如山了。邮件客户端的选择余地很大，有跨平台的 <a href="http://www.mozillamessaging.com/" target="_blank">thunderbird</a>，也有 <a href="http://projects.gnome.org/evolution/" target="_blank">evolution</a>。<a href="http://www.gnu.org/software/emacs/" target="_blank">emacs</a> 上的邮件客户端有强大的 <a href="http://www.gnus.org/" target="_blank">gnus</a>，但是 gnus 的跨平台性不是很好，太依赖 linux 工具，在 windows 上的配置也比较繁琐。gnus 是单线程的程序，感觉作为新闻阅读器更合适。没有选用 <a href="http://www.mutt.org/" target="_blank">mutt</a> 作为客户端，也是配置繁琐所致，曾经尝试过几次但都失败了。<span id="more-41385"></span></p>
<p>几番搜索比较后，选择了 <a href="http://www.mew.org/en/" target="_blank">mew</a> 作为邮件客户端，一如所有的 emacs 的插件，强大和无穷的定制性。</p>
<ul>
<li>强大的过滤器定制，在 mew 中称为 refile。而且 mew 自动 refile 还是比较准确和人性化的。</li>
<li>mew 是日本人的作品。因此相比 gnus 对 cjk 的支持要完善。</li>
<li>mew 内建的丰富模式，一共六种，有 summary, virtual meaaage, draft, header, edit, addrbook mode。</li>
<li>mew 的配色相比 gnus 实在是非常的舒服，也是最初吸引自己的原因。</li>
</ul>
<h3>安装</h3>
<p>mew 的安装在 linux 下很简单，如果是 gentoo 的话，可以直接通过命令&#8221;emerge app-emacs/mew&#8221; 安装。如果是想要自己来管理各个 elisp 拓展，那可以通过 autotools 进行安装，更推荐前者。</p>
<p>mew 在 windows 的安装上比较折腾，不得不说， emacs 在 windows 上使用要辛苦的多。具体的安装可以参考 mew 的文档，如果要使用 mew 的 ssl 加密连接功能，必须要安装 stunnel3 版本，而且需要openssl 的支持。</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('p41385code82'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4138582"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41385code82"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string-<span style="color: #b1b100;">equal</span> system-type <span style="color: #ff0000;">&quot;windows-nt&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #808080; font-style: italic;">;; Note,in windows,you must use replace stunnel4 with stunnel3 version.</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mew-prog-ssl  <span style="color: #ff0000;">&quot;C:/Program Files/stunnel/stunnel.exe&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mew-prog-ssl <span style="color: #ff0000;">&quot;/usr/bin/stunnel&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<h3>配置</h3>
<p>mew 的 初始化必要代码建议写入 ~/.emacs 文件中，而 mew 单独的配置建议保存在 ~/.mew.el 文件中，mew 在启动时会读取此文件中的配置内容。</p>
<h4>初始化配置</h4>
<p>安装完之后还需要在 ~/.emacs 文件中加入如下必要代码以告诉 emacs 如何启动 mew。</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('p41385code83'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4138583"><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="p41385code83"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>autoload 'mew <span style="color: #ff0000;">&quot;mew&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>autoload 'mew-send <span style="color: #ff0000;">&quot;mew&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Optional setup (Read Mail menu for Emacs 21):</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">boundp</span> 'read-mail-command<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> read-mail-command 'mew<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; Optional setup (e.g. C-xm for sending a message):</span>
<span style="color: #66cc66;">&#40;</span>autoload 'mew-user-agent-compose <span style="color: #ff0000;">&quot;mew&quot;</span> <span style="color: #b1b100;">nil</span> t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">boundp</span> 'mail-user-agent<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mail-user-agent 'mew-user-agent<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>fboundp 'define-mail-user-agent<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>define-mail-user-agent
      'mew-user-agent
      'mew-user-agent-compose
      'mew-draft-send-message
      'mew-draft-kill
      'mew-send-hook<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<h4>帐号设置</h4>
<p>对于邮件服务的设置，在 mew 中即被映射为对 mailbox 的设置，mew 中对于邮件的组织是通过 mailbox 完成的。相应的有 3 种类型的 mailbox，分别表示着local/pop/imap/nntp/，即不同的邮件箱对应着不同的邮件协议，通过变量proto 进行设置。</p>
<p>包含邮件的 mailbox 在 mew 中被称为 folder，而 folder 的名称由两部分组成：proto + string。proto 相应的有三种类型，分别以 +/$/%/- 对应着local/pop/imap/nntp, 如 +inbox 即为最典型的 folder。相应的 mew 的文件夹分为两类，本地 folder 和 远程 folder，本地 folder 有四种类型，+inbox/+draft/+quene/+postq。远程 folder 根据协议既可以分为三种类型，$folder/%folder/-folder，如$inbox/%inbox/-fj.mail.reader.mew。</p>
<p>mew 对多账户的支持很好，可以支持 imap/pop3/nntp/local，可以通过 mew-config-alist变量进行非常灵活而强大的设置。如以下即为 gmail 的设置样例。</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('p41385code84'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4138584"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
</pre></td><td class="code" id="p41385code84"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mew-config-alist
      '<span style="color: #66cc66;">&#40;</span>
         <span style="color: #808080; font-style: italic;">;; Default fetch mailbox is IMAP</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;default&quot;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;mailbox-type&quot;</span>         <span style="color: #66cc66;">.</span> imap<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;proto&quot;</span>                <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;%&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;imap-server&quot;</span>          <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;imap.gmail.com&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;imap-ssl&quot;</span>             <span style="color: #66cc66;">.</span> t<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;imap-user&quot;</span>            <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;imapuser@gmail.com&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;name&quot;</span>                 <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;name&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;user&quot;</span>                 <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;user&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;mail-domain&quot;</span>          <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;gmail.com&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;imap-ssl-port&quot;</span>        <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;993&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;imap-size&quot;</span>            <span style="color: #66cc66;">.</span> <span style="color: #cc66cc;">0</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;imap-delete&quot;</span>          <span style="color: #66cc66;">.</span> t<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;smtp-ssl&quot;</span>             <span style="color: #66cc66;">.</span> t<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;smtp-auth-list&quot;</span>       <span style="color: #66cc66;">.</span> <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;PLAIN&quot;</span> <span style="color: #ff0000;">&quot;LOGIN&quot;</span> <span style="color: #ff0000;">&quot;CRAM-MD5&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> 
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;smtp-user&quot;</span>            <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;smtpuser@gmail.com&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;smtp-server&quot;</span>          <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;smtp.gmail.com&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;smtp-ssl-port&quot;</span>        <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;465&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
         <span style="color: #808080; font-style: italic;">;; mailbox POP3 for mailinglist</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;mailinglist&quot;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;mailbox-type&quot;</span>         <span style="color: #66cc66;">.</span> pop<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;proto&quot;</span>                <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;+&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;pop-server&quot;</span>           <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;pop.gmail.com&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;pop-ssl&quot;</span>              <span style="color: #66cc66;">.</span> t<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;name&quot;</span>                 <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;username&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;user&quot;</span>                 <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;user&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;mail-domain&quot;</span>          <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;gmail.com&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;pop-auth&quot;</span>             <span style="color: #66cc66;">.</span> pass<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;pop-user&quot;</span>             <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;popuser@gmail.com&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;pop-ssl-port&quot;</span>         <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;995&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;smtp-user&quot;</span>            <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;smtpuser@gmail.com&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;smtp-ssl&quot;</span>             <span style="color: #66cc66;">.</span> t<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;smtp-server&quot;</span>          <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;smtp.gmail.com&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;smtp-ssl-port&quot;</span>        <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;465&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<h4>引用，回复与签名档</h4>
<p>mew 可以灵活的设置如何引用邮件上下文，定制引用的格式。mew的引用是由变量mew-cite-fields 控制，有 From，Subject，Date域，具体的引用样式由 mew-cite-format 设置。mew 默认的配置如下：</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('p41385code85'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4138585"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41385code85"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defvar mew-cite-fields '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;From:&quot;</span> <span style="color: #ff0000;">&quot;Subject:&quot;</span> <span style="color: #ff0000;">&quot;Date:&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defvar mew-cite-format <span style="color: #ff0000;">&quot;From: %s<span style="color: #000099; font-weight: bold;">\n</span>Subject: %s<span style="color: #000099; font-weight: bold;">\n</span>Date: %s<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defvar mew-cite-prefix <span style="color: #ff0000;">&quot;&gt; &quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>如果需要修改为 Gmail 的引用格式，可以只选择 From 和 Date 域，然后修改mew-cite-format 即可。</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('p41385code86'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4138586"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p41385code86"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mew-cite-fields '<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Date:&quot;</span>  <span style="color: #ff0000;">&quot;From:&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mew-cite-format <span style="color: #ff0000;">&quot;On %s %s wrote:<span style="color: #000099; font-weight: bold;">\n</span><span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>如何回复，回复的位置，大概是邮件中争论最多的地方。基本上所有邮件的 web客户端，Gmail，outlook 都默认使用上回复(top-posting)，但是邮件列表和新闻组(usenet)提倡下回复(bottom-posting)，在一个社区中使用“错误”的风格，可能被视作严重违反网络礼仪，从而遭致社区成员的激烈反应。可以参考 <a href="http://en.wikipedia.org/wiki/Posting_style/" target="_blank">wiki</a> 和 <a href="http://www.woodpecker.org.cn:9081/classes/050730-CPUG/usMaillist/" target="_blank">python的邮件列表规范和礼节</a>。</p>
<p>回到 mew 的设置，通过设置变量 mew-summary-reply-with-citation-position可以选择是使用上回复或是下回复。如果设置为 body，即回复出现在引文之前，名为上回复，如设置为 end，在引文后回复，使用下回复样式。</p>
<p>mew 默认使用的邮件签名档位于 ~/.signature 文件，由变量 mew-signature-file控制，快捷键 ‘C-cTAB’ 会在光标处插入签名档。建议将签名档放置在邮件的末尾，可以通过 mew-signature-as-lastpart’ 与 ‘mew-signature-insert-last’设置。如果需要在撰写或是回复邮件时，需要自动插入签名档，可以通过mew-draft-mode-newdraft-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('p41385code87'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4138587"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41385code87"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mew-signature-file <span style="color: #ff0000;">&quot;~/Mail/signature&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mew-signature-as-lastpart t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mew-signature-insert-<span style="color: #b1b100;">last</span> t<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'mew-before-cite-hook 'mew-header-goto-body<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>add-hook 'mew-draft-mode-newdraft-hook 'mew-draft-insert-signature<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<h4>refile</h4>
<p>对于邮件列表和新闻组，邮件过滤和 thread 功能是不可或缺的。mew 的邮件过滤功能，或是 mew 的术语称谓的 refile 很强大而实用。refile 功能对于pop 邮箱而言非常实用，gmail 的 imap 由于可以使用 filter 与 label 的组合，也非常的完美。</p>
<p>如果为设置任何的 refile rules，在 summary-mode 里面按 o 即可对当前邮件进行分类，mew 会问你把邮件分类到哪个文件夹里面去，并提供了一个默认的选项，通常情况下默认选项就是正确的选项，所以直接回车就可以了。</p>
<p>虽然 mew 的 refil-by-guess 很方便，但是更加使用的还是自定义 refile rules。<br />
mew 提供的 refile 非常丰富，但感觉实用可定性好的还是 Guess by user defined rules。例如，如果你订阅了 octave，freebsd 的帮助邮件列表，很自然的会需要把此三个邮件列表的邮件分开存放在不同的本地文件下，而通常的邮件会存放到 inbox folder。相应的只需要把邮件头的 To 和 Cc 域里包含有 &#8220;@octave.org&#8221;的邮件 refile 到 +math/octave 文件夹中，同时把 To 和 Cc 域里含有&#8221;@freebsd.org&#8221;的邮件 refile 到 +unix/freebsd，就可以使用如下的实例代码。<br />
更详尽的 refile rules 可以参考 mew 的使用手册。</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('p41385code88'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4138588"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p41385code88"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> mew-refile-guess-alist
      '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;To:&quot;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;@octave.org&quot;</span>                       <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;+math/octave&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;@freebsd.org&quot;</span>                      <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;+unix/freebsd&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;Cc:&quot;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;@octave.org&quot;</span>                       <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;+math/octave&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;@freebsd.org&quot;</span>                      <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;+unix/freebsd&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
        <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">nil</span> <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;+inbox&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;">setq</span> mew-refile-guess-control
      '<span style="color: #66cc66;">&#40;</span>mew-refile-guess-by-folder
        mew-refile-guess-by-alist<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>完成 refile rules 后，在收取邮件后，按下 &#8216;M-o&#8217; 即可对当前 mode 下的邮件按照定义的 rules 进行 refile。然后，你想要查阅 octave 邮件列表，只需要按下 &#8216;g&#8217; 与 &#8216;+math/octave&#8217;，就可以切换到 octave 文件夹，此时再按下 &#8216;tt&#8217;，既可以进入 mew 提供的 thread 功能，此时的 mode 称为 virtual folder mode，mew 会指示出各个邮件之间的层次关系，非常方便。</p>
<h3>使用folder</h3>
<p>在邮件服务设置完成后，就需要获取远程的邮件到本地的 +inbox folder。当输入&#8217;M-x mew&#8217;，mew 会依据 &#8216;mew-mailbox-type&#8217; 获取相应协议的邮件。但此时 位于summary 模式时，只需输入 &#8216;i&#8217; 即可。如果用 mew 处理邮件一段时间后，需要再查收远程 folder 上的邮件，试试 &#8217;s&#8217; 快捷键。对于 IMAP 和 NetNews，更加建议使用 &#8217;s&#8217;，而非 &#8216;i&#8217;。当按下 &#8217;s&#8217; 时，mew 会向你询问 range，一般而言输入&#8217;sync&#8217; 比较合适，这会同步本地 folder，即删除已在远程服务器上删除的邮件和收取新接受的邮件。当使用 &#8216;C-u s&#8217;快捷键时，可以在仅获取邮件头和获取完整邮件信息间切换，相应的这是由诸如 &#8216;mew-pop-header-only&#8217; 变量定义的。对于邮件列表和新闻组而言，跟推荐获取完整的邮件信息，刻意离线查阅，非常方便。</p>
<p>使用 Gmail IMAP 非常方便，使用 mew 配合 Gmail 的 filter 与 label 可以对邮件进行很有效的管理。如你当下在 %inbox，如果需要切换到 &#8216;All sent&#8217;，只需要输入 &#8216;g&#8217;，然后输入 &#8216;%[Gmail]/All Mail&#8217; 或者使用 mew 提供方便的自动补全机制。mew 使用 folder 管理邮件，而在各个 folder 进行切换的快捷键既是方便的 &#8216;g&#8217;。</p>
<p>mew 也提供了方便的对多账户进行使用与切换的功能。以如上的账户设置为例，在如上设置了两个 &#8220;cases&#8221;: &#8220;default&#8221;,&#8221;mailinglist&#8221;。如果当前的 case 为dafault， mew 即为按照 default 的设置，即此时以 imapuser 按照 IMAP 协议收取邮件。而如果你想要切换至 mailinglist 时，只需要使用快捷键 &#8216;C&#8217;，输入mailinglist 即可，此时 mew 即会使用 popuser 帐号以 pop 协议收取邮件。在启动 mew 时，默认使用 default 此 case。</p>
<h3>快捷键</h3>
<p>mew 的日常使用可以通过各种 mode 上的菜单完成，但使用快捷键也非常方便。</p>
<table border="1">
<tr>
<td>w</td>
<td>撰写新邮件</td>
</tr>
<tr>
<td>a</td>
<td>回复邮件，不带引用</td>
</tr>
<tr>
<td>A</td>
<td>回复邮件，带引用</td>
</tr>
<tr>
<td>f</td>
<td>转发邮件</td>
</tr>
<tr>
<td>r</td>
<td>重新发送邮件</td>
</tr>
<tr>
<td>SPC</td>
<td>阅读邮件</td>
</tr>
<tr>
<td>y</td>
<td>保存文件（可以保存信件全文、信件正文、附件）</td>
</tr>
<tr>
<td>C-c C-l</td>
<td>转换当前邮件的编码格式</td>
</tr>
<tr>
<td>C-c C-a</td>
<td>加入地址薄</td>
</tr>
<tr>
<td>C-u C-c C-a</td>
<td>比 <em>C-c C-a</em> 多加入昵称和名字</td>
</tr>
<tr>
<td>C-c C-q</td>
<td>不保存退出</td>
</tr>
<tr>
<td>C-c C-a</td>
<td>准备插入附件</td>
</tr>
<tr>
<td>mew-attach-copy</td>
<td>用复制方式加入附件</td>
</tr>
<tr>
<td>mew-attach-link</td>
<td>用链接方式加入附件</td>
</tr>
<tr>
<td>mew-attach-delete</td>
<td>删除附件</td>
</tr>
<tr>
<td>C-c C-c</td>
<td>发送邮件</td>
</tr>
<tr>
<td>C-c RET</td>
<td>保存邮件到发送队列</td>
</tr>
<td>C</td>
<td>如果设置了多个邮箱，用 C 命令切换</td>
</tr>
<tr>
<td>Q</td>
<td>退出Mew</td>
</table>

<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/mew.htm' t='用Mew收发邮件' d='' tag='ahei,autoload,bigclean,control,Emacs,mew,org,python,screenshot,windows,光标,插件,补全,邮件客户端,配色,配色' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/to-emacs-beginner.htm" title="致Emacs初学者 (2009年11月30日)">致Emacs初学者</a> (56)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (111)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (164)</li>
	<li><a href="http://emacser.com/emacs-beginner-must-know.htm" title="Emacs初学者必知必会 (2010年01月24日)">Emacs初学者必知必会</a> (5)</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> (69)</li>
</ul>

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

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

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

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

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



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


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




绘制操作（鼠标左键）



操作
无shift
shift


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


Line
任意方向的线
直线


Rectangle
矩形
正方形1


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


Ellipses
椭圆
圆2


Text
文本
覆盖式文本


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


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


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


Cut
剪切矩形
剪切正方形


copy
复制矩形
复制正方形


paste
粘贴
粘贴


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



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



设定选项
含义


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


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


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


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


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



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

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



命令
功能


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


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


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


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


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


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


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


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


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



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



情况
作用


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


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


擦除字符时
开关橡皮功能


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


粘贴时
粘贴动作



箭头命令



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


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



选择操作



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


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


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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/artist-mode.htm' t='用artist-mode画文本图' d='' tag='artist-mode,Emacs,emacser,emacser.com,irc,org,screenshot,截图,配色,鼠标' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (164)</li>
	<li><a href="http://emacser.com/emacs-ditaa.htm" title="Emacs中绘图 － ditaa篇 (2010年08月4日)">Emacs中绘图 － ditaa篇</a> (26)</li>
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (43)</li>
	<li><a href="http://emacser.com/emacs-toolbar.htm" title="自定义Emacs工具栏 (2010年06月9日)">自定义Emacs工具栏</a> (21)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (111)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/artist-mode.htm/feed</wfw:commentRss>
		<slash:comments>52</slash:comments>
		</item>
		<item>
		<title>高亮C的所有变量和函数</title>
		<link>http://emacser.com/zjl-c-hl.htm</link>
		<comments>http://emacser.com/zjl-c-hl.htm#comments</comments>
		<pubDate>Mon, 17 May 2010 01:19:37 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[C]]></category>
		<category><![CDATA[中级]]></category>
		<category><![CDATA[CEDET]]></category>
		<category><![CDATA[ede]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[face]]></category>
		<category><![CDATA[highlight]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[semantic]]></category>
		<category><![CDATA[zjl-c-hl]]></category>
		<category><![CDATA[截图]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[颜色]]></category>

		<guid isPermaLink="false">http://emacser.com/?p=41359</guid>
		<description><![CDATA[作者: nowait@smth



1 前言 
2 有图为证, 图个痛快 
3 install 
4 Feature 
5 缺陷 
6 可以customize的变量 
7 程序的骨干的说明-&#8212;给不满意效果想要自行修改代码的同志看的 

7.1 font-lock-add-keywords 
7.2 (add-hook hook &#8216;zjl-c-hl-init) 






1 前言 

emacs的代码语法加亮实在是做的不好,和source insight无法相比, 可能是以前没有集成cedet,不好分析语法的原因吧.我就自己写了一个山寨品来用. 之所以说这个文章里要介绍的这个zjl-c-hl.el是山寨的,是由于最重要的变量和参数加亮的实现原理是山寨的:用semantic得到单个函数的变量和参数list(这个还不算山寨),然后用highlight.el对函数范围内的变量和参数进行匹配加亮(就是这个就比较山寨). 我估计正常应该是用font-lock-add-keywords的高级功能来加亮,从而比较深的整合进emacs本身中. 不过我一直没有去深入的研究, 这个code也是按需要逐渐添加的. 虽然比较山寨,不过挺好用的. 下面是简单的介绍,很短, 看完了解了,有需要的朋友就可以拿来用了.




2 有图为证, 图个痛快 




3 install 

到这儿下载zjl-c-hl.el(以后应该wiki上面会有)http://code.google.com/p/dea/source/browse/trunk/lisps/zjl-c-hl.el
这个包里面使用了emacswiki上的highlight.el,从这儿下载:http://www.emacswiki.org/emacs/highlight.el
(require &#8216;zjl-c-hl)




4 Feature 



支持c文件, 如果是.cpp文件,内部实际是c,也可以:), 那种实际是cpp的,估计把zjl-c-hl-c++-mode-enable-flag为妥.


加亮对象包括:局部变量,函数引用, 操作符,数字. 加亮的结果是还剩下的黑白字(默认face)部分的则一定是全局变量,宏或错误的局部变量(比如输入错误).


加亮过的区域,不会再被加亮一次,除非函数内部被修改(参见下一条), 这样cpu资源消耗不大


函数内部被修改后,进行局部(实际上是整个函数的)重新加亮. 具体表现为,就是随着代码输入,延时1-3秒加亮.


颜色face可以customize,分为白背景和暗背景, 白背景的加亮face我尽量做成了source insight的默认颜色, 暗背景的我目前也是用的和白背景一样的face&#8230;, 我自己没怎么用过暗背景,觉得现在的也可以接受, 所以用户如果对暗背景的默认颜色不满意可以有两个选择


自己默默的改得符合自己喜好


改好了之后, 把custom.el发给我







5 缺陷 [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://emacser.com/about.htm#nowait" target="_blank"><span style="color: #0000ff;"><b>nowait@smth</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 install </a></li>
<li><a href="#sec-4">4 Feature </a></li>
<li><a href="#sec-5">5 缺陷 </a></li>
<li><a href="#sec-6">6 可以customize的变量 </a></li>
<li><a href="#sec-7">7 程序的骨干的说明-&mdash;给不满意效果想要自行修改代码的同志看的 </a>
<ul>
<li><a href="#sec-7.1">7.1 font-lock-add-keywords </a></li>
<li><a href="#sec-7.2">7.2 (add-hook hook &#8216;zjl-c-hl-init) </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的代码语法加亮实在是做的不好,和source insight无法相比, 可能是以前没有集成cedet,不好分析语法的原因吧.我就自己写了一个山寨品来用. 之所以说这个文章里要介绍的这个zjl-c-hl.el是山寨的,是由于最重要的变量和参数加亮的实现原理是山寨的:用semantic得到单个函数的变量和参数list(这个还不算山寨),然后用highlight.el对函数范围内的变量和参数进行匹配加亮(就是这个就比较山寨). 我估计正常应该是用font-lock-add-keywords的高级功能来加亮,从而比较深的整合进emacs本身中. 不过我一直没有去深入的研究, 这个code也是按需要逐渐添加的. 虽然比较山寨,不过挺好用的. 下面是简单的介绍,很短, 看完了解了,有需要的朋友就可以拿来用了.<br />
<span id="more-41359"></span></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">
<div class="wp-caption alignnone" style="width: 160px"><a href="screenshots/zjl-c-hl.png" rel="lightbox"><img src="screenshots/thumbs/thumbs_zjl-c-hl.png"/></a><p class="wp-caption-text">zjl-c-hl效果截图</p></div>
</div>
</div>
<div id="outline-container-3" class="outline-3">
<h3 id="sec-3"><span class="section-number-3">3</span> install </h3>
<div class="outline-text-3" id="text-3">
<p>到这儿下载zjl-c-hl.el(以后应该wiki上面会有)<a href="http://code.google.com/p/dea/source/browse/trunk/lisps/zjl-c-hl.el" target="_blank">http://code.google.com/p/dea/source/browse/trunk/lisps/zjl-c-hl.el</a><br />
这个包里面使用了emacswiki上的highlight.el,从这儿下载:<a href="http://www.emacswiki.org/emacs/highlight.el" target="_blank">http://www.emacswiki.org/emacs/highlight.el</a><br />
(require &#8216;zjl-c-hl)
</p>
</div>
</div>
<div id="outline-container-4" class="outline-3">
<h3 id="sec-4"><span class="section-number-3">4</span> Feature </h3>
<div class="outline-text-3" id="text-4">
<ul>
<li>
支持c文件, 如果是.cpp文件,内部实际是c,也可以:), 那种实际是cpp的,估计把zjl-c-hl-c++-mode-enable-flag为妥.
</li>
<li>
加亮对象包括:局部变量,函数引用, 操作符,数字. 加亮的结果是还剩下的黑白字(默认face)部分的则一定是全局变量,宏或错误的局部变量(比如输入错误).
</li>
<li>
加亮过的区域,不会再被加亮一次,除非函数内部被修改(参见下一条), 这样cpu资源消耗不大
</li>
<li>
函数内部被修改后,进行局部(实际上是整个函数的)重新加亮. 具体表现为,就是随着代码输入,延时1-3秒加亮.
</li>
<li>
颜色face可以customize,分为白背景和暗背景, 白背景的加亮face我尽量做成了source insight的默认颜色, 暗背景的我目前也是用的和白背景一样的face&hellip;, 我自己没怎么用过暗背景,觉得现在的也可以接受, 所以用户如果对暗背景的默认颜色不满意可以有两个选择</p>
<ol>
<li>
自己默默的改得符合自己喜好
</li>
<li>
改好了之后, 把custom.el发给我</p>
</li>
</ol>
</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>没有能够准确辨识出全局变量,宏,和函数调用导致:
</p>
<ol>
<li>
函数名/全局变量如果书写错误,无法实时得知,只能等待编译时知晓.
</li>
<li>
全局变量没有加亮,不能够和宏定义区分, 不像source insight那样看的自然</p>
</li>
</ol>
</div>
</div>
<div id="outline-container-6" class="outline-3">
<h3 id="sec-6"><span class="section-number-3">6</span> 可以customize的变量 </h3>
<div class="outline-text-3" id="text-6">
<p>我直接从代码里面copy过来了,将就着看</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('p41359code91'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4135991"><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
</pre></td><td class="code" id="p41359code91"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>defcustom zjl-c-hl-c-mode-enable-flag t
    <span style="color: #ff0000;">&quot;*Enable c mode highlight when zjl-c-hl-disable-global-all is called&quot;</span>
     'zjl-c-hl<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defcustom zjl-c-hl-c++-mode-enable-flag t
    <span style="color: #ff0000;">&quot;*Enable c++ mode highlight when zjl-c-hl-disable-global-all is called.
Currently only c style file but named as *.cpp is supported&quot;</span>
    <span style="color: #66cc66;">:</span><span style="color: #555;">type</span> 'boolean <span style="color: #66cc66;">:</span><span style="color: #555;">group</span> 'zjl-c-hl<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defcustom zjl-c-hl-normal-size <span style="color: #cc66cc;">40000</span>
    <span style="color: #ff0000;">&quot;*The size of erea that zjl-c-hl can highlight without any delay.
You can improve this if your computer has enough performance.&quot;</span>
    <span style="color: #66cc66;">:</span><span style="color: #555;">type</span> '<span style="color: #b1b100;">integer</span> <span style="color: #66cc66;">:</span><span style="color: #555;">group</span> 'zjl-c-hl<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defcustom zjl-c-hl-toobig-size <span style="color: #cc66cc;">10000000</span>
    <span style="color: #ff0000;">&quot;*The threshold size of function that zjl-c-hl will stop to highlight since it is too big. &quot;</span>
    <span style="color: #66cc66;">:</span><span style="color: #555;">type</span> '<span style="color: #b1b100;">integer</span> <span style="color: #66cc66;">:</span><span style="color: #555;">group</span> 'zjl-c-hl<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defcustom zjl-c-hl-toobig-not-update-size <span style="color: #cc66cc;">1000000</span>
    <span style="color: #ff0000;">&quot;*The size of function that zjl-chl will stop to  highlight when the function is modified.&quot;</span>
    <span style="color: #66cc66;">:</span><span style="color: #555;">type</span> '<span style="color: #b1b100;">integer</span> <span style="color: #66cc66;">:</span><span style="color: #555;">group</span> 'zjl-c-hl<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defcustom zjl-c-hl-numberofscreen-to-hl-each-time <span style="color: #cc66cc;">2</span>
    <span style="color: #ff0000;">&quot;*The number of screens around current screen to highlight every time.&quot;</span>
    <span style="color: #66cc66;">:</span><span style="color: #555;">type</span> '<span style="color: #b1b100;">integer</span> <span style="color: #66cc66;">:</span><span style="color: #555;">group</span> 'zjl-c-hl<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defcustom zjl-c-hl-firstscreen-hl-toggle <span style="color: #b1b100;">nil</span>
    <span style="color: #ff0000;">&quot;*When not nil and when you open a new buffer, hl buffer before it shown on window.&quot;</span>
    <span style="color: #66cc66;">:</span><span style="color: #555;">type</span> 'boolean <span style="color: #66cc66;">:</span><span style="color: #555;">group</span> 'zjl-c-hl<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> 程序的骨干的说明-&mdash;给不满意效果想要自行修改代码的同志看的 </h3>
<div class="outline-text-3" id="text-7">
<p>入口函数是zjl-c-hl-enable-global-all, 这个函数根据c-mode/c++-mode分别调用zjl-c-hl-enable-global, zjl-c-hl-enable-global里面定义是
</p>
</div>
<div id="outline-container-7.1" class="outline-4">
<h4 id="sec-7.1"><span class="section-number-4">7.1</span> font-lock-add-keywords </h4>
<div class="outline-text-4" id="text-7.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('p41359code92'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4135992"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41359code92"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>font-lock-add-keywords
     mode
     zjl-c-hl-c-mode-keywords
     <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
zjl-c-hl-c-mode-keywords里面定义了operators, brackets, types, warning-words, number, member-reference, function-call, member-point加亮所需要的一切. 就是除了变量和参数加亮以外的所有的加亮靠这里实现
</p>
</div>
</div>
<div id="outline-container-7.2" class="outline-4">
<h4 id="sec-7.2"><span class="section-number-4">7.2</span> (add-hook hook &#8216;zjl-c-hl-init) </h4>
<div class="outline-text-4" id="text-7.2">
<p>加亮变量和参数,具体是挂载在window-scroll-functions这个hook来实现. 使用这个hook原因有两个
</p>
<ol>
<li>
避免semantic的后台自动load文件分析时也运行zjl-c-hl-init, 所以我们就需要有机制判断只有拥有window的buffer才会被执行zjl-c-hl.
</li>
<li>
每会用户scroll窗口的时候,也需要刷新新的位置的函数内部的加亮.
</li>
</ol>
<p>所以window-scroll-functions是很好的选择
</p>
<ul>
<li id="sec-7.2.1">(add-hook &#8216;window-scroll-functions &#8216;zjl-c-hl-window-scroll-hook t t) <br/>
<ul>
<li id="sec-7.2.1.1">如果是第一次运行这个hook则 <br/><br />
(add-hook &#8217;semantic-after-partial-cache-change-hook &#8216;zjl-c-hl-semantic-after-partial-cache-change-hook t t)  </p>
<p>
zjl-c-hl-semantic-after-partial-cache-change-hook(tags)的内容是
</p>
<ol>
<li>
semantic会把局部被更新的tags放在这个函数的调用参数里面, 里面包含了需要它重新分析过(由于buffer被修改导致的)的区域, 把这个区域标志为未加亮区域(具体是一个这样的list ((4 . 50) (100 . 300) (401 . 555)))
</li>
<li>
调用zjl-c-hl-window-scroll-hook,实时刷新一下当前窗口内容</p>
</li>
</ol>
</li>
<li id="sec-7.2.1.2">(run-with-idle-timer 0.5 nil &#8216;zjl-c-hl-timer-do-every-time (current-buffer)) <br/><br />
每次窗口移动后,用户idle时,加亮当前窗口内的变量和参数,具体是</p>
<ol>
<li>
设定范围A为当前窗口的前2个窗口的起始点所在的函数的开始和后2个窗口的末尾点所在的函数的结束
</li>
<li>
检查范围A中是否有没有被刷新的区域, 如果有找出来, 并分别加亮区域</p>
</li>
</ol>
<p>再之后,就是比较复杂的具体加亮,就不赘述了.
</p>
</li>
</ul>
</li>
</ul>
</div>
</div>
</div>
<div id="postamble">
</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/zjl-c-hl.htm' t='高亮C的所有变量和函数' d='' tag='C,CEDET,ede,Emacs,emacser,emacser.com,face,highlight,org,screenshot,semantic,zjl-c-hl,截图,配色,配色,颜色' 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> (164)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (111)</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> (69)</li>
	<li><a href="http://emacser.com/highlight-symbol.htm" title="Emacs才是世界上最强的IDE － 高亮光标处单词 (2009年11月27日)">Emacs才是世界上最强的IDE － 高亮光标处单词</a> (19)</li>
	<li><a href="http://emacser.com/emacs.htm" title="Emacs长啥样 (2009年11月5日)">Emacs长啥样</a> (1)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/zjl-c-hl.htm/feed</wfw:commentRss>
		<slash:comments>43</slash:comments>
		</item>
	</channel>
</rss>
