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

<channel>
	<title>Emacs中文网 &#187; 初级</title>
	<atom:link href="http://emacser.com/c-junior.htm/feed" rel="self" type="application/rss+xml" />
	<link>http://emacser.com</link>
	<description>没有我做不到的，只有你想不到的</description>
	<lastBuildDate>Thu, 17 May 2012 14:05:14 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>钗黛双收：若你也同Vim难割舍，却又看Emacs情切切</title>
		<link>http://emacser.com/vimvsemacs.htm</link>
		<comments>http://emacser.com/vimvsemacs.htm#comments</comments>
		<pubDate>Mon, 21 Feb 2011 02:48:45 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[学习Emacs]]></category>

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




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




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


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


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


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


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



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


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


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


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


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




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


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


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


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



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


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


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


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


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


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


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




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

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



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


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


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


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


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


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


惘于环肥燕瘦，颦怅蹙茫


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




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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/vimvsemacs.htm' t='钗黛双收：若你也同Vim难割舍，却又看Emacs情切切' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/vimvsemacs.htm/feed</wfw:commentRss>
		<slash:comments>95</slash:comments>
		</item>
		<item>
		<title>Emacs &amp; cflow 生成函数调用树</title>
		<link>http://emacser.com/emacs-cflow.htm</link>
		<comments>http://emacser.com/emacs-cflow.htm#comments</comments>
		<pubDate>Mon, 29 Nov 2010 02:16:36 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[小技巧]]></category>

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



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




1 Introduction to cflow 


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


GNU cflow is able to produce both direct and inverted flowgraphs for C sources. Optionally a cross-reference listing can
be generated. [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #0000ff;">作者: </span><a href="http://blog.163.com/vic_kk/blog/static/49470524201010180715177/" target="_blank"><span style="color: #0000ff;"><b>tubo</b></span></a></p>
<p>介绍 Emacs 中使用cflow制作函数的调用树<span id="more-41742"></span></p>
<div id="table-of-contents">
<div id="text-table-of-contents">
<ul>
<li><a href="#sec-1">1 Introduction to cflow </a></li>
<li><a href="#sec-2">2 Emacs &amp; cflow </a></li>
<li><a href="#sec-3">3 Links </a></li>
</ul>
</div>
</div>
<div id="outline-container-1" class="outline-3">
<h3 id="sec-1"><span class="section-number-3">1</span> Introduction to cflow </h3>
<div class="outline-text-3" id="text-1">
<p>
GNU cflow analyzes a collection of C source files and prints a graph, charting control flow within the program.
</p>
<p>
GNU cflow is able to produce both direct and inverted flowgraphs for C sources. Optionally a cross-reference listing can<br />
be generated. Two output formats are implemented: POSIX and GNU (extended).
</p>
<p>
Input files can optionally be preprocessed before analyzing.
</p>
<p>
The package also provides Emacs major mode for examining the produced flowcharts in Emacs.
</p>
<p>
以上内容取自 cflow 的网站: <a href="http://www.gnu.org/software/cflow/manual/html_node/Intro.html#Intro">http://www.gnu.org/software/cflow/manual/html_node/Intro.html#Intro</a>。
</p>
</div>
</div>
<div id="outline-container-2" class="outline-3">
<h3 id="sec-2"><span class="section-number-3">2</span> Emacs &amp; cflow </h3>
<div class="outline-text-3" id="text-2">
<p>
cflow 的代码包中提供了cflow-mode.el (cflow-1.3/elisp/cflow.el)，  该文件提供了 emacs 的 cflow-mode，<br />
用于显示 cflow 输出的内容，但该文件中并未提供自动生成指定函数的 call tree<br />
的功能，用起来多少有点不方便。
</p>
<p>
下面是一个简单的 elisp 函数，通过该函数可以为指定的函数生成调用树。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41742code2'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p417422"><td class="code" id="p41742code2"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'cflow-mode<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defvar cmd <span style="color: #b1b100;">nil</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defvar cflow-buf <span style="color: #b1b100;">nil</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>defvar cflow-buf-<span style="color: #b1b100;">name</span> <span style="color: #b1b100;">nil</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> yyc/cflow-<span style="color: #b1b100;">function</span> <span style="color: #66cc66;">&#40;</span>function-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Get call graph of inputed function. &quot;</span>
  <span style="color: #808080; font-style: italic;">;(interactive &quot;sFunction name:\n&quot;)</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> <span style="color: #66cc66;">&#40;</span>senator-jump-interactive <span style="color: #ff0000;">&quot;Function name: &quot;</span>
                                                    <span style="color: #b1b100;">nil</span> <span style="color: #b1b100;">nil</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> cmd <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;cflow  -b --main=%s %s&quot;</span> function-<span style="color: #b1b100;">name</span> buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> cflow-buf-<span style="color: #b1b100;">name</span> <span style="color: #66cc66;">&#40;</span>format <span style="color: #ff0000;">&quot;**cflow-%s:%s**&quot;</span>
                               <span style="color: #66cc66;">&#40;</span>file-name-nondirectory buffer-file-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span>
                               function-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> cflow-buf <span style="color: #66cc66;">&#40;</span>get-buffer-create cflow-buf-<span style="color: #b1b100;">name</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>set-buffer cflow-buf<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> buffer-read-only <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>erase-buffer<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert <span style="color: #66cc66;">&#40;</span>shell-command-to-string cmd<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>pop-to-buffer cflow-buf<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>point-<span style="color: #b1b100;">min</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>cflow-mode<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-cflow.htm' t='Emacs &amp;#038; cflow 生成函数调用树' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-cflow.htm/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Emacs － 普通人的编辑利器</title>
		<link>http://emacser.com/emacs-simple-use.htm</link>
		<comments>http://emacser.com/emacs-simple-use.htm#comments</comments>
		<pubDate>Wed, 24 Nov 2010 09:02:27 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[学习Emacs]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[emacser]]></category>
		<category><![CDATA[emacser.com]]></category>
		<category><![CDATA[IDE]]></category>
		<category><![CDATA[org]]></category>
		<category><![CDATA[Org Mode]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[代码折叠]]></category>
		<category><![CDATA[插件]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[鼠标]]></category>

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

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

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

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


不要妖魔化 Emacs ！


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

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


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

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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/emacs-simple-use.htm' t='Emacs － 普通人的编辑利器' d='' tag='Emacs,emacser,emacser.com,IDE,org,Org Mode,screenshot,ubuntu,windows,代码折叠,插件,配色,鼠标' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>
	<h4>相关日志</h4>
	<ul class="st-related-posts">
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (198)</li>
	<li><a href="http://emacser.com/built-in-cedet.htm" title="用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET (2010年05月10日)">用CEDET浏览和编辑C++代码(续) &#8211; 使用Emacs 23.2内置的CEDET</a> (99)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</li>
	<li><a href="http://emacser.com/emacs-cpp-dev.htm" title="在Emacs下用C/C++编程 (2010年10月25日)">在Emacs下用C/C++编程</a> (37)</li>
	<li><a href="http://emacser.com/w3m.htm" title="Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页 (2009年11月23日)">Emacs才是世界上最强的IDE &#8211; 用w3m浏览网页</a> (46)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-simple-use.htm/feed</wfw:commentRss>
		<slash:comments>51</slash:comments>
		</item>
		<item>
		<title>我的 GNU Emacs 配置&#8221;程序&#8221;</title>
		<link>http://emacser.com/my-emacs-config.htm</link>
		<comments>http://emacser.com/my-emacs-config.htm#comments</comments>
		<pubDate>Mon, 01 Nov 2010 02:08:59 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[配置]]></category>

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



1 我的 GNU Emacs 配置程序 

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






1 我的 GNU Emacs 配置程序 


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


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


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


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



1.1 .emacs 


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

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

<p>
第一行通过 <code>load-path</code> 注册扩展文件的所在位置。第二行通过 <code>mapcar</code> 函数逐个装载 &#8220;<code>~/Shell/config/emacs.init</code>&#8221; 目录下的所有配置文件。就是这么简单。其余的内容多数都是 Emacs Customization 添加的代码。或者换句话说，现在的 <code>.emacs</code> 文件完全留给 Emacs用了。
</p>
<p>
其实在采用这种方式之前，我是不用什么 Customization 的。当然，不用的代价是显而易见的。问题在于在原来那种配置方式之下， <code>.emacs</code> 本身就已经够烦够乱了，如果 Emacs的 Customization 再往里面添乱，就更难维护和控制了。不过现在没事了。我自己使用的一共只有两行，剩下的所有地方随便它写吧。所以呢，我现在至少还用 Customization修改了一下 ansi-color，默认颜色里面的深蓝色的目录实在是太刺眼了。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code20'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170920"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p41709code20"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>custom-set-variables
  <span style="color: #808080; font-style: italic;">;; custom-set-variables was added by Custom.</span>
  <span style="color: #808080; font-style: italic;">;; If you edit it by hand, you could mess it up, so be careful.</span>
  <span style="color: #808080; font-style: italic;">;; Your init file should contain only one such instance.</span>
  <span style="color: #808080; font-style: italic;">;; If there is more than one, they won't work right.</span>
 '<span style="color: #66cc66;">&#40;</span>ansi-color-faces-vector <span style="color: #66cc66;">&#91;</span>default default default italic underline bold bold-italic modeline<span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span>
 '<span style="color: #66cc66;">&#40;</span>ansi-color-names-vector <span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">&quot;black&quot;</span> <span style="color: #ff0000;">&quot;red&quot;</span> <span style="color: #ff0000;">&quot;PaleGreen&quot;</span> <span style="color: #ff0000;">&quot;yellow&quot;</span> <span style="color: #ff0000;">&quot;DodgerBlue1&quot;</span> <span style="color: #ff0000;">&quot;magenta&quot;</span> <span style="color: #ff0000;">&quot;cyan&quot;</span> <span style="color: #ff0000;">&quot;white&quot;</span><span style="color: #66cc66;">&#93;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
另外，还有一个地方需要提到一下， 在 <code>.emacs</code> 里面我还保留了一段中文字体的设置。以前 emacser.com 里面有人发过字体设置的东西。但是由于 GNU Emacs 23以后基本都在 daemon方式下工作，如果直接使用原来那种方式设置中文字体的话，在 emacsclient中是无效的，所以要把它加到 <code>make-frame</code> 的hook里面。这样每次 <code>emacsclient -c</code> 生成的 frame就都是指定的中文字体了。 当然这下面这个函数还有一个缺陷，就是如果不是使用 daemon 方式的话…… 你懂得，鱼和熊掌，不可兼得。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code21'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170921"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p41709code21"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>add-hook 'after-make-frame-functions
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span>arg<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span>  <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&gt;=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">length</span> <span style="color: #66cc66;">&#40;</span>frame-<span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>set-fontset-font  <span style="color: #ff0000;">&quot;fontset-startup&quot;</span> 'chinese-gbk <span style="color: #66cc66;">&#40;</span>font-spec <span style="color: #66cc66;">:</span><span style="color: #555;">family</span> <span style="color: #ff0000;">&quot;文泉驿微米黑&quot;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">nil</span> 'prepend<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#41;</span> t
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

</div>
</div>
<div id="outline-container-1.2" class="outline-4">
<h4 id="sec-1.2"><span class="section-number-4">1.2</span> color-theme.el </h4>
<div class="outline-text-4" id="text-1.2">
<p>
那么我自己的配置信息写在哪些地方呢？让我们看看 &#8220;<code>~/Shell/config/emacs.init</code>&#8220;目录下的都有哪些文件
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code22'); return false;">View Code</a> SHELL</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170922"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p41709code22"><pre class="shell" style="font-family:monospace;">2 : 2023 : 13:03:26 : ~/Shell/config/emacs.init 
dove@bash-4.1$ du -sh *.el
8.0K    calendar-setup.el
28K color-theme.el
28K dove-ext.el
4.0K    keybindings.el
8.0K    org-mode.el
8.0K    plugins.el
4.0K    settings.el
&nbsp;
2 : 2024 : 13:03:35 : ~/Shell/config/emacs.init 
dove@bash-4.1$ du -sh .emacs
4.0K    .emacs
&nbsp;
2 : 2025 : 13:04:07 : ~/Shell/config/emacs.init 
dove@bash-4.1$</pre></td></tr></table></div>

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code23'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170923"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
</pre></td><td class="code" id="p41709code23"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>eval-when-compile    <span style="color: #66cc66;">&#40;</span>require 'color-theme<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> my-color-theme <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;Color theme created 2010-04-09.&quot;</span>
<span style="color: #808080; font-style: italic;">;  (interactive)</span>
  <span style="color: #66cc66;">&#40;</span>color-theme-install
   '<span style="color: #66cc66;">&#40;</span>my-color-theme
<span style="color: #808080; font-style: italic;">;     ((background-color . &quot;#102C29&quot;)</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>background-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;darkslategrey&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;     (( background-color . &quot;black&quot;)</span>
      <span style="color: #66cc66;">&#40;</span>background-mode <span style="color: #66cc66;">.</span> dark<span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>border-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;black&quot;</span><span style="color: #66cc66;">&#41;</span>
      <span style="color: #66cc66;">&#40;</span>cursor-color <span style="color: #66cc66;">.</span> <span style="color: #ff0000;">&quot;LightGray&quot;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;      ... ... ... ... theme 太长，中间省略了</span>
     <span style="color: #66cc66;">&#40;</span>woman-bold-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">bold</span> t <span style="color: #66cc66;">:</span><span style="color: #555;">weight</span> bold<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>woman-italic-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;beige&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>woman-unknown-face <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;LightSalmon&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>zmacs-region <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>t <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">:</span><span style="color: #555;">background</span> <span style="color: #ff0000;">&quot;dark cyan&quot;</span> <span style="color: #66cc66;">:</span><span style="color: #555;">foreground</span> <span style="color: #ff0000;">&quot;cyan&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>eval-when-compile <span style="color: #66cc66;">&#40;</span>require 'color-theme<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>color-theme-initialize<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>add-hook 'after-make-frame-functions 
      <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>arg<span style="color: #66cc66;">&#41;</span>
        <span style="color: #ff0000;">&quot;&quot;</span>
        <span style="color: #66cc66;">&#40;</span>my-color-theme<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> t<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

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

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

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

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code26'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170926"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p41709code26"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>set-key-bindings 'global-set-key   
 <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> 
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>f2<span style="color: #66cc66;">&#93;</span>                            calendar<span style="color: #66cc66;">&#41;</span>
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>shift f2<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>                    remember<span style="color: #66cc66;">&#41;</span>
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>f5<span style="color: #66cc66;">&#93;</span>                            revert-buffer<span style="color: #66cc66;">&#41;</span>
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>f10<span style="color: #66cc66;">&#93;</span>                           rename-buffer<span style="color: #66cc66;">&#41;</span>
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span>f11<span style="color: #66cc66;">&#93;</span>                           query-replace<span style="color: #66cc66;">&#41;</span>
     '<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#91;</span><span style="color: #66cc66;">&#40;</span>shift f11<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#93;</span>                   query-replace-regexp<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;         ... ... ... ... 按键太多，中间省略</span>
     <span style="color: #808080; font-style: italic;">;; copy paste operations </span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-=&quot;</span><span style="color: #66cc66;">&#41;</span>                 'set-mark-command<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c l&quot;</span><span style="color: #66cc66;">&#41;</span>               'copy-line<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c w&quot;</span><span style="color: #66cc66;">&#41;</span>               'copy-word<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-S-k&quot;</span><span style="color: #66cc66;">&#41;</span>               <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>  <span style="color: #ff0000;">&quot; &quot;</span> <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>kill-visual-line -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c s&quot;</span><span style="color: #66cc66;">&#41;</span>               'thing-copy-string-to-mark<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c a&quot;</span><span style="color: #66cc66;">&#41;</span>               'thing-copy-parenthesis-to-mark<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c p&quot;</span><span style="color: #66cc66;">&#41;</span>               'copy-paragraph<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-x a d&quot;</span><span style="color: #66cc66;">&#41;</span>             'delete-region<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;         ... ... ... ... 按键太多，中间省略</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c c&quot;</span><span style="color: #66cc66;">&#41;</span>               '<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #ff0000;">&quot; &quot;</span> <span style="color: #66cc66;">&#40;</span>interactive<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> emaci-mode  <span style="color: #66cc66;">&#40;</span>emaci-mode-off<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>emaci-mode-on<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;M-DEL&quot;</span><span style="color: #66cc66;">&#41;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span><span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&amp;</span>optional arg<span style="color: #66cc66;">&#41;</span> 
         <span style="color: #ff0000;">&quot;Act as the obsolete dove-backward-kill-word &quot;</span> 
         <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;P&quot;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> arg 
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>arg <span style="color: #66cc66;">&#40;</span>- <span style="color: #cc66cc;">0</span> arg<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>dove-forward-kill-word arg<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span>dove-forward-kill-word -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

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

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

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

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

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

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code30'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170930"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code" id="p41709code30"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> set-outline-minor-mode-regexp <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #66cc66;">&#40;</span>outline-minor-mode <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>regexp-<span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">append</span> outline-minor-mode-<span style="color: #b1b100;">list</span> <span style="color: #b1b100;">nil</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>find-regexp
     <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">lambda</span> <span style="color: #66cc66;">&#40;</span>lst<span style="color: #66cc66;">&#41;</span>
       <span style="color: #ff0000;">&quot;&quot;</span>
       <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>innerList <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> innerList
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">if</span> <span style="color: #66cc66;">&#40;</span>string<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> innerList<span style="color: #66cc66;">&#41;</span> major-mode<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">car</span> <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">cdr</span> innerList<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
           <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span> <span style="color: #66cc66;">&#40;</span>pop lst<span style="color: #66cc66;">&#41;</span>
              <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> find-regexp lst<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span>make-local-variable 'outline-regexp<span style="color: #66cc66;">&#41;</span>
         <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">setq</span> outline-regexp <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">funcall</span> find-regexp regexp-<span style="color: #b1b100;">list</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
  <span style="color: #66cc66;">&#40;</span>set-key-bindings 'local-set-key
            <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c C-t&quot;</span><span style="color: #66cc66;">&#41;</span> 'hide-body<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c C-a&quot;</span><span style="color: #66cc66;">&#41;</span> 'show-all<span style="color: #66cc66;">&#41;</span>
             <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">list</span> <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;C-c C-e&quot;</span><span style="color: #66cc66;">&#41;</span> 'show-entry<span style="color: #66cc66;">&#41;</span>
<span style="color: #808080; font-style: italic;">;            (kbd &quot;C-c C-d&quot;) 和 shell-mode 冲突，所以继续沿用 C-c @ C-d，不做自定义</span>
             <span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
然后针对每一个需要的模式添加 hook就行了。
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code31'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170931"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41709code31"><pre class="lisp" style="font-family:monospace;"> <span style="color: #66cc66;">&#40;</span>add-hook 'shell-mode-hook 'set-outline-minor-mode-regexp t<span style="color: #66cc66;">&#41;</span>
 <span style="color: #66cc66;">&#40;</span>add-hook 'sh-mode-hook 'set-outline-minor-mode-regexp t<span style="color: #66cc66;">&#41;</span>
 <span style="color: #66cc66;">&#40;</span>add-hook 'emacs-lisp-mode-hook 'set-outline-minor-mode-regexp  t<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
最后在 函数里面还要提到的一点是 <code>(make-local-variable 'outline-regexp)</code> 。我在这里显式的把 <code>outline-regexp</code> 作成 buffer local 了。如果不这样做的话， <code>sh-mode</code> 中的 <code>outline-regexp</code> 赋值会很诡异的覆盖掉 <code>shell-mode</code> 里面的值。虽然我还不太清楚为什么在别的 mode 里面就没有问题。灵异中……
</p>
</div>
</div>
<div id="outline-container-1.7" class="outline-4">
<h4 id="sec-1.7"><span class="section-number-4">1.7</span> org-mode.el </h4>
<div class="outline-text-4" id="text-1.7">
<p>
最后是 <code>org-mode.el</code> ， 我不知道再提到这个文件是不是还有必要。因为这里在没有什么神奇的地方了。这里只是一些关于 <code>org-mode</code> 的一些设置， 还有……一些 skeleton 定义。因为基本上 <code>org-mode</code> 的默认设置就已经蛮好用了（我用的是 7.01h 版），所以现在这个文件内的内容基本上就是 skeleton 定义。只是因为他们还没有变得足够多，所以我还没有把它们分成一个单独的文件来管理。那么就说说 skeleton 吧。最近比较常用的 skeleton 主要是以下这些：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code32'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170932"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
</pre></td><td class="code" id="p41709code32"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-skeleton iexp 
  <span style="color: #ff0000;">&quot;Input #+BEGIN_EXAMPLE #+END_EXAMPLE in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #ff0000;">&quot;#+BEGIN_EXAMPLE<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #ff0000;">&quot;#+END_EXAMPLE&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton isrc 
  <span style="color: #ff0000;">&quot;Input #+begin_src #+end_src in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #ff0000;">&quot;#+begin_src lisp <span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #ff0000;">&quot;#+end_src&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton iprop 
  <span style="color: #ff0000;">&quot;Input :PROPERTIES: :END: in org-mode&quot;</span>
<span style="color: #ff0000;">&quot;&quot;</span>
<span style="color: #ff0000;">&quot;:PROPERTIES:<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _ <span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span> 
<span style="color: #ff0000;">&quot;:END:&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton insert-emacser-code
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;#+BEGIN_HTML<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #ff0000;">&quot;&lt;pre lang=<span style="color: #000099; font-weight: bold;">\&quot;</span>lisp<span style="color: #000099; font-weight: bold;">\&quot;</span> line=<span style="color: #000099; font-weight: bold;">\&quot;</span>1<span style="color: #000099; font-weight: bold;">\&quot;</span>&gt;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
 _<span style="color: #ff0000;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #ff0000;">&quot;</span></pre></td></tr></table></div>

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code33'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170933"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code" id="p41709code33"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> i-babel-<span style="color: #b1b100;">quote</span> <span style="color: #66cc66;">&#40;</span>beg end str1 str2<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>goto-char end<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>forward-line <span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert str2<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>newline<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>goto-char beg<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>forward-line -<span style="color: #cc66cc;">1</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>newline<span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span>insert str1<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> iexp <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot; &quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;%s %s&quot;</span> beg end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>i-babel-<span style="color: #b1b100;">quote</span> beg end <span style="color: #ff0000;">&quot;#+BEGIN_EXAMPLE&quot;</span> <span style="color: #ff0000;">&quot;#+END_EXAMPLE&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> isrc <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot; &quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>message <span style="color: #ff0000;">&quot;%s %s&quot;</span> beg end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>i-babel-<span style="color: #b1b100;">quote</span> beg end <span style="color: #ff0000;">&quot;#+begin_src &quot;</span> <span style="color: #ff0000;">&quot;#+end_src&quot;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">defun</span> i<span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#40;</span>St Ed<span style="color: #66cc66;">&#41;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #66cc66;">&#40;</span>interactive <span style="color: #ff0000;">&quot;r&quot;</span><span style="color: #66cc66;">&#41;</span>
  <span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">let</span> <span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>beg St<span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#40;</span>end Ed<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char end<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>insert <span style="color: #ff0000;">&quot;=&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char beg<span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>insert <span style="color: #ff0000;">&quot;=&quot;</span><span style="color: #66cc66;">&#41;</span>
    <span style="color: #66cc66;">&#40;</span>goto-char <span style="color: #66cc66;">&#40;</span>+ end <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

<p>
最后呢，我把一些 Shell当中比较常用的命令也定义成了 skeleton 。之所以不在 Shell profile 当中定义它，一方面是因为在我的工作中每天都要接触到大量的 Unix/Linux机器，放在 Emacs 里面的话呢，所有的命令都只需要定义一次，就可以在任意一个机器上使用。另外一方面呢，就是 skeleton，包括 abbrev 都是 Emacs 内部的东西，也就是说他们只会把定义的命令扩展开来，而并不会直接的去执行他，只有当我看到扩展结果并且按下回车，comint.el才会把相应的命令转交给 shell process 去执行，这在很多时候要比 shell 本身的 alias 和 function 机制安全的多的多。以下是一些示例：
</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41709code34'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4170934"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p41709code34"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>define-skeleton kill-multiple-proces
  <span style="color: #ff0000;">&quot;Build killing multiple process command list&quot;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;ps -ef | grep -i &quot;</span> _ <span style="color: #ff0000;">&quot; | awk '{ print <span style="color: #000099; font-weight: bold;">\&quot;</span>kill -9 <span style="color: #000099; font-weight: bold;">\&quot;</span> $2 }'&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev shell-mode-abbrev-table <span style="color: #ff0000;">&quot;killps&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> 'kill-multiple-proces<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton gunzip-tar
  <span style="color: #ff0000;">&quot;unzip .tar.gz package in where -z is not available&quot;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;gunzip -cd &quot;</span> _ <span style="color: #ff0000;">&quot; | tar -xf - &quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton def_listener 
  <span style="color: #ff0000;">&quot;Define a listener in a WMQ QMgr&quot;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;DEF LISTENER(LST) TRPTYPE(TCP) PORT(&quot;</span> _ <span style="color: #ff0000;">&quot;) CONTROL(QMGR)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev shell-mode-abbrev-table <span style="color: #ff0000;">&quot;deflst&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> 'def_listener<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-skeleton def_clusrcvr
  <span style="color: #ff0000;">&quot;Define a Cluster Receiver Channel in a WMQ QMgr&quot;</span>
  <span style="color: #ff0000;">&quot;&quot;</span>
  <span style="color: #ff0000;">&quot;DEF CHL(TO.QMCOD.4.FTECA) CHLTYPE(CLUSRCVR) CONNAME('&quot;</span> _ <span style="color: #ff0000;">&quot;') CLUSTER(FTECA)<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span>
<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #66cc66;">&#40;</span>define-abbrev shell-mode-abbrev-table <span style="color: #ff0000;">&quot;defclusrcvr&quot;</span> <span style="color: #ff0000;">&quot;&quot;</span> 'def_clusrcvr<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

<script type="text/javascript" src="http://china-addthis.googlecode.com/svn/trunk/addthis.js" charset="utf-8"></script><span class='addthis_org_cn'><a u='http://emacser.com/my-emacs-config.htm' t='我的 GNU Emacs 配置&amp;#8221;程序&amp;#8221;' d='' tag='' href='http://addthis.org.cn/share/' title='收藏-分享'><img src='http://emacser.com/wp-content/plugins/addthischina/a1.gif' alt='分享家:Addthis中国' align='absmiddle' /></a></span>]]></content:encoded>
			<wfw:commentRss>http://emacser.com/my-emacs-config.htm/feed</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>折腾Emacs</title>
		<link>http://emacser.com/torture-emacs.htm</link>
		<comments>http://emacser.com/torture-emacs.htm#comments</comments>
		<pubDate>Mon, 16 Aug 2010 17:37:24 +0000</pubDate>
		<dc:creator>ahei</dc:creator>
				<category><![CDATA[初级]]></category>
		<category><![CDATA[配置]]></category>
		<category><![CDATA[ahei]]></category>
		<category><![CDATA[ann]]></category>
		<category><![CDATA[C/C++]]></category>
		<category><![CDATA[ctrl]]></category>
		<category><![CDATA[cursor]]></category>
		<category><![CDATA[Emacs]]></category>
		<category><![CDATA[eval-after-load]]></category>
		<category><![CDATA[face]]></category>
		<category><![CDATA[highlight]]></category>
		<category><![CDATA[mode-line]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[screenshot]]></category>
		<category><![CDATA[speedbar]]></category>
		<category><![CDATA[textmate]]></category>
		<category><![CDATA[theme]]></category>
		<category><![CDATA[windows]]></category>
		<category><![CDATA[光标]]></category>
		<category><![CDATA[浏览器]]></category>
		<category><![CDATA[配色]]></category>
		<category><![CDATA[颜色]]></category>
		<category><![CDATA[鼠标]]></category>

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

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


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

Emacs 中文字体配置

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


最简单的字体设置方式是

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

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

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

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

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

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


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

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code54'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152254"><td class="code" id="p41522code54"><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('p41522code55'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152255"><td class="code" id="p41522code55"><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('p41522code56'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152256"><td class="code" id="p41522code56"><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('p41522code57'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152257"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41522code57"><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('p41522code58'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152258"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p41522code58"><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('p41522code59'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152259"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p41522code59"><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('p41522code60'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152260"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41522code60"><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('p41522code61'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152261"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41522code61"><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('p41522code62'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152262"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41522code62"><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('p41522code63'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152263"><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="p41522code63"><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('p41522code64'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152264"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p41522code64"><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('p41522code65'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152265"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p41522code65"><pre class="lisp" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">;; For Linux</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-mouse-4&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-increase<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-mouse-5&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-decrease<span style="color: #66cc66;">&#41;</span>
&nbsp;
<span style="color: #808080; font-style: italic;">;; For Windows</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-wheel-up&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-increase<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>global-set-key <span style="color: #66cc66;">&#40;</span>kbd <span style="color: #ff0000;">&quot;&lt;C-wheel-down&gt;&quot;</span><span style="color: #66cc66;">&#41;</span> 'text-scale-decrease<span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p41522code66'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152266"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code" id="p41522code66"><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('p41522code67'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152267"><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="p41522code67"><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('p41522code68'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152268"><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="p41522code68"><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('p41522code69'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152269"><td class="code" id="p41522code69"><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('p41522code70'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152270"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41522code70"><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('p41522code71'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152271"><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="p41522code71"><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('p41522code72'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4152272"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p41522code72"><pre class="lisp" style="font-family:monospace;"><span style="color: #66cc66;">&#40;</span>require 'color-theme<span style="color: #66cc66;">&#41;</span>
<span style="color: #66cc66;">&#40;</span>eval-after-load <span style="color: #ff0000;">&quot;color-theme&quot;</span>
  '<span style="color: #66cc66;">&#40;</span><span style="color: #b1b100;">progn</span>
     <span style="color: #66cc66;">&#40;</span>color-theme-initialize<span style="color: #66cc66;">&#41;</span>
     <span style="color: #66cc66;">&#40;</span>color-theme-blackboard<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span></pre></td></tr></table></div>

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

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

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

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





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

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

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

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

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

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

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

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

#+END_DITAA

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

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

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

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

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



键绑定
命令
解释


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


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


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


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


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


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


g
google-maps-static-refresh
刷新


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


q
google-maps-static-quit
退出


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


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


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


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


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


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



访问五道口的效果5：

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

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



	相关日志
	
	高亮C的所有变量和函数 (45)
	我的Emacs配置文件 － DEA (352)
	用CEDET浏览和编辑C++代码 (198)
	Emacs才是世界上最强大的IDE － 用Emaci阅读文件 (89)
	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> (45)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</li>
	<li><a href="http://emacser.com/cedet.htm" title="用CEDET浏览和编辑C++代码 (2010年03月18日)">用CEDET浏览和编辑C++代码</a> (198)</li>
	<li><a href="http://emacser.com/emaci.htm" title="Emacs才是世界上最强大的IDE － 用Emaci阅读文件 (2010年04月12日)">Emacs才是世界上最强大的IDE － 用Emaci阅读文件</a> (89)</li>
	<li><a href="http://emacser.com/emacs-beginner-must-know.htm" title="Emacs初学者必知必会 (2010年01月24日)">Emacs初学者必知必会</a> (9)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-google-map.htm/feed</wfw:commentRss>
		<slash:comments>14</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/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('p41433code77'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4143377"><td class="code" id="p41433code77"><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('p41433code78'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4143378"><td class="code" id="p41433code78"><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('p41433code79'); return false;">View Code</a> LISP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4143379"><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="p41433code79"><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('p41433code80'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p4143380"><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="p41433code80"><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/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> (198)</li>
	<li><a href="http://emacser.com/torture-emacs.htm" title="折腾Emacs (2010年08月17日)">折腾Emacs</a> (112)</li>
	<li><a href="http://emacser.com/dea.htm" title="我的Emacs配置文件 － DEA (2009年11月11日)">我的Emacs配置文件 － DEA</a> (352)</li>
	<li><a href="http://emacser.com/emacs-cpp-dev.htm" title="在Emacs下用C/C++编程 (2010年10月25日)">在Emacs下用C/C++编程</a> (37)</li>
	<li><a href="http://emacser.com/some-elisp-fun.htm" title="介绍一些Emacs功能强大的函数 (2010年06月7日)">介绍一些Emacs功能强大的函数</a> (18)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/doxymacs.htm/feed</wfw:commentRss>
		<slash:comments>65</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的所有变量和函数 (45)
	非程序员的Emacs使用心得 (25)
	针对Emacs中文本编辑的编程简介 (5)
	致Emacs初学者 (121)
	自定义Emacs工具栏 (23)


]]></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> (45)</li>
	<li><a href="http://emacser.com/non-programmer.htm" title="非程序员的Emacs使用心得 (2010年12月27日)">非程序员的Emacs使用心得</a> (25)</li>
	<li><a href="http://emacser.com/edit-in-elisp.htm" title="针对Emacs中文本编辑的编程简介 (2010年03月6日)">针对Emacs中文本编辑的编程简介</a> (5)</li>
	<li><a href="http://emacser.com/to-emacs-beginner.htm" title="致Emacs初学者 (2009年11月30日)">致Emacs初学者</a> (121)</li>
	<li><a href="http://emacser.com/emacs-toolbar.htm" title="自定义Emacs工具栏 (2010年06月9日)">自定义Emacs工具栏</a> (23)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://emacser.com/emacs-tshirt.htm/feed</wfw:commentRss>
		<slash:comments>27</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> (352)</li>
	<li><a href="http://emacser.com/emacs-ditaa.htm" title="Emacs中绘图 － ditaa篇 (2010年08月4日)">Emacs中绘图 － ditaa篇</a> (34)</li>
	<li><a href="http://emacser.com/evernote-mode.htm" title="Emacs中的Evernote: evernote-mode (2011年04月26日)">Emacs中的Evernote: evernote-mode</a> (67)</li>
	<li><a href="http://emacser.com/zjl-c-hl.htm" title="高亮C的所有变量和函数 (2010年05月17日)">高亮C的所有变量和函数</a> (45)</li>
	<li><a href="http://emacser.com/emacs-toolbar.htm" title="自定义Emacs工具栏 (2010年06月9日)">自定义Emacs工具栏</a> (23)</li>
</ul>

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

