<?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>pluskid</title>
	<atom:link href="http://blog.donews.com/pluskid/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.donews.com/pluskid</link>
	<description>pluskid</description>
	<lastBuildDate>Thu, 17 Jan 2008 13:24:00 +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>我的新 Blog</title>
		<link>http://blog.donews.com/pluskid/archive/2008/01/17/1247124.aspx</link>
		<comments>http://blog.donews.com/pluskid/archive/2008/01/17/1247124.aspx#comments</comments>
		<pubDate>Thu, 17 Jan 2008 13:24:00 +0000</pubDate>
		<dc:creator>gugu9527</dc:creator>
				<category><![CDATA[体味人生]]></category>

		<guid isPermaLink="false">http://blog.donews.com/pluskid/archive/2008/01/17/1247124.aspx</guid>
		<description><![CDATA[<a href="http://pluskid.lifegoo.com">http://pluskid.lifegoo.com</a>&#160;用了很久了，以后会一直用那个。 <img src="/fckeditor/editor/images/smiley/msn/wink_smile.gif" alt="" />]]></description>
			<content:encoded><![CDATA[<p><a href="http://pluskid.lifegoo.com">http://pluskid.lifegoo.com</a>&nbsp;用了很久了，以后会一直用那个。 <img src="/fckeditor/editor/images/smiley/msn/wink_smile.gif" alt="" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/pluskid/archive/2008/01/17/1247124.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scsh &#8212; a Scheme Shell</title>
		<link>http://blog.donews.com/pluskid/archive/2006/07/22/973595.aspx</link>
		<comments>http://blog.donews.com/pluskid/archive/2006/07/22/973595.aspx#comments</comments>
		<pubDate>Sat, 22 Jul 2006 13:55:00 +0000</pubDate>
		<dc:creator>gugu9527</dc:creator>
				<category><![CDATA[Lisp Tips]]></category>

		<guid isPermaLink="false">http://blog.donews.com/pluskid/archive/2006/07/22/973595.aspx</guid>
		<description><![CDATA[Scsh -- a scripting language, a systems-programming language, a portable programming environment]]></description>
			<content:encoded><![CDATA[<h2>Scsh 简介</h2>
<p class="first">与其说 Scsh 是一个 shell ，还不如说他是一个完整的 scheme 的实现。事实上，他是在 Scheme 48<sup><a href="http://control.cublog.cn/article_new.php#fn.1" name="fnr.1">1</a></sup> 的基础上做出来的，任何现有的 scheme 代码都可以不加修改地在他里面运行<sup><a href="http://control.cublog.cn/article_new.php#fn.2" name="fnr.2">2</a></sup>，另外，他还提供了完整的 Posix 接口、完整的网络支持、强大的字符串操、AWK 式的宏、基于 s-expression 表示的正则表达式以及线程支持。相比之下，scsh 和 Emacs 的 elisp 是不同的，elisp 是模拟一个 sh 类似的 shell 语法，再经过转换成为 lisp 代码再执行，而 scsh 则完全使用 lisp 语法，下面是一个例子：</p>
<pre class="example">gunzip &lt; paper.tex.gz | detex | spell | lpr -Ppulp &amp; </pre>
<p>在 scsh 里面会被写为：</p>
<pre class="example">(&amp; (| (gunzip) (detex) (spell) (lpr -Ppulp)) ; background a pipeline (&lt; paper.tex.gz)) ; with this redirection </pre>
<h2>Scsh 作为脚本语言</h2>
<p class="first">目前 scsh 并不是专门设计来作为交互使用的，而是主要作为脚本编程之用，目前的版本甚至连最简单的命令行编辑功能都没有，我试验过，确实非常难用，你甚至无法用 Backspace 来删除同一行上刚刚键入的字符。文档里面提供的解决办法是使用 Commander S 作为 scsh 的上层交互界面<sup><a href="http://control.cublog.cn/article_new.php#fn.3" name="fnr.3">3</a></sup>，Scsh 文档里面提供的 commander-s 的下载页面已经不能访问了，但是可以在sourceforge 里 scsh 的 cvs 仓库里面找到 commander-s 的源代码下载，目前我可以使用匿名登录的方式通过 cvs 下载到：</p>
<pre class="example">cvs -d:pserver:anonymous@scsh.cvs.sourceforge.net:/cvsroot/scsh login cvs -z3 -d:pserver:anonymous@scsh.cvs.sourceforge.net:/cvsroot/scsh \ co -P commander-s </pre>
<p>注意如果提示输入密码，只需直接回车就可以了。在<a href="http://www.deinprogramm.de/scheme-2005/05-knauel/05-knauel.pdf"> 这里</a>可以找到 commander-s 的一份很不错的文档。要安装 commander-s 的话，还需要其他的东西：</p>
<ul>
<li>到 <a href="http://lamp.epfl.ch/%7Eschinz/scsh_packages/">http://lamp.epfl.ch/~schinz/scsh_packages/</a> 去下载 scsh 的 install-lib</li>
<li>到 <a href="ftp://ftp.scsh.net/pub/scsh/packages/scsh-ncurses/">ftp://ftp.scsh.net/pub/scsh/packages/scsh-ncurses/</a> 去下载 scsh-ncurses 。</li>
<li>到 <a href="http://savannah.nongnu.org/download/sunterlib/">http://savannah.nongnu.org/download/sunterlib/</a> 去下载 Sunterlib 。</li>
</ul>
<p>把上面几个包分别装上之后，只要运行 commander-s 目录下的 install.scm 就可以安装上了。</p>
<p>当然还有其他的方法：</p>
<ul>
<li>使用 Emacs 里面的 cmuscheme 包：键入 C-u M-x runscheme 并在请求程序中键入 scsh 即可。</li>
<li>使用行编辑器 rlwrap ，安装之后可以这样来启动交互：
<pre class="example">rlwrap -c -b '(){}[].,=&amp;^%$#@\;|' scsh </pre>
</li>
<li>使用一些有输入输出功能的终端模拟器，例如为 Plan 9<sup><a href="http://control.cublog.cn/article_new.php#fn.4" name="fnr.4">4</a></sup> 设计的 9term 就是一个例子，他的主页在 <a href="http://www.cs.su.oz.au/%7Ematty/9term/index.html">http://www.cs.su.oz.au/~matty/9term/index.html</a> &#8211; 或者，任何其他可以在里面运行一个子进程的文本编辑器，例如 wily 。</li>
</ul>
<h2>Scsh 作为系统编程语言</h2>
<p class="first">Scsh 提供了很多操作系统的底层操作接口，除了信号控制之外，目前的版本完全支持 Posix 并且还有许多非 Posix 扩展，如 sockets 支持等。换句话说，在 Scsh 里面可以使用进程操作、文件读写、目录访问、tty &amp; pty 支持，文件锁定、管道、日期以及环境变量等等所有的操作。这样，就可以使用 scheme 而不是 C 语言来进行系统编程了。</p>
<h2>Scsh 作为一个可移植的编程环境</h2>
<p class="first">Scsh 是为可移植性而设计的，他在 Scheme 48 的基础上实现。Scheme 48 作为 scheme 的一个字节解释器实现，可以在任何拥有 C 编译器的平台上得到编译。 Scsh 的 OS 接口也是非常具有可移植性的。目前 Scsh 代码可以不加修改地运行在 DEC Ultrix, GNU Hurd, HP-UX, IBM AIX, Linux, NetBSD/i386, NeXTSTEP, SGI IRIX, Solaris 和 SunOS 上，并且移植到其他系统上也并非难事。</p>
<hr />
<p class="footnote"><a href="http://control.cublog.cn/article_new.php#fnr.1" name="fn.1">1.</a> Jonathan Rees 和 Richard Kelsey 说作的一个 scheme 实现。 </p>
<p class="footnote"><a href="http://control.cublog.cn/article_new.php#fnr.2" name="fn.2">2.</a> 只有一个不兼容的地方，就是 symbol 在 scsh 里面是区分大小写的，就是说： <code>(eq? 'symbol 'Symbol)</code> 在 scsh 里面求值会得到 #f ，而在符合 R5RS 的解释器(包含本来的 Scheme 48)上会得到 #t 。 </p>
<p class="footnote"><a href="http://control.cublog.cn/article_new.php#fnr.3" name="fn.3">3.</a> 事实上，我觉得任何 shell 都应该这样设计，然后可以做一个通用的交互前端，这样，既减轻了 shell 实现的负担，又让用户从一个 shell 迁移到另外一个 shell 的时候减轻了许多习惯上的痛苦。 </p>
<p class="footnote"><a href="http://control.cublog.cn/article_new.php#fnr.4" name="fn.4">4.</a> 引用 Plan 9 wiki 上的一句话：Developed by the people who devised Unix, i.e. Bell Labs, Plan 9 takes OS development back into the realm of research. Plan 9 is an attempt to work on the concept of operating system from the ground up, reworking the whole idea using modern concepts and technology. 关于 Plan 9 的更多东西请参见 <a href="http://cm.bell-labs.com/plan9/">http://cm.bell-labs.com/plan9/</a> 或者也可以自己 google 出更多东西来。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/pluskid/archive/2006/07/22/973595.aspx/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使用 template.el 为文件创建默认模</title>
		<link>http://blog.donews.com/pluskid/archive/2006/07/22/973593.aspx</link>
		<comments>http://blog.donews.com/pluskid/archive/2006/07/22/973593.aspx#comments</comments>
		<pubDate>Sat, 22 Jul 2006 13:53:00 +0000</pubDate>
		<dc:creator>gugu9527</dc:creator>
				<category><![CDATA[Emacs Tips]]></category>

		<guid isPermaLink="false">http://blog.donews.com/pluskid/archive/2006/07/22/973593.aspx</guid>
		<description><![CDATA[template.el 可以让你在创建文件的时候为不同类型的文件指定初始化模板，模板可以包含普通文本以及动态扩展的域。]]></description>
			<content:encoded><![CDATA[<h2>使用简介</h2>
<p><a href="http://emacs-template.sourceforge.net/">template.el</a> 可以让你在创建文件的时候为不同类型的文件指定初始化模板，模板可以包含普通文本以及动态扩展的域。例如，你可以在 <code>~/.templates/</code> 目录下包含一个 TEMPLATE.h.tpl 文件：</p>
<pre class="example">/* author: (&gt;&gt;&gt;USER_NAME&lt;&lt;&lt;)&nbsp;* date:&nbsp;&nbsp; (&gt;&gt;&gt;ISO_DATE&lt;&lt;&lt;)&nbsp;*/

#ifndef _(&gt;&gt;&gt;FILE_UPCASE&lt;&lt;&lt;)_H#define _(&gt;&gt;&gt;FILE_UPCASE&lt;&lt;&lt;)_H 1

(&gt;&gt;&gt;POINT&lt;&lt;&lt;)

#endif /* _(&gt;&gt;&gt;FILE_UPCASE&lt;&lt;&lt;)_H */</pre>
<p>那些 (&gt;&gt;&gt;USER_NAME&lt;&lt;&lt;) 一类的域会动态得到扩展，更多的域可以参见template.el 的文档，也可以通过添加到 <code>template-expansion-alist</code> 来定义自己的域。</p>
<p>template.el 查找模板的方式非常智能，让用户可以为不同的工程、不同类型的文件甚至是某一个特殊的文件指定不同的模板，文档里面有一个例子：</p>
<ul>
<li>你有一个工程目录 <code>~/proj/</code> 以及子目录 <code>foo/</code> 和 <code>bar/</code> ，他们都包含 <code>.java</code>类型的文件。</li>
<li>你想为工程里面的 <code>.java</code> 文件定义一个一般的模板，同时，为子目录 <code>foo/</code>里面的 <code>.java</code> 文件定义另外一个模板。你还想为工程里面的所有文件名为<code>proj.java</code> 的文件定义一个单独的模板。</li>
<li>为了避免让模板文件把你的工程目录搞得一团糟，你首先创建一个&lt; code&gt;~/proj/Templates/ 目录，并把一般模板的 <code>TEMPLATE.java.tpl</code> 和<code>proj.java.tpl</code> 放到这里面。同时，在 <code>~/proj/foo/</code> 目录里面创建用于这个子目录的模板文件 <code>TEMPLATE.java.tpl</code> 。
<p>&nbsp;</p>
</li>
</ul>
<p>template.el 还有其他功能，详细可以参见他的文档。</p>
<h2>和 ido 一类的包协同工作</h2>
<p class="first">如果使用 ido 的话，会发现用 ido 的 <code>ido-find-file</code> 来打开文件并不会触发模板扩展，查看文档可以看出，应该修改一下 <code>template-find-file-commands</code> 。可是把 <code>ido-find-file</code> 加到里面并不管用，查看了一下 template 的源代码可以发现，template.el 工作的方式大概是这样的，他通过加入 hook 到<code>find-file-not-found-hooks</code> (事实上，这个变量已经在版本 22.1 里面不鼓励使用了，取而代之的是 <code>find-file-not-found-functions</code>) ，在新建一个文件的时候他提供的 hook 将会被调用，这个时候他判断 <code>this-command</code> ，看他是否在变量 <code>template-find-file-commands</code> 里面，如果在里面，那么就会执行 template的相应工作了。而我跟踪发现 `ido-find-file&#8217; 执行之后 <code>this-command</code> 的值事实上是 <code>ido-exit-minibuffer</code> ，因此这儿必须这样设置才会生效：</p>
<pre class="example">(add-to-list 'template-find-file-commands&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'ido-exit-minibuffer)</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/pluskid/archive/2006/07/22/973593.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>加速你的 Emacs</title>
		<link>http://blog.donews.com/pluskid/archive/2006/05/10/863831.aspx</link>
		<comments>http://blog.donews.com/pluskid/archive/2006/05/10/863831.aspx#comments</comments>
		<pubDate>Wed, 10 May 2006 15:00:00 +0000</pubDate>
		<dc:creator>gugu9527</dc:creator>
				<category><![CDATA[Emacs Tips]]></category>

		<guid isPermaLink="false">http://blog.donews.com/pluskid/archive/2006/05/10/863831.aspx</guid>
		<description><![CDATA[Emacs会随着你定制的内容增多而启动速度越来越慢，当然，在很多服务器上是
启动之后就一直不会关闭的，但是自己的电脑不做服务器，会经常关机，而且有
些时候会临时启动一下编辑器，比如说环境变量里面的 EDITOR 就是很多程序经
常会调用的。那么，如何来加速自己的 Emacs 呢？下面给出了几个解决办法]]></description>
			<content:encoded><![CDATA[<p>Emacs会随着你定制的内容增多而启动速度越来越慢，当然，在很多服务器上是<br />
启动之后就一直不会关闭的，但是自己的电脑不做服务器，会经常关机，而且有<br />
些时候会临时启动一下编辑器，比如说环境变量里面的 EDITOR 就是很多程序经<br />
常会调用的。那么，如何来加速自己的 Emacs 呢？下面给出了几个解决办法：</p>
<ul>
<li><a href="#LOADNOTHING">不加载任何配置文件进行启动</a></li>
<li><a href="#STARTSERVER">用 emacsclient 来连接 emacs server</a></li>
<li><a href="#MULTITTY">使用 multi-tty 补丁</a></li>
</ul>
<p><a name="LOADNOTHING" id="LOADNOTHING"></a></p>
<h2>不加载任何配置文件进行启动</h2>
</p>
<p>用 <code>emacs -q</code> 命令启动可以跳过加载自己的 <code>~/.emacs</code> 而进行启动，如果版本比<br />
较新的 Emacs ，还支持 <code>-Q</code> 选项，表示快速启动，其实这个选项是等价于这样<br />
启动： <code>emacs -q --no-site-file --no-splash</code> 。这样一般就能够达到比较快<br />
的速度了，不足的地方就是跳过了所有定制的部分，自己熟悉的定制的功能都没<br />
有了，见到的只是一个陌生的朋友而已。</p>
<p><a name="STARTSERVER" id="STARTSERVER"></a></p>
<h2>用 emacsclient 来连接 emacs server</h2>
</p>
<p>这个方法首先要有一个启动好了的 Emacs ，并且要已经启动了 server 模式，<br />
你可以用 <code>M-x start-server</code> 来启动 server 模式，或者在自己的 <code>~/.emacs</code> 里<br />
面加入 <code>(server-start)</code> 来自动启动 server 。</p>
<p>然后，你就可以通过 <code>emacsclient filename</code> 来快速使用 Emacs 打开文件了！<br />
事实上，文件是在作为 server 的那个 Emacs 里面打开的，而 emacsclient 将<br />
等待 server 编辑文件。这个时候你可以转到 server 那里去编辑文件，编辑好<br />
之后用 <code>C-x #</code> 来关闭文件并通知 emacsclient 文件已经编辑完成。现在，你就<br />
可以把自己的 EDITOR 变量设置成 emacsclient 而不用怕启动速度慢了：</p>
<pre class="example">
EDITOR=&quot;emacsclient +%d %s&quot;
</pre>
<p>不过如果没有事先启动了一个 emacs server 的话，这个命令就会失败，他提供<br />
的一个解决办法就是 <code>--alternate-editor</code> 参数，表示连接失败的时候调用的命<br />
令，你可以把他设置成 vi 或者是其他小巧的编辑器，或者，你也可以在这儿直<br />
接设置成 emacs ，不过这也许并不如想象中的那么美妙，也许你认为如果没有<br />
启动 emacs ，那么在这儿就启动它，然后后面就可以顺利地调用 emacsclient<br />
了！但是如果这儿是其他程序比如 mutt 或者 svn 之类的使用 EDITOR 环境变<br />
量来调用的编辑器，他会等待编辑器退出来表示编辑完成，这个时候看着刚刚启<br />
动的 emacs 马上又要关闭了，实在是不忍心呀！:) <sup><a name="fnr.1" href="#fn.1">1</a></sup> 不过这个也有个不爽的<br />
地方就是打开文件都是在 server 里面打开的，还不能自动跳转到 server 那里<br />
去，比较麻烦。</p>
<p class="footnote"><a name="fn.1" href="#fnr.1">1.</a>  有关 emacs 的 server 模式的更多内容，请参见<br />
<a href="http://www.gnu.org/software/emacs/manual/html_node/Emacs-Server.html">http://www.gnu.org/software/emacs/manual/html_node/Emacs-Server.html</a></p>
<p><a name="MULTITTY" id="MULTITTY"></a></p>
<h2>使用 multi-tty 补丁</h2>
</p>
<p>引用作者的一句话： <sup><a name="fnr.2" href="#fn.2">2</a></sup></p>
<blockquote>
<p class="quoted">My goal is to allow opening multiple, different tty devices and<br />
simultaneous X (graphical) and tty frames from a single Emacs<br />
session.</p>
</blockquote>
<p>使用方法和 emacs server 差不多，因为这儿是修改了 emacsclient 。所以如<br />
果用了这个补丁，使用 emacsclient 的时候会自动打开新的窗口而不是在<br />
emacs 的 server 里面打开，然后再手工切换到 server 那里。</p>
<p>要使用这个补丁版本的 Emacs ，如果是 Debian 系统的话，可以直接使用他提<br />
供的源下载安装或者下载源代码包自己编译：</p>
<pre class="example">
# Multi-tty Emacs
deb http://aszt.inf.elte.hu/~lorentey/mirror/apt unstable multi-tty
deb-src http://aszt.inf.elte.hu/~lorentey/mirror/apt unstable multi-tty
</pre>
<p>不过我这儿下载速度实在是慢得可以，作者还提供了一个仓库，说是用 bazzar<br />
软件来获取仓库的文件的，不过我连那个仓库好像根本没有下载下来任何东西，<br />
我同时用 baz 连那个仓库，并到 Emacs 的仓库用 cvs 去 check out 出来一个<br />
完整的源码树，结果 Emacs 都 check out 完了，这边还没有任何反应。不过作<br />
者还提供了针对 emacs cvs 仓库的源码树的补丁文件，可以在<br />
<a href="http://lorentey.hu/downloads/emacs/multi-tty">http://lorentey.hu/downloads/emacs/multi-tty</a> 找到补丁文件，然后把他们<br />
打到 check out 出来的 emacs 的源码树上面去。我看到补丁文件里面好像是针<br />
对 emacs 22.0.5* 的，也就是直接用命令：</p>
<pre class="example">
cvs -z3 -d:pserver:anonymous@cvs.savannah.gnu.org:/cvsroot/emacs co emacs
</pre>
<p>check out 出来的版本，至于那个 unicode 的 branch ，也就是传说中的<br />
emacs 23 我并没有试过。然后下载你 check out 出来的日期对应的补丁，如果<br />
没有对应的，那么相近的日期的补丁应该问题也不大的了，尽量相近就可以了。<br />
然后到 emacs 的目录里面去，打上补丁：</p>
<pre class="example">
cd emacs
patch -p 1 &lt; ../emacs--multi-tty--0--patch-555.2006-05-05.patch
</pre>
<p>现在补丁打上了，我们还需要再稍微 hack 一下才编译，要不然会有一点错误的，<br />
打开 <code>src/pursize.h</code> 把定义的 PURESIZE 改大一点，否则编译好之后启动<br />
emacs 会产生 warning 说 &#8220;Building Emacs overflow pure space&#8221; <sup><a name="fnr.2" href="#fn.2">2</a></sup> 。<br />
我是把 <code>#define PURESIZE_RATIO 1</code> 改成了 <code>#define PURESIZE_RATIO 4</code> 之后就<br />
没有错误了，如果你想自己看看到底是什么错误，你可以先不修改，然后直接编<br />
译，运行一下，看看如果出错了再修改，因为只修改一处小的地方对于重新<br />
make 来说只会影响到一小部分，速度很快的。事实上，因为 emacs 启动的时候<br />
有一部分只读的不可扩展的内存，因为这儿用了 multi-tty 补丁，导致预先定<br />
义的那些内存无法容纳下所有的预加载库，于是只有动态分配，所以会在启动的<br />
时候产生 warning ，所以说也不能说是一个错误，但是我是个完美主义者，所<br />
以想要去掉那个 warning 。OK！hack 之后就可以编译安装了： <sup><a name="fnr.3" href="#fn.3">3</a></sup></p>
<pre class="example">
./configure --without-gtk
make bootstrap
make
make install
</pre>
<p>现在，启动你安装好的 emacs ，在启动 server 模式： <code>M-x server-start</code> 。<br />
然后到另外一个地方去用 emacsclient：</p>
<dl>
<dt><strong>emacsclient file</strong></dt>
<dd>
在新的 X frame 中打开文件进行编辑，编辑完成后用 <code>C-x #</code> 完成编辑并关闭<br />
frame</dd>
<dt><strong>emacsclient -t file</strong></dt>
<dd>
在当前终端下打开文件进行编辑(类似于 emacs -nw 的效果)，编辑完之后用<br />
<code>C-x #</code> 完成编辑并关闭</dd>
<dt><strong>emacsclient</strong></dt>
<dd>
打开一个空的 X frame ，使用 <code>C-x 5 0</code> 关闭</dd>
<dt><strong>emacsclient -t</strong></dt>
<dd>
不用解释了吧？:)</dd>
</dl>
<p>注意这下所有的打开的 frame 或者是终端界面的 emacs 其实都是同一个<br />
session 的，你在任意一个里面用 <code>C-x C-c</code> 都会导致所有的 frame 关闭退出哟！<br />
另外，如果你真的打算几个月开着 Emacs ，而又不想让自己的 Emacs 被一大堆<br />
乱七八糟的 buffer 给填满，也许你可以试一下 Midnight mode ，详细请看<br />
Emacs 的手册： <code>C-h i m Emacs RET m Kill Buffers RET</code> 。</p>
<hr />
<p class="footnote"><a name="fn.2" href="#fnr.2">2.</a> 关于此的详细内容请参见 elisp 的手册：C-h i m elisp RET m Pure<br />
Storage RET</p>
<p class="footnote"><a name="fn.3" href="#fnr.3">3.</a> emacs multi-tty 的扩展主页在 <a href="http://lorentey.hu/project/emacs.html.en">http://lorentey.hu/project/emacs.html.en</a></p>
<p class="footnote"><a name="fn.4" href="#fnr.4">4.</a> 注意这儿要选择 &#8211;without-gtk ，因为作者说了，目前对于编译为 gtk 的<br />
模式还有问题，不过 x-toolkit 用什么都无所谓吧，因为平时使用的时候<br />
用到 x-toolkit 的东西并不多嘛。</p>
<hr />
<ul>
<li>感谢 <a href="http://www.linuxsir.org/bbs/member.php?u=2985">galilette</a> 向我推荐 multi-tty 的补丁。</li>
<li>感谢 <a href="http://www.linuxsir.org/bbs/member.php?u=48127">herberteuler</a> 向我推荐 Midnight mode 。</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/pluskid/archive/2006/05/10/863831.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Emacs 如何选择 Major Modes</title>
		<link>http://blog.donews.com/pluskid/archive/2006/05/07/859813.aspx</link>
		<comments>http://blog.donews.com/pluskid/archive/2006/05/07/859813.aspx#comments</comments>
		<pubDate>Sun, 07 May 2006 15:11:00 +0000</pubDate>
		<dc:creator>gugu9527</dc:creator>
				<category><![CDATA[Emacs Tips]]></category>

		<guid isPermaLink="false">http://blog.donews.com/pluskid/archive/2006/05/07/859813.aspx</guid>
		<description><![CDATA[讲述 Emacs 如何自动根据文件的名字以及内容选择对应的 Major mode。翻译自 Emacs 在线帮助手册。]]></description>
			<content:encoded><![CDATA[<p>你可以显式地为当前的 buffer 选择一个 mode ，但是其实大多数情况 Emacs 会<br />
根据文件名以及出现在文件里面的特殊字符自动选择对应的 mode 。</p>
<p>要显式地选择一种 mode ，可以使用 &#8220;M-x&#8221; 命令，mode 的名字加上 &#8220;-mode&#8221; 就<br />
是设置这个 mode 的命令。例如 &#8220;M-x lisp-mode&#8221; 可以打开 Lisp mode 。</p>
<p>当你访问一个文件的时候，Emacs 一般会根据文件名自动选择正确的 mode ，例<br />
如：当你打开一个文件名以 &#8220;.c&#8221; 结尾的文件时，会自动进入 C mode 。文件名<br />
和 mode 之间的对应关系是由变量 &quot;auto-mode-alist&quot; 来控制的。它是一个表，<br />
表里面的每一个元素有这样的形式：</p>
<pre class="example">
(REGEXP . MODE-FUNCTION)
</pre>
<p>或者是这种形式</p>
<pre class="example">
(REGEXP MODE-FUNCTION FLAG)
</pre>
<p>例如，表里面有一个元素为 (&quot;\\.c\\&#8217;&quot; . c-mode) 所以文件名以 &#8220;.c&#8221; 结尾的<br />
文件会使用 C mode 。如果是第二种形式，并且 FLAG 不是 nil ，那么在调用<br />
了 MODE-FUNCTION 之后，匹配到 REGEXP 的后缀将会被丢弃，并继续寻找下一<br />
个匹配。</p>
<p>你也可以在文件的第一个非空白行添加一些特殊的文本告诉 Emacs 对这个文件<br />
使用某个特定的 mode 。这一行应该包括 <code>``-*-MODENAME-*-''</code> 的形式，也允许<br />
其他字符出现在这一行，例如：</p>
<pre class="example">
;-*-Lisp-*-
</pre>
<p>告诉 Emacs 在这儿使用 Lisp mode 。这种显式地指定将覆盖通过文件名来选择<br />
的 mode 。另外一种形式是：</p>
<pre class="example">
-*- mode: MODENAME;-*-
</pre>
<p>这样你可以像这样指定一些局部变量：</p>
<pre class="example">
-*- mode: MODENAME; VAR: VALUE; ... -*-
</pre>
<p>当一个文件的内容以 &#8220;#!&#8221; 开始，他将被当作 Shell Script 。当你访问这样的<br />
文件而他的文件名有没有对应的 major mode 的时候，Emacs 使用第一行的解释<br />
器的名字来选择 mode ，例如 &#8220;perl&#8221; 、&#8220;tcl&#8221; 、&#8220;bash&#8221; 等。Emacs 会选择合<br />
适那个解释器的 mode 。这样的选择是由变量 &#8220;interpreter-mode-alist&#8221; 来控<br />
制的。</p>
<p>当一个文件的内容以 &#8220;#!&#8221; 开始的时候，你无法在第一行以 <code>``-*-''</code> 的形式来指<br />
定 mode ，因为这样会使 &#8220;#!&#8221; 的功能失效。这个时候 Emacs 会查看第二行是<br />
否有 <code>``-*-''</code> 的指定 mode 的指令。</p>
<p>当你访问一个没有指定 mode 的文件，或者使用 &#8220;C-x b&#8221; 来创建一个新的<br />
buffer 的时候，变量 &#8220;default-major-mode&#8221; 将指定使用哪个 mode 。他的值<br />
一般是 &#8220;fundamental-mode&#8221; 。如果这个变量的值是 nil ，major mode 将会根<br />
据前一个 current buffer 来选取。</p>
<p>当你改变了一个 buffer 的 mode 的时候，你可以用 &quot;M-x normal-mode&quot; 来让<br />
Emacs 自动选择 mode 。这也正是 &#8220;find-file&#8221; 调用来设置 mode 的方法，它<br />
还会处理文件相关的局部变量 (如果有的话) 。</p>
<p>调用命令 &#8220;C-x C-w&#8221; 和 &#8220;set-visited-file-name&#8221; 之后如果新的文件名对应一<br />
个 mode ，那么 Emacs 将进入这个 mode 。但是如果 buffer 的内容指定了一个<br />
mode ，这种情况不会出现。而且，有些 major mode 不允许改变 mode 。你可<br />
以把变量 &#8220;change-major-mode-with-file-name&#8221; 设定为 nil 来关闭这个特性。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/pluskid/archive/2006/05/07/859813.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Do you Act &#8212; or React</title>
		<link>http://blog.donews.com/pluskid/archive/2006/05/07/859131.aspx</link>
		<comments>http://blog.donews.com/pluskid/archive/2006/05/07/859131.aspx#comments</comments>
		<pubDate>Sun, 07 May 2006 03:03:00 +0000</pubDate>
		<dc:creator>gugu9527</dc:creator>
				<category><![CDATA[体味人生]]></category>

		<guid isPermaLink="false">http://blog.donews.com/pluskid/archive/2006/05/07/859131.aspx</guid>
		<description><![CDATA[He refuse to return incivility from incivility, because then he would no longer be in command of his own conduct.]]></description>
			<content:encoded><![CDATA[<p>
<span style="text-align: center;"><br />
			 by Sydney J. Harris</p>
<p></span></p>
<p>
I walked with my friend to the newsstand the other night, and he<br />
bought a paper, thanking the newspaper politely. The vendor didn&#8217;t<br />
even acknowledge it.</p>
<p>
&ldquo;A sullen fellow, isn&#8217;t he?&rdquo; I commented.</p>
<p>
&ldquo;Oh, he&#8217;s that way every night,&rdquo; shrugged my friend.</p>
<p>
&ldquo;Then why do you continue to be so polite to him?&rdquo; I asked.</p>
<p>
&ldquo;Why not?&rdquo; inquired my friend. &ldquo;Why should I let him decide how I&#8217;m<br />
going to act?&rdquo;</p>
<p>
As I thought about this incident later, it occurred to me that the<br />
important word was &ldquo;act&rdquo;. My friends acts toward people; most of us<br />
react toward them.</p>
<p>
He has sense of inner balance which is lacking in most of us; he knows<br />
who he is, what he stands for, how he should behave. He refuse to<br />
return incivility from incivility, because then he would no longer be<br />
in command of his own conduct.</p>
<p>
When we are enjoined in the <em>Bible</em> to return good for evil, we look<br />
upon this as a moral injunction &#8212; which it is. But it is also a<br />
psychological prescription for our emotional health.</p>
<p>
Nobody is unhappier than the perpetual reactor. His center of<br />
emotional gravity is not rooted within himself, where it belongs, but<br />
in the world outside him. His spiritual temperature is always being<br />
raised or lowered by the social climate around him, and he is a mere<br />
creature at the mercy of there elements.</p>
<p>
Praise gives him a feeling of euphoria, which is false, because it<br />
does not last and it does not come from self approval. Criticism<br />
depresses him more than it should, because it confirms his own<br />
secretly shaky opinion of himself. Snubs hurt him, and the merest<br />
suspicion of unpopularity in any quarter rouses him to bitterness.</p>
<p>
A serenity of spirit cannot be archieved until we become the masters<br />
of our own actions and attitudes. To let another determine whether we<br />
shall be rude or gracious, elated or depressed, is to relinquish<br />
control over our own personalities, which is ultimately all wo<br />
possess. The only true possession is self-possession.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/pluskid/archive/2006/05/07/859131.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>eshell 里面过滤颜色控制符</title>
		<link>http://blog.donews.com/pluskid/archive/2006/05/06/858356.aspx</link>
		<comments>http://blog.donews.com/pluskid/archive/2006/05/06/858356.aspx#comments</comments>
		<pubDate>Sat, 06 May 2006 05:30:00 +0000</pubDate>
		<dc:creator>gugu9527</dc:creator>
				<category><![CDATA[Emacs Tips]]></category>

		<guid isPermaLink="false">http://blog.donews.com/pluskid/archive/2006/05/06/858356.aspx</guid>
		<description><![CDATA[Emacs 里面的 shell 和 eshell 默认都没有过滤掉颜色控制字符，如果使用 /bin/ls --color 的话显示会乱七八糟。有个解决办法就是使用 ansi-color.el 。]]></description>
			<content:encoded><![CDATA[<p>Emacs 里面的 shell 和 eshell 默认都没有过滤掉颜色控制字符，如果使用 /bin/ls &#8211;color 的话显示会乱七八糟。有个解决办法就是使用 ansi-color.el 。在自己的 ~/.emacs 里面写上：</p>
<pre class="example">
;; shell 和 eshell 相关设置

;; 让 shell mode 可以正常显示颜色
(autoload 'ansi-color-for-comint-mode-on "ansi-color" nil t)
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)

(require 'ansi-color)
;; eshell 的颜色
;; 这样可以显示颜色，但是当在文件很多的目录里面显示的时候
;; 会很慢
;(add-hook 'eshell-preoutput-filter-functions
;         'ansi-color-apply)
;; 这样直接把颜色滤掉
(add-hook 'eshell-preoutput-filter-functions
          'ansi-color-filter-apply)
</pre>
<p>就可以正确过滤颜色控制字符了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/pluskid/archive/2006/05/06/858356.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>早上写了个在 Emacs 里面查询 stardict 的辞典的东西</title>
		<link>http://blog.donews.com/pluskid/archive/2006/05/06/858347.aspx</link>
		<comments>http://blog.donews.com/pluskid/archive/2006/05/06/858347.aspx#comments</comments>
		<pubDate>Sat, 06 May 2006 05:21:00 +0000</pubDate>
		<dc:creator>gugu9527</dc:creator>
				<category><![CDATA[Emacs Tips]]></category>

		<guid isPermaLink="false">http://blog.donews.com/pluskid/archive/2006/05/06/858347.aspx</guid>
		<description><![CDATA[早上起来看到 Linuxsir 上面有个贴说 stardict 的网站上有新的辞典了，赶紧去下了一些下来，感觉不错。突发奇想想在 Emacs 里面弄个查辞典的功能，想想反正系统里面装了 stardict ，为何不直接用它来查呢？于是就查了一下关于 tooltip 以及 shell-command 相关的资料，写了这个小东西。]]></description>
			<content:encoded><![CDATA[<p>早上起来看到 Linuxsir 上面有个贴说 stardict 的网站上有新的辞典了，赶紧去下了一些下来，感觉不错。突发奇想想在 Emacs 里面弄个查辞典的功能，记得王垠的网站上有介绍的，看了下，好像是用什么 dictd 来查的，那个东西我不会用，而且好像没有英汉辞典的样子，想想反正系统里面装了 stardict ，为何不直接用它来查呢？于是就查了一下关于 tooltip 以及 shell-command 相关的资料，写了这个小东西：</p>
<pre class="example">;; author: pluskid<br/>;; 调用 stardict 的命令行接口来查辞典<br/>;; 如果选中了 region 就查询 region 的内容，<br/>;; 否则就查询当前光标所在的词<br/>(global-set-key [mouse-3] 'kid-star-dict)<br/>(defun kid-star-dict ()<br/>  (interactive)<br/>  (let ((begin (point-min))<br/>        (end (point-max)))<br/>    (if mark-active<br/>        (setq begin (region-beginning)<br/>              end (region-end))<br/>      (save-excursion<br/>        (backward-word)<br/>        (mark-word)<br/>        (setq begin (region-beginning)<br/>              end (region-end))))<br/>    ;; 有时候 stardict 会很慢，所以在回显区显示一点东西<br/>    ;; 以免觉得 Emacs 在干什么其他奇怪的事情。<br/>    (message &quot;searching for %s ...&quot; (buffer-substring begin end))<br/>    (tooltip-show <br/>     (shell-command-to-string <br/>      (concat &quot;sdcv -n &quot; <br/>              (buffer-substring begin end))))))<br/></pre>
<p>呵呵！效果还不错的，不过只是自己玩玩，因为 stardict 本身就带有屏幕取词的功能的。但是如果在 Emacs 里面查询的话，就不用另外开一个 stardict 了，而且可以绑定到自己喜欢的快捷键。呵呵！效果如图，还不错吧？<br/><br/><center><img width="608" height="540" src="/images/blog_donews_com/pluskid/emacs-stardict.png" alt=""/></center><br type="_moz"/></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/pluskid/archive/2006/05/06/858347.aspx/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>browse-kill-ring 试用</title>
		<link>http://blog.donews.com/pluskid/archive/2006/05/06/858341.aspx</link>
		<comments>http://blog.donews.com/pluskid/archive/2006/05/06/858341.aspx#comments</comments>
		<pubDate>Sat, 06 May 2006 05:14:00 +0000</pubDate>
		<dc:creator>gugu9527</dc:creator>
				<category><![CDATA[Emacs Tips]]></category>

		<guid isPermaLink="false">http://blog.donews.com/pluskid/archive/2006/05/06/858341.aspx</guid>
		<description><![CDATA[是否 kill-ring 里面有太多的东西？每次 C-y 之后都 M-y M-y M-y ... N 次才找到想要的东西呢？很不爽是吧？那试试 browse-kill-ring.el 吧！这是一个让你能够浏览你的 kill-ring 的东西，他还有一个增强插件 browse-kill-ring+.el ，让我们来试用一下吧：]]></description>
			<content:encoded><![CDATA[<p>是否 kill-ring 里面有太多的东西？每次 C-y 之后都 M-y M-y M-y &#8230; N 次才找到想要的东西呢？很不爽是吧？那试试 <a href="http://www.emacswiki.org/cgi-bin/wiki/browse-kill-ring.el">browse-kill-ring.el</a> 吧！这是一个让你能够浏览你的 kill-ring 的东西，他还有一个增强插件 <a href="http://www.emacswiki.org/cgi-bin/wiki/browse-kill-ring%2b.el">browse-kill-ring+.el</a> ，让我们来试用一下吧：<br />把两个文件下载到你的 load-path 里面，然后在 ~/.emacs 里加上：</p>
<pre class="example">
;; browse-kill-ring 功能
(require 'browse-kill-ring)
(require 'browse-kill-ring+)
(global-set-key (kbd "C-c k") 'browse-kill-ring)
</pre>
<p>重新打开 Emacs 就可以用 browse-kill-ring 的功能了。现在先 kill 一些东西填填自己的 kill-ring 吧。然后，调出 browse-kill-ring ，我们把他绑定到了 C-c k 上面。看到新打开了一个窗口，在这里就可以随意浏览你 kill-ring 里面的内容了。下面列出了一些常用的功能：</p>
<table style="margin-left:5%;">
<tbody>
<tr>
<td>1. </td>
<td>RET</td>
<td>插入当前 kill-ring 的内容并关闭 browse-kill-ring 的窗口</td>
</tr>
<tr>
<td>2. </td>
<td>U</td>
<td>在原来那个窗口里面执行 Undo 命令</td>
</tr>
<tr></tr>
<tr>
<td>3. </td>
<td>e</td>
<td>编辑当前 kill-ring 项，编辑完之后按 C-c C-c 提交修改</td>
</tr>
<tr>
<td>4. </td>
<td>d</td>
<td>输出当前 kill-ring 项</td>
</tr>
<tr>
<td>5. </td>
<td>n</td>
<td>往前移动</td>
</tr>
<tr>
<td>6. </td>
<td>p</td>
<td>往后移动</td>
</tr>
<tr>
<td>7. </td>
<td>s</td>
<td>往前搜索</td>
</tr>
<tr>
<td>8. </td>
<td>r</td>
<td>往后搜索</td>
</tr>
<tr>
<td>9. </td>
<td>i</td>
<td>插入当前 kill-ring 项</td>
</tr>
<tr>
<td>10. </td>
<td>y</td>
<td>插入当前 kill-ring 项</td>
</tr>
<tr>
<td>11. </td>
<td>a</td>
<td>在末尾添加当前 kill-ring 项</td>
</tr>
<tr>
<td>12. </td>
<td>b</td>
<td>在开头插入当前 kill-ring 项</td>
</tr>
<tr>
<td>13. </td>
<td>o</td>
<td>插入当前 kill-ring 项，并把它提升到 kill-ring 的首部</td>
</tr>
<tr>
<td>14. </td>
<td>u</td>
<td>同上，但是插入之后关闭 browse-kill-ring 窗口</td>
</tr>
<tr>
<td>15. </td>
<td>x</td>
<td>插入当前 kill-ring 项，并把它从 kill-ring 中删除</td>
</tr>
<tr>
<td>16. </td>
<td>&lt;mouse-2&gt;&nbsp; </td>
<td>插入鼠标选中的内容</td>
</tr>
</tbody>
</table>
<p>最后，你可以用 ? 或者 h 来获取当前 mode 的描述，当然也就可以获得各命令的说明。而 browse-kill-ring+.el 为我们提供的功能是 toggle-browse-kill-ring-display-style ，绑定到 t 上，他可以让你选择在显示 kill-ring 的内容的时候是按原来的格式显示还是每个 kill-ring 项显示一行。值得注意的一点是，调用 browse-kill-ring 的时候他会记住你调用他的时候所在的那个窗口，如果你在这之后改变了窗口布局，然后在到 browse-kill-ring 的窗口里面去执行插入操作之类的，会把他搞迷糊，通常，他会显示一条错误信息。<br />
怎么样？方便吗？Just Enjoy! <img src='http://blog.donews.com/pluskid/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/pluskid/archive/2006/05/06/858341.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>给文本加个漂亮的小框</title>
		<link>http://blog.donews.com/pluskid/archive/2006/05/06/858335.aspx</link>
		<comments>http://blog.donews.com/pluskid/archive/2006/05/06/858335.aspx#comments</comments>
		<pubDate>Sat, 06 May 2006 05:06:00 +0000</pubDate>
		<dc:creator>gugu9527</dc:creator>
				<category><![CDATA[Emacs Tips]]></category>

		<guid isPermaLink="false">http://blog.donews.com/pluskid/archive/2006/05/06/858335.aspx</guid>
		<description><![CDATA[浏览邮件列表的时候经常看到有人发表这样的小框，很漂亮，也想自己弄一个，于是写了段 elisp 小代码，用来在 Emacs 里面把选中的区域加上边框。]]></description>
			<content:encoded><![CDATA[<p>浏览邮件列表的时候经常看到有人发表这样的小框，很漂亮：</p>
<pre class="example">
,----[ foo bar ]
| text in the box
| looks beautiful
`----
</pre>
<p>也想自己弄一个，于是写了段 elisp 小代码，用来在 Emacs 里面把选中的区域加上边框，elisp 代码如下：</p>
<pre class="example">
(defun kid-box-region (begin end title)
  (interactive "r\nsBox Title: ")
  (let ((old-buffer (current-buffer)))
    (switch-to-buffer (get-buffer-create "*kid-box-region-output*"))
    ;; 删除以前的内容，为防止误删东西，把他放在 kill-ring 里面
    (kill-region (point-min) (point-max))
    (insert-buffer-substring old-buffer begin end)
    (goto-char (point-min))
    (insert ",----------[ " title " ]\n")
    (replace-regexp "^" "| ")
    (goto-char (point-max))
    ;; 检查最后是否有换行
    (if (search-backward-regexp "^| $" (point-min) t)
         (delete-char 2)
       (insert "\n"))
    (insert "`----------\n")))
</pre>
<p>处理之后会变成这样，因为 lisp 缩进很多，为了变漂亮一点，我决定多加几个“-”：</p>
<pre class="example">
,----------[ kid-box-region ]
| (defun kid-box-region (begin end title)
|   (interactive "r\nsBox Title: ")
|   (let ((old-buffer (current-buffer)))
|     (switch-to-buffer (get-buffer-create "*kid-box-region-output*"))
|     ;; 删除以前的内容，为防止误删东西，把他放在 kill-ring 里面
|     (kill-region (point-min) (point-max))
|     (insert-buffer-substring old-buffer begin end)
|     (goto-char (point-min))
|     (insert ",----------[ " title " ]\n")
|     (replace-regexp "^" "| ")
|     (goto-char (point-max))
|     ;; 检查最后是否有换行
|     (if (search-backward-regexp "^| $" (point-min) t)
|          (delete-char 2)
|        (insert "\n"))
|     (insert "`----------\n")))
`----------
</pre>
<p>这下我也可以有漂亮的 box 了！ <img src='http://blog.donews.com/pluskid/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://blog.donews.com/pluskid/archive/2006/05/06/858335.aspx/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 0.307 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-11 13:44:00 -->
<!-- Compression = gzip -->
