﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>C++博客-Kevin Yang专栏-文章分类-Linux</title><link>http://www.cppblog.com/KevinYang/category/4743.html</link><description>技术改变生活</description><language>zh-cn</language><lastBuildDate>Tue, 20 May 2008 02:44:26 GMT</lastBuildDate><pubDate>Tue, 20 May 2008 02:44:26 GMT</pubDate><ttl>60</ttl><item><title>【分享】Linux下常用软件介绍</title><link>http://www.cppblog.com/KevinYang/articles/31344.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Fri, 31 Aug 2007 17:00:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/31344.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/31344.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/31344.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/31344.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/31344.html</trackback:ping><description><![CDATA[我觉得我现在的系统已经很满足我的需求了，很多朋友特别是初学者在<br>刚开始的时候觉得Linux比不上windows是因为没有那么多好用的软件。<br>其实只是他们还没有真正进入Linux这个世界而已。Linux下的软件远比你<br>想像中的多，而且正在以你想像不到的开发速度进行者。<br>为了让初学者更快的融入Linux我列出了我觉得Linux下比较好的一些常用<br>软件，足以应对你平时的需求了。<br>浏览器：iceweasel原名firefox，在Linux下改名了。不过刚开始你会觉得<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 他启动浏览的有点慢，其实是字体渲染的问题。修改配置文件<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /usr/bin/firefox，找到export MOZ_DISABLE_PANGO在后面加上<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; =1<br>PDF:&nbsp;&nbsp; 推荐Adobe的，adobe现在已经开始加入了开源阵营， 7.0的Linux版<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Adobe Reader就是他送的一份大礼物。该软件兼容性很好，几乎没有<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 什么显示错位什么的问题，唯一的缺点就是启动稍微有点慢。另外有个<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 文档查看器不知道是debian自带的还是什么，也是挺好用的，启动非常<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 快，兼容性也不错。建议平时使用那个，如果文档出现问题再用adboe的<br>音乐:&nbsp;&nbsp; 可能大家都习惯了windows下的千千还是之前的那些经典播放器，对Linux下<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 的播放器不大习惯。这里推荐的一款叫audacious的软件就挺不错的，你只要<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 把音乐格式的插件装齐了（win32codcs）就可以了。软件也带有播放列表，音质<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 也挺好的，反正用起来挺舒服的。<br>视频：&nbsp; 视频基本Mplayer就可以搞定了，现在debian下面已经好像有包了，直接就可以<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装了，省去了以前的安装噩梦。如果要看在线电影的话推荐再装一个realplayer<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和adobe一样，real公司也对开源比较支持，所以将其产品Linux化了，大公司做<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 出来的产品用上去就是很不一样。<br>词典：&nbsp; 星际译霸，stardict，这是最好的一款了我觉得，主要是词库比较丰富，界面比较<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 朴素，但很实用，带取词和在线翻译什么的。<br>输入法: 推荐fcitx，比起紫光来有过之而无不及。<br>图片管理：Google公司的picasa，用过的人应该挺多的，也有linux版本的，直接就可以<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 安装了，唯一不足是对中文的支持不好。不知道改进了没有<br><span style="text-decoration: underline;"></span>开发：&nbsp; 习惯终端下开发的话vim加插件挺好的选择。用惯IDE的人，那么推荐Ecllipse和<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Kdevelop这两款都是Linux下最优秀的IDE平台之一。<br>聊天：&nbsp; lumaqq是公认最好的qq客户端了，不过我个人使用经常登不上去，所以现在不怎么用<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 用qq了。也可以用gaim，多协议客户端，gtalk也是用这个来登录的。<br><br><br>暂时先写这么多吧，以后再补充。<br>有什么问题大家可以一起讨论<br><span style="text-decoration: underline;"></span><span style="text-decoration: underline;"><br></span><img src ="http://www.cppblog.com/KevinYang/aggbug/31344.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-09-01 01:00 <a href="http://www.cppblog.com/KevinYang/articles/31344.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【经验】将fcitx设置为系统默认启动输入法</title><link>http://www.cppblog.com/KevinYang/articles/31343.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Fri, 31 Aug 2007 16:35:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/31343.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/31343.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/31343.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/31343.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/31343.html</trackback:ping><description><![CDATA[只需要修改在/etc/X11/xinit/xinit.d/下面的zh_CN文件就可以，发一下我的配置文件。<br>系统Debian<br>
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>--><span style="color: #000000;">#<br>#&nbsp;Use&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">X&nbsp;input&nbsp;Method</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;for&nbsp;all&nbsp;applications<br>#<br>#&nbsp;Per&nbsp;Ming's&nbsp;Documentation&nbsp;in&nbsp;SCIM</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;XIM&nbsp;Input&nbsp;Method&nbsp;is&nbsp;activated<br>#&nbsp;not&nbsp;only&nbsp;for&nbsp;old&nbsp;X-applications&nbsp;but&nbsp;also&nbsp;for&nbsp;GTK&nbsp;and&nbsp;QT&nbsp;appplication.<br>#<br>#&nbsp;If&nbsp;a&nbsp;user&nbsp;wish&nbsp;to&nbsp;use</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;GTK&nbsp;Input&nbsp;Method</span><span style="color: #000000;">,</span><span style="color: #000000;">&nbsp;(s)he&nbsp;can&nbsp;right-click&nbsp;input&nbsp;<br>#&nbsp;area&nbsp;and&nbsp;select&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">Input&nbsp;Methods</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;and&nbsp;change&nbsp;from&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">X&nbsp;input&nbsp;Method</span><span style="color: #000000;">"</span><span style="color: #000000;">&nbsp;to&nbsp;<br>#&nbsp;</span><span style="color: #000000;">"</span><span style="color: #000000;">SCIM&nbsp;Input&nbsp;Method</span><span style="color: #000000;">"</span><span style="color: #000000;">.<br>#<br><br>XIM</span><span style="color: #000000;">=</span><span style="color: #000000;">fcitx<br>XIM_PROGRAM</span><span style="color: #000000;">=</span><span style="color: #000000;">/usr/bin/fcitx<br>XIM_ARGS</span><span style="color: #000000;">=</span><span style="color: #000000;">"</span><span style="color: #000000;">-d</span><span style="color: #000000;">"</span><span style="color: #000000;"><br>GTK_IM_MODULE</span><span style="color: #000000;">=</span><span style="color: #000000;">fcitx<br>QT_IM_MODULE</span><span style="color: #000000;">=</span><span style="color: #000000;">fcitx<br></span></div>
最好备份一下源文件以备以后恢复用（Vim会自动帮你备份的），不过fcitx我觉得已经是相当好了，完全超过了紫光的准确度了。不过当然比不上现在windows上最流行的搜狗输入法了。<br><br><img src ="http://www.cppblog.com/KevinYang/aggbug/31343.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-09-01 00:35 <a href="http://www.cppblog.com/KevinYang/articles/31343.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>[网络摘录]Vim使用技巧</title><link>http://www.cppblog.com/KevinYang/articles/30906.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Sun, 26 Aug 2007 18:59:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/30906.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/30906.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/30906.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/30906.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/30906.html</trackback:ping><description><![CDATA[# 信息来源 <br> ---------------------------------------- <br> www.vim.org &nbsp; &nbsp; &nbsp; &nbsp; : 官方站点 <br> comp.editors &nbsp; &nbsp; &nbsp; &nbsp;: 新闻组 <br> <img  src="http://forum.byr.cn/wForum/pic/url.gif" align="absmiddle" border="0"><a  href="http://www.newriders.com/books/opl/ebooks/0735710015.html" target="_blank">http://www.newriders.com/books/opl/ebooks/0735710015.html</a> : Vim书籍 <br> <img  src="http://forum.byr.cn/wForum/pic/url.gif" align="absmiddle" border="0"><a  href="http://vimdoc.sourceforge.net/cgi-bin/vim2html2.pl" target="_blank">http://vimdoc.sourceforge.net/cgi-bin/vim2html2.pl</a> : 关于vim的可查询文档 <br> <img  src="http://forum.byr.cn/wForum/pic/url.gif" align="absmiddle" border="0"><a  href="http://vimdoc.sourceforge.net/vimfaq.html" target="_blank">http://vimdoc.sourceforge.net/vimfaq.html</a> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: VIM FAQ <br> ---------------------------------------- <br> # 基础 <br> ---------------------------------------- <br> * # g* g# &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 寻找光标处的狭义单词(&lt;cword&gt;) (前向/后向) <br> % &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 括号配对寻找 {}[]() <br> matchit.vim &nbsp; &nbsp; &nbsp; &nbsp; : 使得 % 能够配对标记 &lt;tr&gt;&lt;td&gt;&lt;script&gt; &lt;?php 等等 <br> &lt;C-N&gt;&lt;C-P&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 插入模式下的单词自动完成 <br> &lt;C-X&gt;&lt;C-L&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 行自动完成(超级有用) <br> /&lt;C-R&gt;&lt;C-W&gt; &nbsp; &nbsp; &nbsp; &nbsp; : 把狭义单词 &lt;cword&gt; 写到 搜索命令 行 <br> /&lt;C-R&gt;&lt;C-A&gt; &nbsp; &nbsp; &nbsp; &nbsp; : 把广义单词 &lt;cWORD&gt; 写到 搜索命令 行 <br> :set ignorecase &nbsp; &nbsp; : 搜索时忽略大小写 <br> :syntax on &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 在 Perl,HTML,PHP 等中进行语法着色 <br> :h regexp&lt;C-D&gt; &nbsp; &nbsp; &nbsp;: 按下 control-D 键即可得到包含有 regexp 的帮助主题的列表 <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : (使用TAB可以实现帮助的自动补齐) <br> ---------------------------------------- <br> # 使更新 _vimrc 更容易 <br> :nmap ,s :source $VIM/_vimrc # 译释：nmap 是绑定一个在normal模式下的快捷键 <br> :nmap ,v :e $VIM/_vimrc <br> # 译释：在normal模式下，先后按下 ,s 两个键执行_vimrc，而 ,v 则是编辑_vimrc <br> ---------------------------------------- <br> # visual 模式 (例子是：轻松添加其他的 HTML Tags) <br> :vmap sb "zdi&lt;b&gt;&lt;C-R&gt;z&lt;/b&gt;&lt;ESC&gt; &nbsp;:在visual模式下选中的文字前后分别加上&lt;b&gt;和&lt;/b&gt; <br> # 译释：vmap 是绑定一个在visual模式下的快捷键 <br> &nbsp;<br> # 译释：原理：在visual模式下，"zd 把一个选中的区域命名为z 然后删除， <br> # i 进入插入模式，输入&lt;b&gt;，&lt;C-R&gt;z 撤销刚才的删除,然后再写入&lt;/b&gt;， <br> # 最后&lt;ESC&gt;返回normal模式 <br> &nbsp;<br> # 译释："z 命令创建一个选中的区域为register，并把它命名为z <br> &nbsp;<br> # 译释：更令人开心的有：在visual模式下选中几行，然后输入 2&gt; , <br> # &nbsp; &nbsp; &nbsp; 则选中的行会全部缩进两个tab <br> # &nbsp; &nbsp; &nbsp; 555,偶一开始还是用 :xx,xx s/^/\t\t/，好傻啊！ <br> &nbsp;<br> :vmap st "zdi&lt;?= &lt;C-R&gt;z ?&gt;&lt;ESC&gt; &nbsp;:在visual模式下选中的文字前后分别加上&lt;?= 和 ?&gt; <br> ---------------------------------------- <br> # 文件浏览 <br> :Ex &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 开启目录浏览器，注意首字母E是大写的 <br> :Sex &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 在一个分割的窗口中开启目录浏览器 <br> :ls &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 显示当前buffer的情况 <br> :cd .. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 进入父目录 <br> :args &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 显示目前打开的文件 <br> :lcd %:p:h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 更改到当前文件所在的目录 <br> # 译释：lcd是紧紧改变当前窗口的工作路径，% 是代表当前文件的文件名, <br> # 加上 :p扩展成全名（就是带了路径），加上 :h析取出路径 <br> &nbsp;<br> :autocmd BufEnter * lcd %:p:h &nbsp; : 自动更改到当前文件所在的目录 <br> # 译释：autocmd指定一个自动命令，BufEnter指定一个事件，* 指定事件的对象， <br> # lcd %:p:h 指定一个动作 <br> # hehe,好像和写记叙文差不多 <br> ---------------------------------------- <br> # 缓冲区(buffer)浏览器 (第三方的一个最流行的脚本) <br> # 需要下载 bufexplorer.vim ，<img  src="http://forum.byr.cn/wForum/pic/url.gif" align="absmiddle" border="0"><a  href="http://www.vim.org/script.php?script_id=42" target="_blank">http://www.vim.org/script.php?script_id=42</a> 上就有 <br> \be &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 在缓冲区浏览器中打开缓冲区列表 <br> \bs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 以分割窗口的形式打开缓冲区浏览器 <br> ---------------------------------------- <br> # 大小写转换 <br> guu &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 行小写 <br> gUU &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 行大写 <br> g~~ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 行翻转（当然指大小写啦） <br> # 译释： g 是大小写转换命令(greate)，u/U/~是三种转换形式(小写/大写/翻转)， <br> # 最后一个重复则表示该转换是对于一行而言的 <br> &nbsp;<br> guw &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 字大写(狭义字) 译注：建议对比iw <br> gUw &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 字小写(狭义字) <br> g~w &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 字翻转(狭义字) <br> # 译释：最后一个w 表示该转换是对于一个字而言的，由于是在normal模式下， <br> # 所以这个w 表示一个狭义字&lt;cword&gt; &nbsp;<br> &nbsp;<br> vEU &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 字大写(广义字) <br> vE~ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 字翻转(广义字) <br> # 译释：vE 这个指令组合会进入visual模式，然后选择一个广义字&lt;CWORD&gt; <br> &nbsp;<br> ggguG &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 把整个文章全部小写（ft!bt!） <br> gf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 取当前光标处的广义字作为文件名，然后试图打开它！ <br> # 译释：为什么是广义字呢？因为这样可以方便的取到路径啊，像/var/www/html/index.htm <br> &nbsp;<br> ga &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 显示光标处字符的ascii,hex,oct,...晕菜的一堆转换 <br> ggVGg? &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 用rot13编码整个文件（晕！） <br> # 译释：gg到文件首行首字符，V进入Visual-Line模式，G到文件末行首字符， <br> # &nbsp; &nbsp; &nbsp; 这样就选中了整篇文章，然后g?就是用rot13编码整个文件啦 <br> # &nbsp;<br> # 【关于rot13——谁让英文是偶数个字母啊】 <br> # ROT13 是一种简单的编码，它把字母分成前后两组，每组13个，编码和解码 <br> # 的算法相同，仅仅交换字母的这两个部分，即：[a..m] --&gt; [n..z] 和 [n..z] <br> # --&gt; [a..m] 。 ROT13 用简易的手段使得信件不能直接被识别和阅 <br> # 读，也不会被搜索匹配程序用通常的方法直接找到。经常用于 USENET 中发表一 <br> # 些攻击性或令人不快的言论或有简单保密需要的文章。 <br> # 由于 ROT13 是自逆算法，所以，解码和编码是同一个过程。 <br> &nbsp;<br> &lt;C-A&gt;,&lt;C-X&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 增加,减少 光标处的狭义字所表示的数字 <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :（,仅仅是分割了这两个命令，不是命令的一部分） <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : Win32的用户可能需要重新定义一下Ctrl-A，呵呵 <br> # 译注：good guy, 令人不得不想到perl的数字串 <br> &nbsp;<br> &lt;C-R&gt;=5*5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 插入25 (这是一个迷你计算器耶！) <br> ---------------------------------------- <br> # 好玩的东东 <br> :h 42 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 也可以访问 <img  src="http://forum.byr.cn/wForum/pic/url.gif" align="absmiddle" border="0"><a  href="http://www.google.com/search?q=42" target="_blank">http://www.google.com/search?q=42</a> <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 第一个结果就是 News. Douglas Adams 1952 - 2001. &nbsp;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: Floor 42 extends its deepest sympathies to <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: the family, friends, and fans of Douglas Adams. <br> :h holy-grail <br> :h! <br> ---------------------------------------- <br> # 标记和移动 <br> '. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 跳到最后修改的那一行 (超级有用)(ft,怎么又是这个评价) <br> `. &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 不仅跳到最后修改的那一行，还要定位到修改点 <br> &lt;C-O&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 依次沿着你的跳转记录向回跳 (从最近的一次开始) <br> &lt;C-I&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 依次沿着你的跳转记录向前跳 <br> :ju(mps) &nbsp; &nbsp; &nbsp; &nbsp; : 列出你跳转的足迹 <br> :help jump-motions <br> :history &nbsp; &nbsp; &nbsp; &nbsp; : 列出历史命令记录 <br> :his c &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 命令行命令历史 <br> :his s &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 搜索命令历史 <br> q/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 搜索命令历史的窗口 <br> q: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 命令行命令历史的窗口 <br> :&lt;C-F&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 历史命令记录的窗口 <br> ---------------------------------------- <br> # 缩写和键盘映射(原文中文件举例都用了c:/aaa/x，偶全给他改成/path/file了，哼唧) <br> :map &nbsp; &lt;f7&gt; &nbsp; :'a,'bw! /path/file <br> # 译释：map是映射一个normal模式下的键 <br> # 这里是把F7键映射成把标记a到标记b中间的内容另存为一个文件/path/file <br> # 标记(mark)的方法：把光标移动到需要标记的地方，输入m，然后输入标记名，例如a <br> &nbsp;<br> # 引用标记的方法：'a ，即：单引号加标记名 <br> &nbsp;<br> :map &nbsp; &lt;f8&gt; &nbsp; :r /path/file # 译释：把F8键映射成在当前位置插入文件/path/file的内容 <br> :map &nbsp; &lt;f11&gt; &nbsp;:.w! /path/file2&lt;CR&gt; <br> # 译释：.（点号）表示当前行 <br> # 所以F11就是把当前行存为/path/file2 <br> # 最后的&lt;CR&gt;表示一个回车 <br> :map &nbsp; &lt;f12&gt; &nbsp;:r /path/file2&lt;CR&gt; <br> :ab php &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 列出php表示的缩写 <br> # 译释：定义一个缩写使用：:iab hm hmisty <br> # 一个有趣的现象是，它列出的会是php和它的前子串开头的缩写 <br> # 例如，有这么几个缩写： <br> # h =&gt; hmisty1 , hm =&gt; hmisty2 , hmi =&gt; hmisty3, m =&gt; hmisty4 <br> # 那么使用 :ab hm会显示这么几个缩写：hm 和 h <br> # 而不是你想象中的 hm 和 hmi <br> &nbsp;<br> :map , &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 列出以逗号开始的键盘映射 <br> # 译释：一般而言，我们称这些逗号开始的组合键为&#8220;逗号命令&#8221; <br> # 不过hmisty更喜欢用;构成&#8220;分号命令&#8221; <br> # 而且不是用map,而是用imap <br> # 因为偶懒么，懒得按&lt;Esc&gt;,所以直接在insert模式下就执行命令了 <br> # 为什么用分号呢？因为我最常用它写程序啊 <br> # perl/C/C++/object pascal/java，都是用分号结束一个语句 <br> # 我们一般很少在分号后面连续写其他字符 <br> # 所以用&#8220;分号＋其他键&#8221;就很少会在输入的时候造成冲突 <br> &nbsp;<br> # 在键盘映射中常用的表示 <br> &lt;CR&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 回车 <br> &lt;ESC&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: Esc <br> &lt;LEADER&gt; &nbsp; &nbsp; &nbsp; &nbsp; : 转义符号 \ <br> &lt;BAR&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 管道符号 | <br> ---------------------------------------- <br> # 列出寄存器(Registers) <br> :reg &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 显示所有当前的registers <br> "1p &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: "表示引用register，1表示一个名字叫做1的register， <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: p就是粘贴（paste）命令 <br> # 译释："也用来定义register <br> # 先输入 ",表示定义register <br> # 然后输入名字，如0~9,a~z <br> # 然后执行删除或复制命令，如dd或y， <br> # &nbsp; &nbsp; &nbsp; &nbsp; 或者是visual模式下的d(删除选中的部分)或y(复制选中的部分) <br> # 则被删除或复制的部分就被存入了这个命名的register <br> # <br> # 观察：一个特殊的register, "" ，里面存储了一个匿名的删除/复制 <br> # 在你执行dd或y的时候，被作用的部分被存到了""中 <br> # 这些和perl是多么像啊 <br> ---------------------------------------- <br> # Useful trick <br> "ayy@a &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 把当前行作为一个Vim命令来执行 <br> # 译释："ayy 是定义当前行到register a，然后@a是执行register a中存储的指令 <br> # yy: 复制一行 <br> # 10yy: 复制从此向下的10行 <br> &nbsp;<br> yy@" &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 用上面所提到的那个匿名register <br> ---------------------------------------- <br> # 从其他程序获取输出 (需要外部程序) <br> :r!ls.exe &nbsp; &nbsp; &nbsp; &nbsp;: 读取ls的输出到当前位置 <br> !!date &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 读取date的输出 (但是会替换当前行的内容) <br> # 译释：其实你输入了!!后，vim就自动转换到 :.! 等待你继续输入 <br> &nbsp;<br> # 使用外部程序sort进行排序(sort是Unix标准命令，ls,date也是) <br> :%!sort -u &nbsp; &nbsp; &nbsp; : 使用sort程序排序整个文件（用结果重写文件） <br> # 译释：%表示整个文件的所有行 <br> # !sort表示执行外部命令sort <br> # -u是sort的参数，man sort看看，这个参数的意义是合并相同的行 <br> # u就是unique,如果两行内容相同，则结果中只保留一行的说 <br> &nbsp;<br> :'a,'b!sort -u &nbsp; : 对mark a 到mark b中间的内容进行排序 <br> !1} sort -u &nbsp; &nbsp; &nbsp;: 排序当前段落 (只能在normal模式下使用!!) <br> # 译释：!表示使用filter，1}表示filter的对象是从当前行开始向后数一段 <br> # 段落指到空行处结束，不包括空行 <br> # 其实你一旦输入 !1}，vim就自动计算当前段落应该到那一行(eg.+5)，然后生成 <br> # :.,.+5! 等待之后输入sort -u，回车，完成操作 <br> # .表示当前行，.+5当然就是当前行向后数5行 <br> ---------------------------------------- <br> # 多文档操作 (基础) <br> # 译注：用 :ls! 可以显示出当前所有的buffer <br> :bn &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 跳转到下一个buffer <br> :bp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 跳转到上一个buffer <br> :wn &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 存盘当前文件并跳转到下一个(又是&#8220;超级&#8230;&#8230;&#8221;,ft!) <br> :wp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 存盘当前文件并跳转到上一个 <br> :bd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 把这个文件从buffer列表中做掉 <br> :bun &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 卸掉buffer (关闭这个buffer的窗口但是不把它从列表中做掉) <br> :badd file.c &nbsp; &nbsp; : 把文件file.c添加到buffer列表 <br> :b 3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 跳到第3个buffer <br> :b main &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 跳到一个名字中包含main的buffer,例如main.c &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : (ultra，这个怎么翻译？:() <br> :sav php.html &nbsp; &nbsp;: 把当前文件存为php.html并打开php.html <br> :sav! %&lt;.bak &nbsp; &nbsp; : 换一个后缀保存 <br> :e! &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 返回到修改之前的文件(修改之后没有存盘) <br> :w /path/% &nbsp; &nbsp; &nbsp; : 把文件存到一个地儿 <br> :e # &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 编辑标记为#的buffer(这个buffer必须含有一个可编辑的文件) <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 用ls命令就能看到哪一个buffer有# <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: %a表示当前正在编辑的buffer <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: u 表示不能编辑或者已经被做掉的buffer <br> :e #3 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 编辑编号为3的buffer(这个buffer必须含有一个可编辑的文件) <br> :rew &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 回到第一个可编辑的文件 <br> :brew &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 回到第一个buffer <br> :sp fred.txt &nbsp; &nbsp; : 在一个水平分割的窗口中打开文件fred.txt # 译注：vs fred.txt可以实现垂直分割 <br> :sball &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 把当前所有含有可编辑文件的buffer显示到一个分割窗口中 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: (偶该考虑把super翻译成 高级指令 了,ft) <br> :map &nbsp; &lt;F5&gt; :ls&lt;CR&gt;:e # : 在normal模式下按F5键，则会显示所有含有一个 <br> &nbsp;<br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 可编辑文件的buffer，然后提示你输入buffer的序号， <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 输入后回车，则编辑这个buffer <br> # 译注：这是一个键盘绑定 <br> &nbsp;<br> :set hidden &nbsp; &nbsp; &nbsp;: 允许不保存buffer而切换buffer (w/o=without) <br> ---------------------------------------- <br> # 在分割窗口中快速切换 <br> :map &lt;C-J&gt; &lt;C-W&gt;j&lt;C-W&gt;_ <br> # 译注：原文此处有误，前面应该加上冒号 <br> # 这是一个键盘绑定，把Ctrl-J定义成切换到下一个窗口并最大化 <br> :map &lt;C-K&gt; &lt;C-W&gt;k&lt;C-W&gt;_ <br> ---------------------------------------- <br> # 命令录制 (最佳技巧，ft) <br> qq &nbsp;#录制到q <br> .. #输入一系列复杂的指令 <br> q &nbsp; #再次按q停止录制 <br> @q &nbsp;#执行q中存储的指令 <br> @@ &nbsp;#重复执行 <br> # 编辑register/录制 <br> "ap #把register a中的内容贴到当前位置 <br> .. #现在你可以修改它了 <br> "add#删除之，重新存入register a &nbsp;<br> @a &nbsp;#执行register a中的指令 <br> ---------------------------------------- <br> # _vimrc基础 <br> :set incsearch &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 实时匹配你输入的内容 <br> :set wildignore=*.o,*.obj,*.bak,*.exe : tab键的自动完成现在会忽略这些 <br> :set shiftwidth=4 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 现在自动缩进将是4个字符 <br> # 译注：一个tab位通常是8个字符 <br> # 所以，我们还要设定 :set tabstop=4，这样，所有的缩进都是4字符了 <br> # emacs默认就是4字符缩进吧？ <br> :set vb t_vb=". &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 沉默方式(不要叫beep！) <br> ---------------------------------------- <br> # 加载windows iexplorer来浏览(我想这只有在windows下用gvim才能用到) <br> :nmap ,f :update&lt;CR&gt;:silent !start c:\progra~1\intern~1\iexplore.exe file://%:p <br> # 译释：nmap是做一个normal模式下的键盘绑定 <br> # 这里绑定了一个逗号命令 ,f <br> # :update是写这个文件，与:w不同，它只有当文件被修改了的时候才写 <br> # :silent别让弹出窗口报告执行结果 <br> # !...后面就是执行windows命令了。呵呵，去问bill gates什么意思吧。 <br> # 不过偶用gvim 6.1试过了，好用！ <br> &nbsp;<br> :nmap ,i :update&lt;CR&gt;: !start c:\progra~1\intern~1\iexplore.exe &lt;cWORD&gt;&lt;CR&gt; <br> ---------------------------------------- <br> # 用VIM编辑ftp文件 <br> :cmap ,r &nbsp;:Nread <img  src="http://forum.byr.cn/wForum/pic/url.gif" align="absmiddle" border="0"><a  href="ftp://209.51.134.122/public_html/index.html" target="_blank">ftp://209.51.134.122/public_html/index.html</a> <br> :cmap ,w &nbsp;:Nwrite <img  src="http://forum.byr.cn/wForum/pic/url.gif" align="absmiddle" border="0"><a  href="ftp://209.51.134.122/public_html/index.html" target="_blank">ftp://209.51.134.122/public_html/index.html</a> <br> # 译注：原文丢失了开头的冒号 <br> # cmap是命令(command)模式绑定 <br> &nbsp;<br> gvim <img  src="http://forum.byr.cn/wForum/pic/url.gif" align="absmiddle" border="0"><a  href="ftp://209.51.134.122/public_html/index.html" target="_blank">ftp://209.51.134.122/public_html/index.html</a> <br> # 这一句就是开始编辑一个ftp远端的文件，ft <br> ---------------------------------------- <br> # 附加到一个register (就是用大写的register名字啦！) <br> "a5yy #复制5行到a中 <br> 10j &nbsp; #下移10行 <br> "A5yy #再添加5行到a中 <br> ---------------------------------------- <br> [I &nbsp; &nbsp; : 显示光标处的狭义字可以匹配的行(高级指令) <br> # 译注：# 可以全文查找与光标处的狭义字相匹配的字， <br> # 这在查找函数原型和实现，或者变量使用的时候很有用 <br> ---------------------------------------- <br> # 常规缩进 <br> :'a,'b&gt;&gt; <br> # 译释：把mark a到mark b之间的内容进行两次缩进 <br> &nbsp;<br> # 在visual模式下缩进 (无限可重复) <br> :vnoremap &lt; &lt;gv <br> # 译释：:vnoremap 重定义了visual模式下 &lt; 符号的含义 <br> # 把它定义成 &lt;gv <br> # 即：先&lt;向外缩进，然后gv重新选择上一次选择了的区域 <br> # 这样在visual模式下就可以实现连续按&lt;而连续缩进了 <br> :vnoremap &gt; &gt;gv <br> # 同里，内缩 <br> ---------------------------------------- <br> # 查找（译注：建议先学习正则表达式） <br> # 译注：查找命令不用进入:命令模式，直接按/就可以了 <br> # 如果没有修饰，可以不要右边的/ <br> # 和smth bbs差不多啦，呵呵 <br> /joe/e &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 光标停留在匹配单词最后一个字母处 <br> /joe/e+1 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 光标停留在匹配单词最后一个字母的下一个字母处 <br> /joe/s &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 光标停留在匹配单词第一个字母处 <br> /^joe.*fred.*bill/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: ft,标准正则表达式 <br> /^[A-J]\+/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 找一个以A~J中一个字母重复两次或以上开头的行 <br> /forum\(\_.\)*pent &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 多行匹配 <br> /fred\_s*joe/i &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 中间可以有任何空白，包括换行符\n <br> # 译注：这个和perl不太一样的哦 <br> /fred\|joe &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 匹配FRED或JOE <br> /\&lt;fred\&gt;/i &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 匹配fred,fred必须是一个独立的单词，而不是子串 <br> # 译注：这和perl也不太一样，perl是用\b做单词定界符的 <br> /\&lt;\d\d\d\d\&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 匹配4个数字 <br> \&lt;\d\{4}\&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 也是匹配4个数字 <br> # 在visual模式下查找 <br> :vmap g/ y/&lt;C-R&gt;"&lt;CR&gt; &nbsp; &nbsp; &nbsp; : 匹配选中的高亮文字 <br> # 译释：vmap是在visual模式下的键盘映射 <br> # 映射了g/这个命令组合 <br> # y 把选中的高亮文字写入匿名register " <br> # / 打开搜索模式 <br> # &lt;C-R&gt; 准备粘贴register <br> # " 粘贴了""中的内容 <br> # &lt;CR&gt; 回车，执行 <br> &nbsp;<br> :vmap &lt;silent&gt; g/ &nbsp; &nbsp;y/&lt;C-R&gt;=escape(@", '\\/.*$^~[]')&lt;CR&gt;&lt;CR&gt; : with spec chars <br> # 译释：@#$&amp;^*@#%&amp;*#$@! <br> &nbsp;<br> # 跨行匹配，\_ 表示允许匹配换行符，或者说，允许匹配新行 <br> # 译注：小心，和perl不一样 <br> /&lt;!--\_p\{-}--&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 匹配多行注释 <br> /fred\_s*joe/i &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 似乎上面有了，ft <br> /bugs\(\_.\)*bunny &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 中间可以有无数东西 <br> :h \_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 看看关于 \_ 的帮助 <br> &nbsp;<br> # 查找当前光标位置所在子例程/函数(subroutine/function)的声明 <br> :nmap gx yiw/^\(sub\&lt;bar&gt;function\)\s\+&lt;C-R&gt;"&lt;CR&gt; <br> # 译释：nmap 做一个normal模式下的键盘绑定 <br> # y 进入复制状态，后面需要一个motion <br> # 接着就用 iw 指出了这个motion,是inner word <br> # inner word也是狭义字&lt;cword&gt;，但是和 w 不同 <br> # w 是从光标位置开始向后看 <br> # 而inner word总是把光标移到第一个字母，从而总能得到一个完整的狭义字 <br> # 试一试 gUw 和 gUiw 就知道区别了，呵呵。 <br> &nbsp;<br> # 在多个文档中搜索 <br> :bufdo /searchstr &nbsp;<br> :argdo /searchstr <br> ---------------------------------------- <br> # 替换 <br> # 译注：替换命令需要先进入:命令模式 <br> &nbsp; <br> :%s/fred/joe/igc &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 一个常见的替换命令，修饰符igc和perl中一样意思 <br> :%s/\r//g &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 删除DOS方式的回车^M <br> :%s= &nbsp;*$== &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 删除行尾空白 <br> :'a,'bg/fred/s/dick/joe/igc : 非常有用！（ft,又来了！） <br> # 译释：'a,'b指定一个范围：mark a ~ mark b <br> # g//用一个正则表达式指出了进行操作的行必须可以被fred匹配 <br> # 看后面，g//是一个全局显示命令 <br> # s/dick/joe/igc则对于这些满足条件的行进行替换 <br> &nbsp;<br> # 列复制 <br> # 译注：@#%&amp;^#*^%#$! <br> :%s= [^ ]\+$=&amp;&amp;= &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 复制最后一列 <br> :%s= \f\+$=&amp;&amp;= &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 一样的功能 <br> :%s= \S\+$=&amp;&amp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : ft,还是一样 # 反向引用，或称记忆 <br> :s/\(.*\):\(.*\)/\2 : &nbsp;\1/ &nbsp;: 颠倒用:分割的两个字段 <br> :%s/^\(.*\)\n\1/\1$/ &nbsp; &nbsp; &nbsp; &nbsp;: 删除重复行 # 非贪婪匹配，\{-} <br> :%s/^.\{-}pdf/new.pdf/ &nbsp; &nbsp; &nbsp;: 只是删除第一个pdf # 跨越可能的多行 <br> :%s/&lt;!--\_.\{-}--&gt;// &nbsp; &nbsp; &nbsp; &nbsp;: 又是删除多行注释（咦？为什么要说&#8220;又&#8221;呢？） <br> :help /\{-} &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 看看关于 非贪婪数量符 的帮助 <br> :s/fred/&lt;c-r&gt;a/g &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 替换fred成register a中的内容，呵呵 # 写在一行里的复杂命令 <br> :%s/\f\+\.gif\&gt;/\r&amp;\r/g | v/\.gif$/d | %s/gif/jpg/ <br> # 译注：就是用 | 管道啦 <br> &nbsp;<br> # 或者 <br> :%s/suck\|buck/loopy/gc &nbsp; &nbsp; : 或者(或者需要\，ft！，|不是或者) <br> # ft, \不就是转义了么！这个和perl真是不同了！ <br> &nbsp;<br> # 调用VIM函数 <br> :s/__date__/\=strftime("%c")/ : 插入时间串 <br> &nbsp;<br> # 处理列，替换所有在第三列中的str1 <br> :%s:\(\(\w\+\s\+\)\{2}\)str1:\1str2: <br> &nbsp;<br> # 交换第一列和最后一列 (共4列) <br> :%s:\(\w\+\)\(.*\s\+\)\(\w\+\)$:\3\2\1: <br> &nbsp;<br> # filter all form elements into paste register <br> # 把所有的form元素（就是html里面的form啦）放到register里？ <br> # ft, 头疼，不解释了 <br> :redir @*|sil exec 'g#&lt;\(input\|select\|textarea\|/\=form\)\&gt;#p'|redir END <br> :nmap ,z :redir @*&lt;Bar&gt;sil exec 'g@&lt;\(input\&lt;Bar&gt;select\&lt;Bar&gt;textarea\&lt;Bar&gt;/\=fo <br> # 上面这一行不能完全显示，最好Copy Article下去看 <br> &nbsp;<br> ---------------------------------------- <br> # 全局(global)显示命令，就是用 :g＋正则表达式 <br> # 译释： :g/{pattern}/{cmd} 就是全局找到匹配的行 <br> # 然后对这些行执行命令{cmd} <br> :g/\&lt;fred\&gt;/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 显示所有能够为单词fred所匹配的行 <br> :g/&lt;pattern&gt;/z#.5 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 显示内容，还有行号，呵呵 <br> :g/&lt;pattern&gt;/z#.5|echo "==========" &nbsp;: 漂亮的显示，ft! <br> &nbsp;<br> # 全局命令 (其他) <br> :g/^\s*$/d &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 删除所有空行 <br> :g!/^dd/d &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 删除不含字串'dd'的行 <br> :v/^dd/d &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 同上 # 译释：v == g!，就是不匹配！ <br> :g/fred/,/joe/d &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : not line based (very powerfull) <br> :v/./.,/./-1join &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 压缩空行 <br> :g/^$/,/./-j &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 压缩空行 <br> :g/&lt;input\|&lt;form/p &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 或者 要用\| <br> :g/^/pu _ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 把文中空行扩增一倍 (pu = put) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 即：原来两行间有一个空行，现在变成2个 <br> :g/^/m0 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 按行翻转文章 (m = move) <br> :g/fred/t$ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 拷贝行，从fred到文件末尾(EOF) <br> :%norm jdd &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 隔行删除 <br> # 译释：% 指明是对所有行进行操作 <br> # norm指出后面是normal模式的指令 <br> # j是下移一行，dd是删除行 <br> &nbsp;<br> # incrementing numbers <br> :.,$g/^\d/exe "norm! \&lt;c-a&gt;" : 增加在BOL(beginning of line)处的数字 <br> # 译注：.,$ 指明命令从当前行执行到最后一行 <br> # 如果没有 .,$ 限定范围，那么g//就会对整个文件进行操作 <br> # exe 是执行后面的命令组合 <br> &nbsp;<br> :.,$g/^\d/exe "norm \&lt;c-p&gt;" &nbsp;: Win32下必须重定义Ctrl-A <br> &nbsp;<br> # 保存全局命令的结果 (注意必须使用添加模式) <br> :g/fred/y A &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 添加所有为fred所匹配的行到register a <br> :'a,'b g/^Error/ . w &gt;&gt; errors.txt <br> &nbsp;<br> # 复制每一行，然后在复制出来的每一行两侧加上一个 print '复制出来的内容' <br> :g/./yank|put|-1s/'/"/g|s/.*/Print '&amp;'/ <br> ---------------------------------------- <br> # 全局命令和替换命令联姻 (强大的编辑能力) <br> :'a,'bg/fred/s/joe/susan/gic : 可以使用反向引用来匹配 <br> :g/fred/,/joe/s/fred/joe/gic : &nbsp;non-line based (ultra) <br> ---------------------------------------- <br> # 先找fred，然后找joe，然后#$^$%^#$%^@%^%&amp;%^*! <br> :/fred/;/joe/-2,/sid/+3s/sally/alley/gIC <br> ---------------------------------------- <br> # 重定向到register * 和 粘贴register * <br> :redir @* &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 重定向命令的输出结果（最下方命令行上的结果） &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 到register * (ft,* 代表0~1,a~z,..) <br> :redir END &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 结束重定向 <br> # 处理粘贴 <br> "*yy &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 上面讲过了，就是复制到register *中 <br> "*p &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 然后贴出来 <br> ---------------------------------------- <br> :redir &gt;&gt; out.txt &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 重定向到一个文件 <br> ---------------------------------------- <br> # 重新格式化文本 <br> gq&lt;CR&gt; <br> gqap &nbsp;(a是motion p是段落(visual模式)) <br> ggVGgq &nbsp;重新格式化整个文章 <br> ---------------------------------------- <br> # 对多个文档实施命令 <br> :argdo %s/foo/bar/ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 对所有:args列表中的文档执行命令 <br> :bufdo %s/foo/bar/ <br> :windo %s/foo/bar/ <br> :argdo exe '%!sort'|w! &nbsp; &nbsp; &nbsp; : 使用外部命令 <br> ---------------------------------------- <br> # 命令行的一些好玩的东东 <br> gvim -h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 启动的时候启动帮助(Win32) <br> vi -h 或 vim -h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 这个是unix下用 <br> ls | gvim - &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 编辑一个数据流！ <br> gvim -o file1 file2 &nbsp; &nbsp; &nbsp; &nbsp;: 以分割窗口打开两个文件 <br> &nbsp;<br> # 指出打开之后执行的命令 <br> gvim.exe -c "/main" joe.c &nbsp;: 打开joe.c，然后跳转到'main' <br> &nbsp;<br> # 对一个文件执行多个命令 <br> vim -c "%s/ABC/DEF/ge | update" file1.c <br> &nbsp;<br> # 对一组文件执行多个命令 <br> vim -c "argdo %s/ABC/DEF/ge | update" *.c <br> &nbsp;<br> # 自动编辑文件 (编辑命令序列Ex commands已经包含在convert.vim中了) <br> vim -s "convert.vim" file.c <br> &nbsp;<br> # 不要加载.vimrc和任何plugins (启动一个干净的VIM) <br> gvim -u NONE -U NONE -N <br> ---------------------------------------- <br> # GVIM 不同的地方 <br> gvim -d file1 file2 &nbsp; &nbsp; &nbsp; &nbsp;: vimdiff (比较不同) <br> dp &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 把光标处的不同放到另一个文件 <br> do &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 在光标处从另一个文件取得不同 <br> ---------------------------------------- <br> # Vim陷阱 <br> # 在vim的正则表达式中， + 和 | 都必须加转义符 \ <br> # 小心，这和perl不一样！ <br> /fred\+/ &nbsp; &nbsp; &nbsp;: 匹配fred或freddy但是不匹配free <br> ---------------------------------------- <br> # \v ，或叫做very magic (通常都是这么叫)可以取消转义符 <br> /codes\(\n\|\s\)*where &nbsp;: 普通的正则表达式 <br> /\vcodes(\n|\s)*where &nbsp; : very magic，| 不用加 \ 了！ <br> &nbsp;<br> ---------------------------------------- <br> # 把东西送到命令行/搜索行 (SUPER:偶不再翻译这种叹词了) <br> &lt;C-R&gt;&lt;C-W&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 送一个狭义词 <br> &lt;C-R&gt;&lt;C-A&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 送一个广义词 <br> &lt;C-R&gt;- &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 送一个小型删除寄存器register <br> &lt;C-R&gt;[0-9a-z] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 送一个命名寄存器register <br> &lt;C-R&gt;% &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 送文件名过去 (#也行) <br> ---------------------------------------- <br> # 操作寄存器 <br> :let @a=@_ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 清除register a <br> :let @*=@a &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 寄存器赋值 <br> :map &nbsp; &lt;f11&gt; "qyy:let @q=@q."zzz" <br> # 译注：猜猜这个无聊的绑定是什么意思？ <br> ---------------------------------------- <br> # 关于帮助的帮助 <br> :h quickref &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 翻到VIM Quick Reference页(有用！) <br> :h tips &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : Vim自己的tips <br> :h visual&lt;C-D&gt;&lt;tab&gt; &nbsp; &nbsp; : 得到一个关于visual关键字的帮助列表 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 然后用tab键去选择 <br> :h ctrl&lt;C-D&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 显示所有关于Ctrl的帮助 <br> :h :r &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : :ex冒号命令 <br> :h CTRL-R &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 普通模式命令 <br> :h \r &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : \r在正则表达式中是什么意思呢？ <br> :h i_CTRL-R &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : insert模式下的Ctrl-R <br> :h c_CTRL-R &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 命令行(command-line)模式下的Ctrl-R <br> :h v_CTRL-V &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : visual模式下的Ctrl-V <br> :h tutor &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: VIM 指南 <br> gvim -h &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 关于 VIM 命令的帮助 <br> vi/vim -h <br> &lt;C-S&gt;T &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: Control Shift T go backwards in help <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 偶不清楚有什么用:( <br> ---------------------------------------- <br> # 选项设置在哪里？ <br> :scriptnames &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 列出所有加载的 plugins, _vimrcs <br> :verbose set history &nbsp; &nbsp;: 显示history的值并指出设置文件的位置 <br> ---------------------------------------- <br> # 制作你自己的VIM帮助 <br> :helptags /vim/vim61/doc &nbsp;: 重建 /doc 中所有的 *.txt 帮助文件 <br> :help add-local-help <br> ---------------------------------------- <br> # 用外部程序来运行程序 (例如 perl :) <br> map &nbsp; &lt;f2&gt; &nbsp; :w&lt;CR&gt;:!perl -c %&lt;CR&gt; <br> # 译释：:w&lt;CR&gt;写文件 <br> # :!perl -c %&lt;CR&gt;用perl来运行当前文件 <br> # 当前文件必须有文件名！ <br> ---------------------------------------- <br> # 插入DOS换行符 <br> :%s/nubian/&lt;C-V&gt;&lt;C-M&gt;&amp;/g &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: &nbsp;Ctrl-V是一种转义，它说要解释&lt;C-M&gt; <br> :%s/nubian/&lt;C-Q&gt;&lt;C-M&gt;&amp;/g &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: &nbsp;对于Win32应该这样 <br> :%s/nubian/^M&amp;/g &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: &nbsp;你看到的^M是一个字符 <br> :%s/nubian/\r&amp;/g &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: &nbsp;更好的形式 <br> ---------------------------------------- <br> # 把最后一个命令贴到当前位置 <br> i&lt;c-r&gt;: <br> # 把最后一个搜索指令贴到当前位置 <br> i&lt;c-r&gt;/ <br> # 译释：i是进入insert模式， <br> # Ctrl-r是开启插入模式下register的引用 <br> # :和/分别引用了两个register的内容 <br> ---------------------------------------- <br> # 更多的完成功能 <br> &lt;C-X&gt;&lt;C-F&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;:插入当前目录下的一个文件名到当前位置 <br> # 在insert模式下使用 <br> # 然后用 Ctrl-P/Ctrl-N 翻页 <br> ---------------------------------------- <br> # 替换一个visual区域 <br> # 选择一个区域，然后输入 :s/Emacs/Vim/ 等等，vim会自动进入:模式 <br> :'&lt;,'&gt;s/Emacs/Vim/g &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 前面的'&lt;,'&gt;是vim自动添加的 <br> ---------------------------------------- <br> # 在文件中插入行号(不是显示行号，是插入！) <br> :g/^/exec "s/^/".strpart(line(".")." &nbsp; &nbsp;", 0, 4) <br> ---------------------------------------- <br> # 用VIM的方式来编号行 <br> :set number &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :显示行号 <br> :set nonu &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; :取消显示 <br> :%s/^/\=strpart(line('.')." &nbsp; &nbsp; &nbsp; &nbsp;",0,&amp;ts) <br> &nbsp;<br> #从任意行开始编号(需要perl，嘿嘿) <br> :'a,'b!perl -pne 'BEGIN{$a=223} substr($_,2,0)=$a++' <br> #似乎有点小问题，你试试看:) <br> &nbsp;<br> qqmnYP`n^Aq &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 记录到q 然后用 @q 重复 <br> #似乎不能工作，你试试看:) <br> &nbsp;<br> # 递增已存在数字到文件末 <br> :.,$g/^\d/exe "normal! \&lt;c-a&gt;" <br> &nbsp;<br> # 高级递增，看： <br> <img  src="http://forum.byr.cn/wForum/pic/url.gif" align="absmiddle" border="0"><a  href="http://vim.sourceforge.net/tip_view.php?tip_id=150" target="_blank">http://vim.sourceforge.net/tip_view.php?tip_id=150</a> <br> ---------------------------------------- <br> # 高级递增 ("真的很有用"，ft) <br> " 把下面几句放到 _vimrc #vimrc脚本用 " 做行注释符 <br> let g:I=0 <br> function! INC(increment) <br> let g:I =g:I + a:increment <br> return g:I <br> endfunction <br> " 例如从mark a 到mark b 递增，从223开始，步长为5 <br> :let I=223 <br> :'a,'bs/$/\=INC(5)/ <br> " (原文：create a map for INC) &nbsp;<br> " 但是cab是清楚命令行缩写啊？怎么回事？ <br> cab viminc :let I=223 \| 'a,'bs/$/\=INC(5)/ <br> ---------------------------------------- <br> # 加密(小心使用，不要忘了密码) <br> &nbsp;<br> :X &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 然后vim会提示你输入密码 <br> :h :X <br> ---------------------------------------- <br> # modeline (make a file readonly etc) must be in first/last 5 lines <br> # 不会用，不翻了 <br> // vim:noai:ts=2:sw=4:readonly: <br> :h modeline <br> ---------------------------------------- <br> # Creating your own GUI Toolbar entry <br> # 对于text模式下的vim没用，不翻了 <br> amenu &nbsp;Modeline.Insert\ a\ VIM\ modeline &lt;Esc&gt;&lt;Esc&gt;ggOvim:ff=unix ts=4 ss=4&lt;CR&gt;v <br> ---------------------------------------- <br> # 一个保存当前光标下的狭义字到一个文件的函数 <br> function! SaveWord() &nbsp;"这里用!是强制覆盖以前的定义 <br> &nbsp; &nbsp;normal yiw <br> &nbsp; &nbsp;exe ':!echo '.@0.' &gt;&gt; word.txt' <br> endfunction <br> map ,p :call SaveWord() #使用该函数的一个例子 <br> ---------------------------------------- <br> # 删除重复行的函数 <br> function! Del() <br> &nbsp;if getline(".") == getline(line(".") - 1) <br> &nbsp; &nbsp;norm dd <br> &nbsp;endif <br> endfunction <br> &nbsp;<br> :g/^/ call Del() #使用该函数的一个例子 <br> ---------------------------------------- <br> # 双字节编码 (non alpha-numerics) <br> :digraphs &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 显示编码表 <br> :h dig &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 帮助 <br> i&lt;C-K&gt;e' &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 输入 &#233; <br> i&lt;C-V&gt;233 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 输入 &#233; (Unix) <br> i&lt;C-Q&gt;233 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 输入 &#233; (Win32) <br> ga &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 查看字符的hex值 <br> ---------------------------------------- <br> # 文件名自动完成 (例如 main_c.c) <br> :e main_&lt;tab&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : tab 键完成 <br> gf &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 打开光标处广义字命名的文件 (normal模式) <br> main_&lt;C-X&gt;&lt;C-F&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 文件名自动完成(insert模式) <br> ---------------------------------------- <br> # Vim复杂使用 <br> # 交换两个单词 <br> :%s/\&lt;\(on\|off\)\&gt;/\=strpart("offon", 3 * ("off" == submatch(0)), 3)/g <br> ---------------------------------------- <br> # 把text文件转换成html文件(oh,ft) <br> :runtime! syntax/2html.vim &nbsp; &nbsp; &nbsp; &nbsp;: 转换 txt 成 html <br> :h 2html &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 看看帮助 <br> ---------------------------------------- <br> # VIM 有一个内部自带的 grep 命令 <br> :grep some_keyword *.c &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 得到一个包含some_keyword的c文件名列表 <br> :cn &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 去下一个出现的位置 <br> ---------------------------------------- <br> # 强制无后缀文件的语法着色方式 .pl <br> :set syntax=perl # 取消语法着色 <br> :set syntax off # 改变色彩主题 (在~vim/vim??/colors中的任何文件) <br> :colorscheme blue ---------------------------------------- <br> :set noma (non modifiable) &nbsp; &nbsp; &nbsp; &nbsp;: 防止修改 <br> :set ro (Read Only) &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 只读保护 <br> ---------------------------------------- <br> # Sessions (打开一系列文件) <br> gvim file1.c file2.c lib/lib.h lib/lib2.h :在"session"中加载一系列文件 <br> :mksession &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 生成一个Session文件 (默认是Session.vim) <br> :q <br> gvim -S Session.vim &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 重新读取一个session，也就读取了所有文件,ft <br> ---------------------------------------- <br> # 标记(tags) (跳转到subroutines/functions) <br> taglist.vim &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 最流行的插件 <br> :Tlist &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;: 显示Tags (functions的列表) <br> &lt;C-]&gt; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 跳转到光标处的function <br> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; : 这个键 Ctrl-] 和vim帮助中是一样的 <br> ---------------------------------------- <br> # Just Another Vim Hacker JAVH <br> # Juat Another Perl Hacker JAPH，嘿嘿 <br> vim -c ":%s/^/WhfgTNabgureRIvzSUnpxre/|:%s/[R-T]/ /Ig|:normal ggVGg?" <br> # 译释：呵呵，谁来解释一下吧！ <br> # 其实不过是在启动vim的时候执行了一个命令 <br> # 先写入了 Just Another Vim Hacker 的rot13编码 <br> # 然后再解码<img src ="http://www.cppblog.com/KevinYang/aggbug/30906.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-08-27 02:59 <a href="http://www.cppblog.com/KevinYang/articles/30906.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】大教堂与市集(中文版)</title><link>http://www.cppblog.com/KevinYang/articles/28327.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Wed, 18 Jul 2007 18:08:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/28327.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/28327.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/28327.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/28327.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/28327.html</trackback:ping><description><![CDATA[<p>From&nbsp;Wikisource <br>中文&gt;&nbsp;GNU <br>大教堂和市集&nbsp;--&nbsp;Eric&nbsp;Raymond,&nbsp;HansB翻译 <br>目录<br>一.&nbsp;大教堂和市集&nbsp;<br>二.&nbsp;邮件必须得通过 <br>2.1&nbsp;1.每个好的软件工作都开始于搔到了开发者本人的痒处。 <br>2.2&nbsp;2.好程序员知道该写什么，伟大的程序员知道该重写（和重用）什么。 <br>2.3&nbsp;3.&#8220;计划好抛弃，无论如何，你会的&#8221;(Fred&nbsp;Brooks,《神秘的人月》第11章) <br>2.4&nbsp;4.&nbsp;如果你有正确的态度，有趣的问题会找上你的，但是Carl&nbsp;Harris的态度甚至更加重要，他理解： <br>2.5&nbsp;5.当你对一个程序失去兴趣时，你最后的责任就是把它传给一个能干的后继者。 <br>三.&nbsp;拥有用户的重要性 <br>3.1&nbsp;6.&nbsp;把用户当做协作开发者是快速改进代码和高效调试的无可争辩的方式。&nbsp;<br>四.&nbsp;早发布、常发布 <br>4.1&nbsp;7.&nbsp;早发布、常发布、听取客户的建议 <br>4.2&nbsp;8.&nbsp;如果有一个足够大的beta测试人员和协作开发人员的基础，几乎所有的问题都可以被快速的找出并被一些人纠正。 <br>五.&nbsp;什么时候玫瑰不是玫瑰? <br>5.1&nbsp;9.&nbsp;聪明的数据结构和笨拙的代码要比相反的搭配工作的更好 <br>5.2&nbsp;10.&nbsp;如果你象对待最宝贵的资源一样对待你的beta测试员，他们就会成为你最宝贵的资源。 <br>六.&nbsp;popclient变成了Fetchmail <br>6.1&nbsp;11.&nbsp;想出好主意是好事，从你的用户那里发现好主意也是好事，有时候后者更好。 <br>6.2&nbsp;12.&nbsp;最重要和最有创新的解决方案常常来自于你认识到你对问题的概念是错误的。 <br>6.3&nbsp;13.&nbsp;&#8220;最好的设计不是再也没有什么东西可以添加了，而是再也没有什么东西可以去掉。&#8221; <br>七.&nbsp;Fetchmail成长起来 <br>7.1&nbsp;14.&nbsp;任何工具都应该能以预想的方式使用，但是一个伟大的工具提供你没料到的功能。 <br>7.2&nbsp;15.&nbsp;当写任何种类的网关型程序时，多费点力，尽量少干扰数据流，永远不要抛弃信息，除非接收方强迫这么作! <br>八.&nbsp;从Fetchmail得来的另一些教益 <br>8.1&nbsp;16.&nbsp;如果你的语言一点也不象是图灵完备的，严格的语法会有好处。 <br>8.2&nbsp;17.&nbsp;一个安全系统只能和它的秘密一样安全，当心伪安全。 <br>九.&nbsp;集市风格的必要的先决条件 <br>十.&nbsp;自由软件的社会学语境 <br>10.1&nbsp;18.&nbsp;要解决一个有趣的问题，请从发现让你感兴趣的问题开始。 <br>10.2&nbsp;19.&nbsp;如果开发协调人员有至少和Internet一样好的媒介，而且知道怎样不通过强迫来领导，许多头脑将不可避免地比一个好。 <br><br>一.&nbsp;大教堂和市集 <br>Linux的影响是非常巨大的。甚至在５年以前，有谁能够想象一个世界级的操作系统能够仅仅用细细的Internet连接起来的散布在全球的几千个开发人员有以业余时间来创造呢？ <br>我
当然不会这么想。在１９９３年早期我开始注意Linux时，我已经参与Unix和自由软件开发达十年之久了。我是八十年代中期GNU最早的几个参与者之
一。我已经在网上发布了大量的自由软件，开发和协助开发了几个至今仍在广泛使用的程序（Nethack,Emacs&nbsp;VC和GND模式，xlife等
等）。我想我知道该怎样做。 <br>Linux推翻了许多我认为自己明白的事情。我已经宣扬小工具、快速原型和演进式开发的Unix福音多年了。但是
我也相信某些重要的复杂的事情需要更集中化的，严密的方法。我相信多数重要的软件（操作系统和象Emacs一样的真正大型的工具）需要向建造大教堂一样来
开发，需要一群于世隔绝的奇才的细心工作，在成功之前没有beta版的发布。 <br>Linus&nbsp;Torvalds的开发风格（尽早尽多的发布，委托
所有可以委托的事，对所有的改动和融合开放）令人惊奇的降临了。这里没有安静的、虔诚的大教堂的建造工作——相反，Linux团体看起来像一个巨大的有各
种不同议程和方法的乱哄哄的集市（Linux归档站点接受任何人的建议和作品，并聪明的加以管理），一个一致而稳定的系统就象奇迹一般从这个集市中产生
了。 <br>这种设计风格确实能工作，并且工作得很好，这个事实确实是一个冲击。在我的研究过程中，我不仅在单个工程中努力工作，而且试图理解为什么Linux世界不仅没有在一片混乱中分崩离析，反而以大教堂建造者们不可想象的速度变得越来越强大。 <br>到了１９９６年中，我想我开始理解了。我有一个极好的测试我的理论的机会，以一个自由软件计划的形式，我有意识的是用了市集风格。我这样做了，并取得了很大的成功。 <br>在
本文的余下部分，我将讲述这个计划的故事，我用它来明确一些自由软件高效开发的格言。并不是所有这些都是从Linux世界中学到的，但我们将看到
Linux世界给予了它们一个什么样的位置。如果我是正确的，它们将使你理解是什么使Linux团体成为好软件的源泉，帮助你变得更加高效。 <br><br>二.&nbsp;邮件必须得通过 <br>１９９３
年以前我在一个小的免费访问的名为Chester&nbsp;County&nbsp;InterLink的ISP的做技术工作，它位于Pennsylvania的
West&nbsp;Chester。（我协助建立了CCIL，并写了我们独特的多用户BBS系统——你可以telnet到locke.ccil.org来检测一
下。今天它在十九条线上支持三千的用户）。这个工作使我可以一天二十四小时通过CCIL的56K专线连在网上，实际上，它要求我怎么做！ <br>所
以，我对Internet&nbsp;email很熟悉。因为复杂的原因，很难在我家里的机器(snark.thyrsus.com）和CCIL之间用SLIP工
作。最后我终于成功了，但我发现不得不时常telnet到locke来检查我的邮件，这真是太烦了。我所需要的是我的邮件发送到snark,这样biff
(1)会在它到达时通知我。 <br>简单地sendmail的转送功能是不够的，因为snark并不是总在网上而且没有一个静态地址。我需要一个程序
通过我的SLIP连接把我的本地发送的邮件拉过来。我知道这种东西是存在的，它们大多使用一个简单的协议POP
（Post&nbsp;Office&nbsp;Protocol）。而且，locke的BSD/OS操作系统已经自带了一个POP3服务器。 <br>我需要一个POP3客户。所以我到网上去找到了一个。实际上，我发现了三、四个。我用了一会pop-perl，但它却少一个明显的特征：抽取收到的邮件的地址以便正确回复。 <br>问题是这样的：假设locke上一个叫&#8220;joe&#8221;的人向我发了一封邮件。如果我把它取到snark上准备回复时,我的邮件程序会很高兴地把它发送给一个不存在的snark上的&#8220;joe&#8221;。手工的在地址上加上&#8220;@ccil.org&#8221;变成了一个严酷的痛苦。 <br>这显然应是计算机替我做的事。（实际上，依据RFC1123的5.2.18节，sendmail应该做这件事）。但是没有一个现存的POP客户知道怎样做！于是这就给我们上了第一课： <br><br>1.每个好的软件工作都开始于搔到了开发者本人的痒处。 <br>也许这应该是显而易见的（&#8220;需要是发明之母&#8221;长久以来就被证明是正确的），但是软件开发人员常常把他们的精力放在它们既不需要也不喜欢的程序，但在Linux世界中却不是这样——这解释了为什linux团体中产生的软件质量都如此之高。 <br>那么，我是否立即投入疯狂的工作中，要编出一个新的POP3客户与现存的那些竞争呢？才不是哪！我仔细考察了手头上的POP工具，问自己&#8220;那一个最接近我的需要？&#8221;因为： <br><br>2.好程序员知道该写什么，伟大的程序员知道该重写（和重用）什么。 <br>我并没有声称自己是一个伟大的程序员，可是我试着效仿他们。伟大程序员的一个重要特点是建设性的懒惰。他们知道你是因为成绩而不是努力得到奖赏，而且从一个好的实际的解决方案开始总是要比从头干起容易。 <br>例如，Linux并不是从头开始写Linux的。相反的它从重用Minix（一个386机型上的类似Unix的微型操作系统）的代码和思想入手。最后所有的Minix代码都消失或被彻底的重写了，但是当它们在的时候它为最终成为Linux的雏形做了铺垫。 <br>秉承同样的精神，我去寻找良好编码的现成的POP工具，用来作为基础。 <br>Unix
世界中的代码共享传统一直对代码重用很友好（这正是为什么GNU计划不管Unix本身有多么保守而选取它作为基础操作系统的原因）。Linux世界把这个
传统推向技术极限：它有几个T字节的源代码可以用。所以在Linux世界中花时间寻找其他几乎足够好的东西，会比在别处带来更好的结果。 <br>这也
适合我。加上我先前发现的，第二次寻找找到了9个候选者——fetchPOP，PopTart，get-mail，gwpop，pimp，pop-
perl，popc，popmail&nbsp;和&nbsp;upop）。我首先选定的是&#8220;fetchpop&#8221;。我加入了头标重写功能，并且做了一些被作者加入他的1.9版
中的改进。 <br>但是几个星期之后，我偶然发现了Carl&nbsp;Harris写的&#8220;popclient&#8221;的代码，然后发现有个问题，虽然
fetchpop有一些好的原始思想
(比如它的守护进程模式)，它只能处理pop3，而且编码的水平相当业余(Seung-Hong是个很聪明但是经验不足的程序员)，Carl的代码更好一
些，相当专业和稳固，但他的程序缺少几个重要的相当容易实现的fetchpop的特征(包括我自己写的那些)。 <br>继续呢还是换一个?&nbsp;如果换一个的话，作为得到一个更好开发基础的代价，我就要扔掉我已经有的那些代码。 <br>换
一个的一个实际的动机是支持多协议，pop3是用的最广的邮局协议，但并非唯一一个，Fetchpop和其余几个没有实现POP2.RPOP，或者
APOP，而且我还有一个为了兴趣加入IMAP(Internet&nbsp;Message&nbsp;Access&nbsp;Protocol，最近设计的最强大的邮局协议)的模
糊想法。 <br>但是我有一个更加理论化的原因认为换一下会是一个好主意，这是我在Linux很久以前学到的： <br><br>3.&#8220;计划好抛弃，无论如何，你会的&#8221;(Fred&nbsp;Brooks,《神秘的人月》第11章) <br>或者换句话说，你常常在第一次实现一个解决方案之后才能理解问题所在，第二次你也许才足够清楚怎样做好它，因此如果你想做好，准备好推翻重来至少一次。 <br>好吧(我告诉自己)，对fetchpop的尝试是我第一次的尝试，因此我换了一下。 <br>当
我在1996年6月25日把我第一套popclient的补丁程序寄给Carl&nbsp;Harris之后，我发现一段时间以前他已经对popclient基本上
失去了兴趣，这些代码有些陈旧，有一些次要的错误，我有许多修改要做，我们很快达成一致，我来接手这个程序。不知不觉的，这个计划扩大了，再也不是我原先
打算的在已有的pop客户上加几个次要的补丁而已了，我得维护整个的工程，而且我脑袋里涌动着一些念头要引起一个大的变化。 <br>在一个鼓励代码共享的软件文化里，这是一个工程进化的自然道路，我要指出： <br><br>4.&nbsp;如果你有正确的态度，有趣的问题会找上你的，但是Carl&nbsp;Harris的态度甚至更加重要，他理解： <br><br>5.当你对一个程序失去兴趣时，你最后的责任就是把它传给一个能干的后继者。 <br>甚至没有商量，Carl和我知道我们有一个共同目标就是找到最好的解决方案，对我们来说唯一的问题是我能否证明我有一双坚强的手，他优雅而快速的写出了程序，我希望轮到我时我也能做到。 <br><br>三.&nbsp;拥有用户的重要性 <br>于是我继承了popclient，同样重要的是，我继承了popclient的用户基础，用户是你所拥有的极好的东西，不仅仅是因为他们显示了你正在满足需要，你做了正确的事情，如果加以适当的培养，他们可以成为合作开发者。 <br>Unix
传统另一有力之处是许多用户都是黑客，因为源优码是公开的，他们可以成为高效的黑客，这一点在Linux世界中也被推向了令人高兴的极致，这对缩短调试时
间是极端重要的，在一点鼓励之下，你的用户会诊断问题，提出修订建议，帮你以远比你期望快得多的速度来改进代码。 <br><br>6.&nbsp;把用户当做协作开发者是快速改进代码和高效调试的无可争辩的方式。 <br>这种效果的力量很容易被低估，实际上，几乎所有我们自由软件世界中的人都强烈低估了用户可以多么有效地对付系统复杂性，直到Linus让我们看到了这一点。 <br>实
际上，我认为Linus最聪明最了不起的工作不是创建了Linux内核本身，而是发明了Linux开发模式，当我有一次当着他的面表达这种观点时，他微笑
了一下，重复了一句他经常说的话：&#8220;我基本上是一个懒惰的人，依靠他人的工作来获取成绩。&#8221;象狐狸一样懒惰，或者如Robert&nbsp;Heinlein所说，
太懒了而不会失败。 <br>回顾起来，在GNU&nbsp;Emacs&nbsp;Lisp库和Lisp代码集中可以看到Linux方法的成功，与Emacs的C内核和许
多其他FSF的工具相比，
Lisp代码库的演化是流动性的和用户驱动的，思想和原型在达到最终的稳定形式之前往往要重写三或四次，而且经常利用Internet的松散合作。 <br>实
际上，我自己在fetchmail之前最成功的作品要算Emacs&nbsp;VC模式，它是三个其他的人通过电子邮件进行的类似Linux的合作，至今我只见过其
中一个人(Richard&nbsp;Stallman)，它是SCCS、RCS和后来的CVS的前端，为Emacs提供&#8220;one-touch&#8221;版本控制操作，它是
从一个微型的、粗糙的别人写好的sccs.el模式开始演化的，VC开发的成功不像Emacs本身，而是因为Emacs&nbsp;Lisp代码可以很快的通过发布
／测试／改进的过程。 <br>(FSF的试图把代码放入GPL之下的策略有一个未曾预料到的副作用，它让FSF难以采取市集模式，因为他们认为每个想
贡献二十行以上代码的人都必须得到一个授权，以使受到GPL的代码免受版权法的侵扰，具有BSD和MITX协会的授权的用户不会有这个问题，因为他们并不
试图保留那些会使人可能受到质询的权力)。 <br><br>四.&nbsp;早发布、常发布 <br>尽量早尽量频繁的发布是Linux开发模式的一个重要部分，多数开发人员(包括我)过去都相信这对大型工程来说是个不好的策略，因为早期版本都是些充满错误的版本，而你不想耗光用户的耐心。 <br>这
种信仰强化了建造大教堂开发方式的必要性，如果目标是让用户尽可能少的见到错误，那你怎能不会仅仅每六个月发布一次(或更不经常)，而且在发布之间象一只
狗一样辛勤&#8220;捉虫&#8221;呢?&nbsp;Emacs&nbsp;C内核就是以这种方式开发的，Lisp库，实际上却相反，因为有一些有FSF控制之外的Lisp库，在那里你可以独
立于Emacs发布周期地找寻新的和开发代码版本。 <br>这其中最重要的是Ohio州的elisp库，预示了今天的巨大的Linux库的许多特征的
精神，但是我们很少真正仔细考虑我们在做什么，或者这个库的存在指出了FSF建造教堂式开发模式的什么问题，1992年我曾经做了一次严肃的尝试，想把
Ohio的大量代码正式合并到Emacs的官方Lisp库中，结果我陷入了政治斗争中，彻底失败了。 <br>但是一年之后，在Linux广泛应用之后，很清楚，一些不同的更加健康的东西诞生了，Linus的开发模式正好与建造教堂方式相反，Sunsite和tsx-11的库开始成长，推动了许多发布。所有这些都是闻所未闻的频繁的内核系统的发布所推动的。 <br>Linus以所有实际可能的方式把它的用户作为协作开发人员。 <br><br>7.&nbsp;早发布、常发布、听取客户的建议 <br>Linus
的创新并不是这个(这在Unix世界中是一个长期传统)，而是把它扩展到和他所开发的东西的复杂程度相匹配的地步，在早期一天一次发布对他来说都不是罕见
的!而且因为他培育了他的协作开发者基础，比其他任何人更努力地充分利用了Internet进行合作，所以这确实能行。 <br>但是它是怎样进行的呢?它是我能模仿的吗?还是这依赖于Linus的独特天才? <br>我
不这样想，我承认Linus是一个极好的黑客(我们有多少人能够做出一个完整的高质量的操作系统内核?)，但是Linux并不是一个令人敬畏的概念上的飞
跃，Linus不是(至少还不曾是)象Richard&nbsp;stallman或James&nbsp;Gosling一样的创新天才，在我看来，Linus更象一个工程
天才，具有避免错误和开发失败的第六感觉，掌握了发现从A点到B点代价最小的路径的决窍，确实，Linux的整个设计受益于这个特质，并反映出
Linus的本质上保守和简化设计的方法。 <br>如果快速的发布和充分利用Internet不是偶然而是Linus的对代价最小的路径的洞察力的工程天才的内在部分，那么他极大增强了什么?他创建了什么样的方法? <br>问题回答了它自己，Linus保持他的黑客用户经常受到激励和奖赏：被行动的自我满足的希望所激励，而奖赏则是经常(甚至每天)都看到工作在进步。 <br>Linus直接瞄准了争取最多的投入调试和开发的人时，甚至冒代码不稳定和一旦有非常棘手的错误而失去用户基础的险，Linus似乎相信下面这个： <br><br>8.&nbsp;如果有一个足够大的beta测试人员和协作开发人员的基础，几乎所有的问题都可以被快速的找出并被一些人纠正。 <br>或者更不正式的讲：&#8220;如果有足够多的眼睛，所有的错误都是浅显的&#8221;(群众的眼睛是雪亮的)，我把这称为&#8220;Linus定律&#8221;。 <br>我最初的表述是每个问题&#8220;对某些人是透明的&#8221;，Linus反对说，理解和修订问题的那个人不一定非是甚至往往不是首先发现它的人，&#8220;某个人发现了问题&#8221;，他说，&#8220;另一个理解它，我认为发现它是个更大的挑战&#8221;，但是要点是所有事都趋向于迅速发生。 <br>我
认为这是建造教堂和集市模式的核心区别，在建造教堂模式的编程模式看来，错误和编程问题是狡猾的、阴险的、隐藏很深的现象，花费几个月的仔细检查，也不能
给你多大确保把它们都挑出来的信心，因此很长的发布周期，和在长期等待之后并没有得到完美的版本发布所引起的失望都是不可避免的。 <br>以市集模式
观点来看，在另一方面，我们认为错误是浅显的现象，或者至少当暴露给上千个热切的协作开发人员，让他们来对每个新发布进行测试的时候，它们很快变得浅显
了，所以我们经常发布来获得更多的更正，作为一个有益的副作用，如果你偶尔做了一个笨拙的修改，也不会损失太多。也许我们本不应该这样的惊奇，社会学家在
几年前已经发现一群相同专业的(或相同无知的)观察者的平均观点比在其中随机挑选一个来得更加可靠，他们称此为&#8220;Delhpi效应&#8221;，Linus
所显示的证明在调试一个操作系统时它也适用——Delphi效应甚至可以战胜操作系统内核一级的复杂度。 <br>我受Jeff&nbsp;Dutky&nbsp;
(dutky&nbsp;@&nbsp;wam.umd.edu)的启发指出Linus定律可以重新表述为&#8220;调试可以并行&#8221;，Jeff观察到虽然调试工作需要调试人员和对应的
开发人员相交流，但它不需要在调试人员之间进行大量的协调，于是它就没有陷入开发时遇到的平方复杂度和管理开销。 <br>在实际中，由于重复劳动而导致的理论上的丧失效率的现象在Linux世界中并不是一个大问题，&#8220;早发布、常发布策略&#8221;的一个效果就是利用快速的传播反馈修订来使重复劳动达到最小。 <br>Brooks甚至做了一个与Jeff相关的更精确的观察：&#8220;维护一个广泛使用的程序的成本一般是其开发成本的40%，奇怪的是这个成本受到用户个数的强烈影响，更多的用户发现更多的错误&#8221;(我的强调)。 <br>更
多的用户发现更多的错误是因为更多的用户提供了更多测试程序的方法，当用户是协作开发人员时这个效果被放大了，每个找寻错误的人都有自己稍微不同的感觉和
分析工具，从不同角度来看待问题。&#8220;Delphi效应&#8221;似乎因为这个变体工作变得更加精确，在调试的情况下，这个变体同时减小了重复劳动。 <br>所以加入更多的beta测试人员虽不能从开发人员的P.O.V中减小&#8220;最深&#8221;的错误的复杂度，但是它增加了这样一种可能性，即某个人的工具和问题正好匹配，而这个错误对这个人来说是浅显的。 <br>Linus
也做了一些改进，如果有一些严重的错误，Linux内核的版本在编号上做了些处理，让用户可以自己选择是运行上一个&#8220;稳定&#8221;的版本，还是冒遇到错误的风险
而得到新特征，这个战略还没被大多数Linux黑客所仿效，但它应该被仿效，存在两个选择的事实让二者都很吸引人。 <br><br>五.&nbsp;什么时候玫瑰不是玫瑰? <br>在研究了Linus的行为和形成了为什么它成功的理论之后，我决定在我的工程(显然没有那么复杂和雄心勃勃)里有意识的测试这个理论。 <br>但
我首先做的事是熟悉和简化Popclient。&nbsp;Carl&nbsp;Harris的实现非常好，但是有一种对许多C程序来说没有必要的复杂性。他把代码当作核心而
把数据结构当作对代码的支持，结果是代码非常漂亮但是数据结构设计得很特别，相当丑陋(至少对以这个老LISP黑客的标准来看)，然而除了提高代码和数据
结构设计之外，重写它还有一个目的，就是要把它演化为我彻底理解的东西，对修改你不理解的程序中的错误负责可不是一件有趣的事。 <br>第一个月我只
是在领会Carl&#8217;s的基本设计的含义，我所做的第一个重大修改是加入了IMAP支持，我把协议机重新组织为一个通用驱动程序和三个方法表
(对应POP2、POP3和IMAP)，这个前面的修改指出一个需要程序员(特别是象C这种没有自然的动态类型支持的语言)记在脑中的一般原理： <br><br>9.&nbsp;聪明的数据结构和笨拙的代码要比相反的搭配工作的更好 <br>Fred&nbsp;Brooks也在他第11章中讲道：&#8220;让我看你的［代码］，把你的[数据结构]隐藏起来，我还是会迷惑；让我看看你的[数据结构]，那我就不需要你的[代码]了，它是显而易见的&#8221;。 <br>实际上，他说的是&#8220;流程图&#8221;和&#8220;表&#8221;，但是在三十年的术语／文化演进之后，事情还是一样的。 <br>此时(1996年9月初，在从零开始六个月后)，我开始想接下来修改名字——毕竟，它已不仅仅是一个POP客户，但我犹豫了，因为还没有什么新的漂亮设计呢，我的popclient版本需要有自己的特色。 <br>当fetchmail学会怎样把取到的邮件转送到SMTP端口时，事情就完全改变了，但是首先：上面我说过我决定使用这个工程来测试我关于Linus&nbsp;Torualds所做的行为的理论，(你可能会问)我怎样做到这点呢?&nbsp;以下面的方式： <br>我尽早尽量频繁的发布(几乎从未少于每十天发布一次；在密集开发的时候是每天一次)。&nbsp; <br>我把每一个和我讨论fetchmail的人加入一个beta表中。&nbsp; <br>每当我发布我都向beta表中的人发出通告，鼓励人们参与。&nbsp; <br>我听取beta测试员的意见，向他们询问设计决策，对他们寄来的补丁和反馈表示感谢。&nbsp; <br>这些简单的手段立即收到的回报，在工程的开始，我收到了一些错误报告，其质量足以使开发者因此被杀掉，而且经常还附有补丁、我得到了理智的批评，有趣的邮件，和聪明的特征建议，这导致了： <br><br>10.&nbsp;如果你象对待最宝贵的资源一样对待你的beta测试员，他们就会成为你最宝贵的资源。 <br><br>六.&nbsp;popclient变成了Fetchmail <br>这个工程的真正转折点是Harry&nbsp;Hochleiser寄给我他写的代码草稿，他把邮件转发到客户端机器的SMTP端口，我立即意识到这个特征的可靠实现将淘汰所有其他的递送模式。 <br>几个星期以来我一直在修改而不是改进fetchmail，因为我觉得界面设计虽然有用但是太笨拙琐碎了，到处充满了太多的粗陋的细小选项。 <br>当
我思考SMTP转发时我发现popclient试图做的事太多了，它被设计成既是一个邮件传输代理(MTA)也是一个本地递送代理(MDA)。使用
SMTP转发，它就可以从MDA的事务中解脱出来而成为一个纯MTA，而象sendmail一样把邮件交给本地递送程序来处理。 <br>既然端口25在所有支撑TCP／IP的平台上早已被预留，为什么还要为一个邮件传输代理的配置或为一个邮箱设置加锁的附加功能而操心呢?尤其是当这意味着抽取的邮件就象一个正常的发送者发出的SMTP邮件一样，而这就是我们需要的。 <br>这里有几个教益：第一，SMTP转发的想法是我有意识地模拟Linus的方法以来的最大的单个回报，一个用户告诉我这个非同寻常的想法——我所需做的只是理解它的含义。 <br>[edit] <br>11.&nbsp;想出好主意是好事，从你的用户那里发现好主意也是好事，有时候后者更好。 <br>很
有趣的是，你很快将发现，如果你完全承认你从其他人那里得到多少教益的话，整个世界将会认为所有的发明都是你做出的，而你会对你的天才变得谦虚。我们可以
看到这在Linus身上体现得多明显!(当我在1997年8月的Perl会议上发表这个论文时，Larry&nbsp;Wall坐在前排，当我讲到上面的观点时，他
激动的叫了出来：&#8220;对了!说对了!哥们!&#8221;所有的听众都哄堂大笑起来，因为他们知道同样的事情也发生在Perl的发明者身上)。 <br>于是在同样精神指导下工程进行了几个星期，我开始不光从我的用户那儿也从听说我的系统的人那儿得到类似的赞扬，我把一些这种邮件收藏起来，我将在我开始怀疑自己的生命是否有价值时重新读读这些信。:) <br>但是有两个更基本的，非政治性的对所有设计都有普遍意义的教益。 <br><br>12.&nbsp;最重要和最有创新的解决方案常常来自于你认识到你对问题的概念是错误的。 <br>一个衡量fetchmail成功的有趣方式是工程的beta测试人员表(fetchmail的朋友们)的长度，在创立它的时候已经有249个成员了，而且每个星期增加两到三个。 <br>实际上，当我在1997年5月校订它时，这张表开始因为一个有趣的原因而缩短了，有几个人请求我把他们从表中去掉，因为fetchmail已经工作的如此之好，他们不需要看到这些邮件了!也许这是一个成熟的市集风格工程的生命周期的一部分。 <br>我以前一直在解决错误的问题，把popclient当作MTA和具有许多本地递送模式的MDA的结合物，Fetchmail的设计需要从头考虑为一个纯的MTA，做为一个普通Internet邮件路径的一部分。 <br>当你在开发中碰了壁时(当你发现自己很难想通下一步时)，那通常不是要问自己是否找到正确答案，而是要问是否问了正确问题，也许需要重新构造问题。 <br>于是，我重新构造了我的问题，很清楚，要做的正确的事是(1)把SMTP转发支持放在通用驱动程序中，(2)把它做为缺省模式，(3)最终分离所有其他的递送模式，尤其是递送到文件和标准输出的选项。 <br>我在第三步上犹豫了一下，担心会让popdiant的长期用户对新的递送方法感到烦心，在理论上，他们可以立即转而转发文件或者他们的非sendmail等价物来得到同样的效果，在实际中这种转换可能会很麻烦。 <br>但是当我这么做之后，证明好处是巨大的，驱动程序代码的冗余的部分消失了，配置完全变得简单了——不用屈从于系统MDA和用户的邮箱，也不用为下层OS是否支持文件锁定而担心了。 <br>而且，丢失邮件的唯一漏洞也被堵死了，如果你选择了递送到一个文件而磁盘已满，你的邮件就会丢失，这在SMTP转发中不会发生，因为SMTP侦听器不会返回OK的，除非邮件可以递送成功或至少被缓冲留待以后递送。 <br>还有，性能也改善了(虽然在单次执行中你不会注意到)，这个修改的另一个不可忽视的好处是手册变得大大简单了。 <br>后来，为了允许处理一些罕见的情况，包括动态SLIP，我必须回到让用户定义本地MDA递送上来，但是我发现了一个更加简单的方法。 <br>所有这些给了我们什么启发呢?如果可以不损失效率，就要毫不犹豫抛弃陈旧的特性，Antonine&nbsp;de&nbsp;Saint-Exupery(在他成为经典儿童书籍作家之前是一个飞行员和飞机设计师)曾说过： <br><br>13.&nbsp;&#8220;最好的设计不是再也没有什么东西可以添加了，而是再也没有什么东西可以去掉。&#8221; <br>当你的代码变得更好和更简单时，这就是你知道它是正确的时候了，而且在这个过程中，fetchmail的设计具有了自己的特点，而区别于其前身popclient。 <br>现在是改名的时候了，这个新的设计看起来比老popclient更象一个sendmail的复制品，它们都是MTA，但是Senmail是推然后递送，而新的popclient是拉然后递送。于是，在两个月之后，我把它重新命名为fetchmail。 <br><br>七.&nbsp;Fetchmail成长起来 <br>现在我有了一个简洁和富有创意的设计，工作得很好的代码，因为我每天都用它，和一直在增长的beta表，它让我渐渐明白我已经不是在从事只能对少数其他人有用的工作中，我写了一个所有有一个Unix邮箱和SLIP／PPP邮件连接的人都真正需要的程序。 <br>通过SMTP转发功能，它成为一个潜在的&#8220;目录杀手&#8221;，远远领先于它的竞争者，这个程序如此能干以至于其他的程序不但被放弃简直被忘记了。 <br>我知道你不可以真得瞄准或计划出这样的结果，你只能努力去设计这些强大的思想，以后这些结果就好象是不可避免的、自然的、注定了的，得到这种思想的唯一办法是获取许多思想，或者用工程化的思考其他人的好主意而超过原来想到它的人的设想。 <br>Andrew&nbsp;Tanenbanm
原来设想建造一个适合386的简单的Unix用做教学，Linus&nbsp;Torvalels把Andrew的可能想到的
Minix可以做什么的概念推进了一步，成长为一个极好的东西，同样的(虽然规模较小)，我接受了Card&nbsp;Harris和
Harry&nbsp;Hochheiser的想法，把它们变得更强大，我们都不是人们所浪漫幻想的天才的创始人，但是大多数科学和工程和软件开发不是被天才的创始
人完成的，这和流传的神话恰恰相反。 <br>结果总是执着的原因——实际上，它是每个黑客为之生存的成功!而且它们意味着我必须把自己的标准定高一
点，为了把fetchmail变得和我所能设想的那样好，我必须不仅为我自己的需要写代码，而且也要包括对在我生活围主页外的人们的需求的支持，而且同时
也要保证程序的简单和健壮。 <br>在实现它之后我首先写的最重要的特征是支持多投——从集中一组用户的邮件的邮箱中取出邮件，然后把它路由到每个人手中。 <br>我之所以加上多投功能部分是因为有些用户一直在闹着要它，更是因为我想它可以从单投的代码中揭露出错误来，让我完全一般地处理寻址，而且这被证明了。正确解释RFC822花了我相当长的时间，不仅因为它的每个单独部分都很难，而且因为它有一大堆相互依赖的苛刻的细节。 <br>但是多投寻址也成为一个极好的设计决策，由此我知道： <br><br>14.&nbsp;任何工具都应该能以预想的方式使用，但是一个伟大的工具提供你没料到的功能。 <br>Fetchmant
多投功能的一个没有料到的用途是在SLIP／PPP的客户端提供邮件列表、别名扩展。这意味着一个使用个人机器的人不必持续访问ISP
的别名文件就能通过一个ISP帐户管理一个邮件列表。我的beta测试员提出的另一个重要的改变是支持8位MIME操作，这很容易做，因为我已经仔细的保
证了8位代码的清晰，不仅因为我预见到了这个特性的需求，而且因为我忠实于另一准则： <br></p>
<p>15.&nbsp;当写任何种类的网关型程序时，多费点力，尽量少干扰数据流，永远不要抛弃信息，除非接收方强迫这么作! <br>如果我不遵从这个准则，那么8位MIME支持将会变得困难和笨拙，现在我所需要做的，是只读一下RFC&nbsp;1652，在产生信头的逻辑加上一点而已。 <br>一些欧洲用户要求我加上一个选项来限制每次会话取得消息数(这样他们就可以从昂贵的电话网中控制花费了)，我很长一段时间拒绝这样做，而且我仍然对它不很高兴，但是如果你是为了世界而写代码，你必须听取顾客的意见——这并不随他们不付给你钱而改变。 <br><br>八.&nbsp;从Fetchmail得来的另一些教益 <br>在他们回到一般的软件工程问题以前，还有几个从fetchmail得到的教益需要思考。 <br>rc文件语法包括可选的&#8220;noise&#8221;关键字，它被扫描器完全忽略了，当你把它们全抽取出的时候，关键字／值对更具可读性。 <br>当我注意到rc文件的声明在多大程度上开始象一个微型命令语言时，这是一个Late-night的体验(这也是我为什么把popclient原来的&#8220;server&#8221;关键字改成了&#8220;poll&#8221;)。 <br>对我来说似乎把这个微型命令语言变得更象英语可能会使它更容易使用。现在，虽然我对经过Emacs和HTML及许多数据库引擎所证实的&#8220;把它做成一个语言&#8221;的设计方式确信不疑，但是我并不是一个通常的&#8220;类英语&#8221;语法的狂热拥护者。 <br>传统程序员容易控制语法使它尽量精确和紧凑，完全没有冗余，这是计算机资源还很昂贵时遗留下的一种文化传统，所以扫描策略需要尽可能的廉价和简单，而具有50%冗余度的英语，看来好象是一个非常不合适的模型。 <br>这并不是我不用类英语语法的原因，我提到这一点是为了推翻它，在更廉价的时钟周期与核心的时代，简洁并没有走到尽头，今天对一个语言来说，对人更方便比对机器更廉价来的更加重要。 <br>然而，有几个原因提醒我们小心一点，一个是扫描策略的复杂度开销——你并不想把它变成一个巨大的错误来源和让用户困惑，另一个是试图使语言表面上的类似可以和传统语言一样令人困惑(你可以在许多4GL和商业数据库查询语言上看到这一点)。 <br>Fetchmail的控制语法避免了这些问题，因为语言的领域是极其有限的。它一点也不象一个一般性的语言，它很简单地描述的东西并不复杂，所以很少可能在英语的一个小子集与实际的控制语言之间发生混淆，我想这有一个更广泛的教益： <br><br>16.&nbsp;如果你的语言一点也不象是图灵完备的，严格的语法会有好处。 <br>另一个教益是关于安全的，一些fetchmail用户要求我修改软件把口令加密存贮在rc文件里，这样觑探者就不能看到它们了。 <br>我没有这样做，因为这实际上起不到任何保护作用，任何有权读取你的rc文件的人都可以以你的名义运行fetchmail——如果他们要破你的口令，它们可以从fetchmail的代码中找到制作解码器的方法。 <br>所以fetchmail口令的加密都会给那些不慎重思考的人一种安全的错觉，这里一般性的准则是： <br><br>17.&nbsp;一个安全系统只能和它的秘密一样安全，当心伪安全。 <br><br>九.&nbsp;集市风格的必要的先决条件 <br>本文的早期评审人员和测试人员坚持提出成功的市集模式开发的先决条件，包括工程领导人的资格问题和在把项目公开和开始建造一个协作开发人员的社团的时候代码的状态。 <br>相当清楚，不能以一个市集模式从头开发一个软件，我们可以以市集模式、测试、调试和改进，但是以市集模式从头开始一个项目将是非常困难的，Linus没有这样做，我也没有，初期的开发人员的社团应该有一此可以运行和测试的东西来玩。 <br>当你开始创建社团时，你需要演示的是一个诺言，你的程序不需要工作的很好，它可以很粗糙、很笨拙、不完整和缺少文档、它不能忽略的东西是要吸引哪些人卷入一个整洁的项目。 <br>Linux和fetchmail都是以一个吸引人的基本设计进入公共领域的，许多和我一样在思考市集模式的人已经正确的认为这是非常关键的，然后得出了一个结论，工程领导者的高度的设计直觉和聪颖是必不可少的。 <br>但是Linus是从Unix得到他的设计的，我最初是从先前的popmail得到启发的(虽然相对Linux而言，它最后改变巨大)，所以市集风格的领导人／协调人需要有出众的设计才能，或者他可以利用别人的设计才能? <br>我认为能够提出卓越的原始设计思想对协调人来说不是最关键的，但是对他／她来说绝对关键的是要能把从他人那里得到的好的设计重新组织起来。 <br>Linux和fetchmail项目都显示了这些证据，Linus(如同前面所说)并不是惊人的原始设计者，但他显示了发现好的设计并把它集成到Linux内核中的强大决窍。还有我也描述了怎样从别人那里得到了fetchmail中最强大的设计思想(SMTP转发)。 <br>本文的早期读者称赞我，说因为我做了许多关于原始设计的事，所以倾向于低估原始设计在市集项目中的价值，也许有些是对的吧，但是设计(而不是编码或调试)本来就是我最强的能力。 <br>变得聪明和软件设计的原始创作的问题是它会变成一个习惯，当需要保持事物健壮和简洁的时候，你却开始把事情变得漂亮但却复杂。我曾经犯过错误，使得一些项目因我而崩溃了，但我努力不让它发生在fetchmail身上。 <br>所
以我相信fetchmail项目的成功部分是因为我抑制自己不要变得太聪明，这说明(至少)对市集模式而言原始设计并不是本质的，请考察一下Linux
假设Linus&nbsp;Torvalds在开发时试图彻底革新操作系统设计，它还会象今天我们所拥有的内核那样稳定和成功吗? <br>当然基本的设计和编码技巧还是必需的，但我希望每个严肃考虑发起一个市集计划的人都已至少具备这些能力，自由软件社团的内部市场对人们有某些微妙的压力，让他们不要发起自由不能搞定的开发，目前为止，这工作得仍然相当好。 <br>对市集项目来说，我认为还有另一种通常与软件开发无关的技能和设计能力同样重要——或者更加重要，市集项目的协调人或领导人必须有良好的人际和交流能力。 <br>这是很显然的，为了建造一个开发社团，你需要吸引人，你所做的东西要让他们感到有趣，而且要保持他们对他们正在做的工作感到有趣，而且要保持他们对他们正在做的工作感到高兴，技术方面对达成这些目标有一定帮助，但这远远不是全部，你的个人素质也有关系。 <br>并不是说Linus是一个好小伙子，让人们喜爱并乐于帮助他，也并不是说我是个积极外向的，喜欢扎堆儿工作，有出众的幽默感的人，对市集模式的工作而言，至少有一点吸引人的技巧是非常有帮助的。 <br><br>十.&nbsp;自由软件的社会学语境 <br>下述如实：最好的开发是从作者解决每天工作中的个人问题开始的，因为它对一大类用户来说是一个典型问题，所以它就推广开来了，这把我们带回到准则1，也许是用一个更有用的方式来描述： <br>[edit] <br>18.&nbsp;要解决一个有趣的问题，请从发现让你感兴趣的问题开始。 <br>这
是Carl&nbsp;Harris和原先的popclient的情形，也是我和fetchmail的情形，但这已在很长一段时间被大家知晓了，Linux和
fetchmail的历史要求我们注意的有趣之处是下一个阶段——软件在一个庞大的活跃的用户和协作开发人员的社团中的进化。 <br>在《神秘的人
月》一书中，Fred&nbsp;Brooks观察到程序员的工作时间是不可替代的：在一个误了工期的软件项目中增加开发人员只会让它拖得更久，他声称项目的复杂度
和通讯开销以开发人员的平方增长，而工作成绩只是以线性增长，这个说法被称为&#8220;Brooks定律&#8221;，被普遍当作真理，但如果Brooks定律就是全部，那
Linux就不可能成功。 <br>几年之后，Gerald&nbsp;Weinbeng的经典之作
&#8220;The&nbsp;Psychology&nbsp;Of&nbsp;Computer&nbsp;Progromming&#8221;为我们更正了
Brooks的看法，在他的&#8220;忘我(egoless)的编程&#8221;中，Weinberg观察到在开发人员不顽固保守自己的代码，鼓励其他人寻找错误和发展潜力
的地方，软件的改进的速度会比其他地方有戏剧性的提高。 <br>Weinberg的用词可阻止了他的分析得到应有的接受，人们对把Internet黑客称为&#8220;忘我&#8221;的想法微笑，但是我想今天他的想法比以往任何时候都要引人注目。 <br>Unix
的历史已经为我们准备好了我们正在从Linux学到的(和我在更小规模上模仿Linus的方法所验证的)东西，这就是，虽然编码仍是一个人干的活，真正伟
大的工作来自于利用整个社团的注意和脑力，在一个封闭的项目中只利用他自己的脑力的人会落在知道怎样创建一个开放的、进化的，成百上千的人在其中查找错误
和进行修改的环境的开发人员之后。 <br>但是Unix的传统中有几个因素阻止把这种方法推到极致。一个是各种授权的法律约束、商业机密和商业利益，另一个(事后来看)是Internet还不够好。 <br>在Internet变得便宜之前，有一些在地理上紧密的社团，它们的文化鼓励Weingberg的&#8220;忘我&#8221;编程，一个开发人员很容易吸引许多熟练的人和协作开发人员，贝尔实验室，MIT&nbsp;A1实验室，UC&nbsp;Berkeley，都成为传统的、今天仍然是革新的源泉。 <br>Linux
是第一个有意识的成功的利用整个世界做为它的头脑库的项目，我不认为Linux的孕育和万维网的诞生相一致是一个巧合，而且Linux在
1993-1994的一段ISP工业大发展和对Internet的兴趣爆炸式增长的时期中成长起来，Linus是第一个学会怎样利用Internet的新
规的人。 <br>廉价的Internet对Linux模式的演化来说是一个必要条件，但它并不充分，另一个关键因素是领导风格的开发和一套协作的氛围使开发人员可以吸引协作开发人员和最大限度地利用媒体。 <br>但
是这种领导风格与氛围到底是什么呢?它不能建立在权力关系之上——甚至如果它们可以，高压的领导权力不能产生我们所看到的结果，Weinberg引用了
19世纪俄国的无政府主义者Kropotkin的&#8220;Memoris&nbsp;of&nbsp;a&nbsp;Revolutionist&#8221;来证明这个观点： <br>&#8220;我从小生活在
一个农奴主的家庭中，我有一个活跃的生活，象我们时代的所有年轻人一样，我深信命令、强制、责骂、惩罚等等的必要性。但是当我(在早期)必须管理一个企
业，和(自由)人打交道时，当每一个错误都会产生严重后果时，我开始接受以命令和纪律为准则来行动和以普通理解为准则来行动的区别。前者在军事阅兵中工作
的很好，但是它在现实生活中一文不值，目标达成只是靠许多愿望的聚合的简单后果。&#8221;&#8220;许多聚合在一起的愿望的直接后果&#8221;精确地指出了象
Linux的项目所需要的东西。&#8220;命令的准则&#8221;在Internet这种无政府主义的天堂中一群自愿者之中是没有市场的，为了更有效的操作和竞争，想领导协
作项目的黑客们必须学会怎样以Kropotkins含糊指出的&#8220;理解的准则&#8221;模式来恢复和激活社团的力量，他们必须学会使用Linus定律。 <br>前
面我引用&#8220;Delhpi效应&#8221;来作为Linus定律的一个可能的解释，但是来自生物学和经常学的自适应系统的更强大的分析也提出了自己的解释，
Linus世界的行为更象一个自由市场或生态系统，由一大群自私的个体组成，它们试图取得(自己)最大的实效，在这个过程中产生了比任何一种中央计划都细
致和高效的自发的改进的结果，所以，这里就是寻找&#8220;理解的准则&#8221;的地方。 <br>Linux黑客取得的最大化的&#8220;实际利益&#8221;不是经典的经济利益，而是
无形的他们的自我满足和在其他黑客中的声望，(有人会说他们的动机是&#8220;利他的&#8221;，但这忽略了这样的事实：利他主义本身是利他主义者的一种自我满足的形
式)，自愿的文化以这种方式工作的实际上并非不寻常，我已参与一个科幻迷团体很长时间了，它不象黑客团体一样，显式地识别出&#8220;egoboo&#8221;(一个人在其
他爱好者之中的声望的增长)作为自愿者活动背后的基础驱动力)。 <br>Linus成功地把自己置于项目的守门人的位置，在项目中开发大部分是别人做的，他只是在项目中培养兴趣直到它可以自己发展下去，这为我们展示了对Kropokin的&#8220;共同理解原则&#8221;的敏锐把握，对Linux这种类似经济学的观点让我们看到这种理解是怎样应用的。 <br>我
们可以把Linus的方法视为创建一个高效的关于&#8220;egoboo&#8221;(而不是钱)的市场，来把自私的黑客个体尽可能紧密的联系起来，达成只能通过高度协作才
能得到的困难的结果，在fetchmail项目中我展示了(在较小规模上)这种模式可以复制，得到良好的结果，也许我比他更有意识一点、更加系统一点。
<br>许多人(尤其是哪些由于政治原因不信任自由市场的人)会盼望自我导向的自我主义者的文化破碎、报废、秘密和敌对，但这种盼望很明显地被Linux
的文档的多样性、质量和深度打破了，程序员讨厌写文档似乎已是圣训，但Linux的黑客们怎么产生了这么多?显然Linux的egoboo自由市场比有大
量资金的商业软件产品的文档部在产生有品德的、他人导向的行为方面工作的更好。 <br>Fetchmail和Linux内核项目都表明，通过恰当的表彰许多其他黑客，一个强大的开发者／协调者可以用Internet得到许多协同开发人员而不是让项目分崩离析为一片混乱，所以关于Brooks定律我得到了下面的想法： <br><br>19.&nbsp;如果开发协调人员有至少和Internet一样好的媒介，而且知道怎样不通过强迫来领导，许多头脑将不可避免地比一个好。 <br>我认为自由软件的将来将属于那些知道怎样玩Linus的游戏的人，把大教堂抛之脑后拥抱市集的人，这并不是说个人的观点与才气不再重要，而是，我认为自由软件的前沿将属于从个人观点和才气出发的人，然后通过共同兴趣自愿社团的高效建造来扩展。 <br>可能不只是自由软件的将来，在解决问题方面，没有任何商业性开发者可以与Linux社团的头脑库相匹敌，很少有人能负担起雇佣200多个为fetchmail出过力的人! <br>也许最终自由软件文化将胜利，不是因为协作在道德上是正确的或软件&#8220;囤积居奇&#8221;在道德上是错的(假设你相信后者，Linus和我都不)，而仅仅是因为商业世界在进化的军备竞赛中不能战胜自由软件社团，因为后者可以把更大更好的开发资源放在解决问题上。 <br>Retrieved&nbsp;from&nbsp;"http://wikisource.org/wiki/%E5%A4%A7%E6%95%99%E5%A0%82%E4%B8%8E%E5%B8%82%E9%9B%86" <br>This&nbsp;page&nbsp;was&nbsp;last&nbsp;modified&nbsp;16:08,&nbsp;1&nbsp;Apr&nbsp;2005.&nbsp; <br>Content&nbsp;is&nbsp;available&nbsp;under&nbsp;GNU&nbsp;Free&nbsp;Documentation&nbsp;License. <br></p><img src ="http://www.cppblog.com/KevinYang/aggbug/28327.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-07-19 02:08 <a href="http://www.cppblog.com/KevinYang/articles/28327.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】Debian下beryl-manager窗口乱码问题的解决</title><link>http://www.cppblog.com/KevinYang/articles/28326.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Wed, 18 Jul 2007 18:05:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/28326.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/28326.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/28326.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/28326.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/28326.html</trackback:ping><description><![CDATA[sudo mv /usr/bin/beryl-settings /usr/bin/beryl-settings.bak<br>sudo vim /usr/bin/beryl-settings<br>写入如下内容： export LANG='zh_CN.UTF-8' /usr/bin/beryl-settings.bak 后<br>保存退出； sudo chmod +x /usr/bin/beryl-settingsNerd<img src ="http://www.cppblog.com/KevinYang/aggbug/28326.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-07-19 02:05 <a href="http://www.cppblog.com/KevinYang/articles/28326.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】linux采用企鹅作为标志的原因</title><link>http://www.cppblog.com/KevinYang/articles/28324.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Wed, 18 Jul 2007 17:39:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/28324.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/28324.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/28324.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/28324.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/28324.html</trackback:ping><description><![CDATA[我女儿卡蕾认为，能让人给你买一只企鹅可真是件不得了的事。在晴朗的夜空底下，我们围坐在篝火旁，李纳斯讲述着一个在英国布里斯托尔市的Linux用户组
织是怎样买了一只企鹅送给他。让卡蕾想不到的是，那些人并没有真的给他买一只企鹅，李纳斯解释说，是那个组织曾向某个动物保护组织捐款赞助，然后以李纳斯
的名义认养了一只企鹅。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;托沃兹一家咂摸着李纳斯的故事背后的含义。不知是谁，在烤蜀葵的当口抬起头来，问了一个笨问题：你们是怎么想起用企鹅来做Linux风靡全球的形象标识的？&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;
&#8220;这是我的主意。&#8221;塔芙说道，&#8220;因为人们总是在问，&#8216;难道你们不该做个标识吗？&#8217;所以李纳斯才在这方面动起了脑筋。Linux的各公司都有他们各自的标
识，其中有一家用的是一个粉色三角，但我知道这个标识早已被同性恋者们相当广泛地用上了。我就把这个消息告诉了他。他说，他要找出一个优雅的、有亲和力的
东西来做标识。&#8221;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&#8220;我就想到了企鹅。李纳斯在澳大利亚的时候曾被一只动物园里的漂亮企鹅咬了一口。他喜欢逗弄小动物，总是爱把手探
出去。那些企鹅大概有一英尺高，他刚好能把手探到笼子那儿摸着它们。他晃动着手指，扮成鱼的样子。企鹅被招了过来，咬了他一口：咳，这口感可不像是鱼。他
虽然挨了企鹅的咬，可还是喜欢它们。我觉得他这辈子跟企鹅是没完了，只要一有机会，他就非去看企鹅不可。所以，当他在为找个标识而大伤脑筋的时候，我就提
醒他，&#8216;你这么喜欢企鹅，为什么不用企鹅来做标识呢？&#8217;他说，&#8216;哦，让我想想。&#8217;&#8221;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;李纳斯此时正坐在篝火的另一边摇着头。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&#8220;不是的，这可不是她的主意，&#8221;他说道，&#8220;不是那么回事。&#8221;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;
看来这个小问题还是有争议的。我想，我恐怕还从没见过一对像李纳斯和塔芙这样平等相待的两口子。我曾见过李纳斯做家务，见过他在塔芙早晨还赖在床上的时候
给她弄上杯咖啡，即便是长途行车中应付两个小宝宝的闹上闹下的无理要求，这两口子也总是一副从容不迫的样子：这可真是一桩幸福婚姻。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;我们的问题到了关键地方了。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;李纳斯给出了另外一个故事版本：尽管塔芙在早些时候确实语焉不详地提到过企鹅什么的，但真正认真考虑把企鹅作为Linux的正式吉祥物，还是在李纳斯与两个高级助手的一次谈话当中。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;
塔芙有点儿不服气。&#8220;开头他也不认为这是个好主意，因为这是我的主意。我跟他说过之后，他还是接着想他的。后来在波士顿，我们和亨利?霍尔又谈起了吉祥物
的问题。我对他们说，&#8216;用一只企鹅怎么样？你们觉得呢？&#8217;他们都觉得不错。我想，这才促使李纳斯认同了这个想法。&#8221;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;&#8220;亨利?霍尔说，他认识一个画家，可以找他来给我们画一只企鹅。但这时就再没有下文了。后来我知道的，就是李纳斯开始在网上征集企鹅的图片。&#8221;&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;李纳斯选中的是莱瑞?艾文的图片。这个莱瑞?艾文是德克萨斯A&amp;M大学科学与计算机学里的一位画家。&nbsp; <br>&nbsp;&nbsp;&nbsp;&nbsp;
这企鹅可不是随便哪一只都行。李纳斯想让它有副爽透了的样子，就像刚刚喝下去一扎鲜啤酒，然后又体验了一次无与伦比的性高潮。除此之外，这只企鹅还一定要
很特别才行。于是，其他的企鹅都是黑嘴巴黑脚蹼，但Linux的企鹅却是黄嘴巴黄脚蹼，这使它看上去好像是鸭子与企鹅的杂交品种。也许它是唐老鸭在南极之
旅中与一只当地企鹅一夜倾情的结晶。 <br> <img src ="http://www.cppblog.com/KevinYang/aggbug/28324.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-07-19 01:39 <a href="http://www.cppblog.com/KevinYang/articles/28324.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【转贴】完全摒弃windows,在linux下工作</title><link>http://www.cppblog.com/KevinYang/articles/28323.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Wed, 18 Jul 2007 17:36:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/28323.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/28323.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/28323.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/28323.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/28323.html</trackback:ping><description><![CDATA[<p>我已经半年没有使用 Windows 的方式工作了。Linux 高效的完成了我所有的工作。  </p>
<p>GNU/Linux 不是每个人都想用的。如果你只需要处理一般的事务，打游戏，那么你不需要了解下面这些了。  </p>
<p>我不是一个狂热的自由软件份子，虽然我很喜欢自由软件。这篇文章也不是用来推行自由软件运动的，虽然我觉得自由软件运动是非常好的。  </p>
<p>这
篇文章也不是用来比较 Linux 和 Windows
内核效率，文件系统，网络服务的。我现在是作为一个用户而不是一个开发者来说话的，我们的讨论是基于操作，应用层面的。是为了告诉大学里还不了解，或者不
理解 UNIX 的科学工作者和大学生，UNIX 比 Windows 更适合用于科学研究工作，请大家理解 UNIX 的工作方式，不要用
Windows 的标准来要求 Linux，而要用一个科学工作者的标准来要求自己，用UNIX 的思想来武装自己。 </p>
<p>我显然是反对在大
学，特别是理工科专业推广 Windows 的。我也反对在对"娃娃"们的计算机启蒙教育中使用 Windows。因为 Windows
不论从技术上，经济上，思想风格上都是与我们培养高科技人才的目标格格不入的。Windows
的流行属于历史遗留问题，爷爷一级的人当然已经不可救药，但是我们不应该让下一代继续走上歧途。 </p>
<p>UNIX 不是计算机专家的专利  </p>
<p>当我建议一些非计算机专业的人用 Linux 的时候，很多人说："UNIX 是计算机系的人用的，我们不能理解。" "UNIX 是男孩用的，我们女孩不用。"  </p>
<p>但是其实世界上的大多数科学家和工程师几乎用的都是 UNIX 作为他们的电脑工具。就因为它简单，可靠，稳定，强大，有趣。甚至很多时候 UNIX 就是唯一的选择。  </p>
<p>你说："我们都会用 UNIX 的话，你们计算机专业的人还用来干什么？" 很容幸的告诉你，计算机专业的有一部分人就是专门为你们提供这样强大而方便的计算机工具的。如果他们制造的工具只有自己会用的话，那这个工具还有什么用？  </p>
<p>理解 GNU/Linux 不要用 Windows 的标准来要求 Linux。  </p>
<p>由于GNU/Linux这个词太长，下面如果没有特别指明，"Linux"就是指GNU/Linux"。  </p>
<p>在这个年代，恐怕没有人需要我来介绍 Linux 是什么了吧？如果你觉得"Linux 只不过是跟 DOS 差不多的东西"，那请问问你旁边的 Linux 用户，Linux 到底是什么？  </p>
<p>那
为什么我还要写一篇这样的文章？因为，我发现还有很多人不不理解 Linux 和 UNIX，虽然他们也在用它，但是他们有时会问："为什么
Linux 不能像 Windows 那样 &#8230;&#8230;？"，"怎么Redhat Linux不能 mount NTFS 分区！"，"Linux
下用什么整理硬盘？"，"什么时候OpenOffice才能完全兼容Word文件啊？"，"现在还有什么Windows能干的事情Linux干不了的？
"&#8230;&#8230; </p>
<p>他们有40G的硬盘，却只为 Linux 分配了2G空间，有时还抱怨"这个东西怎么占这么多硬盘！" 似乎 Windows
该占用大部分硬盘。他们把重要的数据装在Windows的分区，似乎信不过Linux。他们总是到处寻找新奇的，好看的GUI程序，对命令行的东西一概不
屑一顾。他们对Drag&amp;Drop，菜单配置，自动升级非常感兴趣。他们如果找到一个很像 Windows 程序的 Linux
程序，一定会很高兴的说："哈哈！Linux
也能&#8230;&#8230;了！"如果Linux在某种测试中胜过Windows，他们会高兴得跳起来。他们没有办法用Linux
解决问题的时候，甚至用Wine来运行Windows程序。有时实在没办法，只好重起到Windows，或者干脆省得麻烦，在 Windows
下装一个 VMWare 虚拟一个 Linux 玩。 </p>
<p>你如果出现了上面的情况，说明你的思想受到了 Windows
的某种潜移默化的影响和误导。你没有能够从本质上理解存在于 Linux 身上的 UNIX 思想。你支持 Linux，你喜欢
Linux，你能从中感觉到快乐，这非常好。你现在只需要明白的是：Linux 从来就不是一个玩具，它是天才UNIX的后代。UNIX
是自晶体管发明以来最伟大的发明，它从诞生那一天开始就比 Windows 的设计出色。 </p>
<p>你要体会什么叫做"设计"，一个糟糕的设计并
不是到后来缝缝补补就可以变好的，而一个出色的设计，不但可以以不变应万变，而且可以影响到后来者。一个出色的设计配上一个出色的实现，那就是非常出色的
发明。Linux 就是这样的一个出色的发明。Linux 并不需要追赶
Windows，也不需要打垮微软。它的最终目标是改变整个计算机世界，还人们自由，给人们乐趣和方便。 </p>
<p>Unix 是简单的，你不需要成为一个天才也能理解这种简单。  </p>
<p>UNIX
的设计者 Dennis Ritchie 说："Unix is simple. It just takes a genius to
understand its simplicity." 但是我不这么认为，因为我不是一个天才，但是我却勇敢的把 Windows
完全删除掉，遇到不明白的事情的时候努力用 UNIX 的方式去解决，而不是寻求 Windows 的帮助。现在我体会到了 UNIX
的思想和好处，我可以用比 Windows 高效几倍的效率工作。因为我相信这样的信念："Windows 能办到的事 Linux
一定能办到，而且办的更好。" </p>
<p>这小节开头的话应该改成："Unix
是简单的，你不需要成为一个天才或是计算机专家。但是在这个冲斥着 Windows 错误观念的世界，你需要信念和勇气才能理解它的简单。"
我下面就告诉你一些我理解到的东西。首先，你要知道的是微软在国际科学领域是根本没有地位的。 </p>
<p>微软的地位  </p>
<p>微软的名声
在欧洲和美国的大学里，特别是在计算机系里之坏，大家可能有所耳闻。我认识的 MIT，Stanford
的教授，贝尔实验室的专家，甚至一个欧洲小国的高中计算机老师都绝口不提微软的名字。在他们眼里，微软只是一个没有真技术，专靠在落后国家商业宣传和垄断
经营的小公司。这个"小"并不是说它人少，钱少，而是说它先进技术少。 </p>
<p>我上次和王益合作写了一个算法演示程序，那个算法是贝尔实验室一
位科学家Steven Fortune很天才的发明，为了程序能够被身边大多数人使用，我们选择了 VC+MFC 作为平台。我在分析算法时还得到
Fortune 很热情的鼓励，寄给我一份资料，还多次回信耐心的给我讲解了很多细节。但是程序完成之后，我把样品发给
Fortune，他回信说："对不起。我机器上没有 MFC。" 话说的很客气，但是我已经感觉到了他对 Windows的不屑。然后我把 MFC
静态编译进程序再发给他，他就没有再回信了。他显然不是瞧不起我，而是确实有难处。 </p>
<p>你能感觉到这位科学家对微软和 Windows
是什么态度了吧？不是反感，而是他心里根本没有 Windows
这个东西！微软在高科技领域没有发展，那么它怎么生存呢？到发展中国家去发展一下，他们的人民还对电脑一无所知，我说不定甚至可以打入大学的计算机系呢。
我送他们软件，我捐钱盖大楼，我出钱找图灵奖获得者来演讲，让他们觉得我们都是科学家！ </p>
<p>好了，现在全国的大学包括清华，几乎所有人机器
必装盗版 Win2000，Office XP，学校的选课系统是非IE不能正确浏览，论文用 Word 编辑，演示用ppt做，email
的通知附件是 doc 文件，你不用 Word 打不开，连 863 项目都用 VC
写程序了。我很久以前就看到一份报纸说，"微软为什么不严厉打击盗版？"
这篇文章说，微软非但不打击中国的盗版行为，而且有放任之趋势。放长线吊大鱼，"以后我要你们加倍的来还我！" 确实如此，它的目的快实现了。 </p>
<p>Windows 笼罩下的中国计算机教育  </p>
<p>说句丢脸的话，比尔盖茨很久以前是我的偶像&#8230;&#8230; //blush  </p>
<p>在
中国，比尔盖茨被很多人奉为神圣，"少年电脑天才"，甚至有的人提到他的名字就做出"抱拳对天"的姿势。很多人谈到微软的"新技术"，"高科技"
都是眉飞色舞。各种"VC编程圣经"，"深入了解 Visual
C++"之类的书，在开头几页都会出现非常肉麻的字眼，"在那团团的混沌中，一个开天辟地的精灵，Windows 1.0，诞生了&#8230;&#8230;" </p>
<p>微
软的软件被这么多人盗用，那么人们是怎样使用这些盗版程序的呢？先看看电脑培训班，教的都是一些 DOS 命令，打字，Windows
基本操作，Word 文档处理，PowerPoint，高级班可能有 Excel，Access&#8230;&#8230; 参加各种微软认证考试，MCSE，MSDE
的人络绎不绝。考试辅导班都贴出了"280元，考过为止"之类的字样。考试参考资料更是昂贵，有些电脑书店整整两书架都是"Microsoft
Press"的东西。我有个同学参加认证考试，每门考试都要200多元。而且你一次考不过可以再考，又要交钱。他后来还津津乐道跟我说，看我，花了
XXXX(一个四位数)元考过了微软认证，得到一张比尔盖茨亲笔签名的证书和价值6000元的 Windows XP 内部发行版。 </p>
<p>"
电脑要从娃娃抓起"，我们再来看看娃娃们学的是什么。大部分家长给孩子买了电脑之后，他们首先就会装一个盗版的
Windows，然后买来盗版的游戏开始玩。如果哪个孩子会用 Delphi
编程序，那可不得了。报社记者，电视台争相报导，说，某某学校的初中生某某，在别人都还在玩电脑游戏这种"初级阶段"的时候就已经用 Delphi
写程序了。镜头还瞄准了他显示器上面的像框中的比尔盖茨头像！ </p>
<p>我刚进入大学计算机系时还不懂得什么是操作系统，因为我以前只用过"中华
学习机"。看到新入学的同学们各个谈论的都是 "Windows 95"，"VC"&#8230;&#8230;
我简直觉得我落后了好几十年一样，整个一土人，根本跟他们答不上话。好不容易找到一个比较熟的同学问了一下："你们天天谈论的瘟95是什么啊？"答：
"win95就是一个操作系统，跟DOS是一类。""朵死是什么？" "你连DOS都不知道是什么？别在计算机系混了。"
学校上课当然不讲VC编程之类的东西，但是上 Pascal 的老师有一次就说："嗨，我们学校真是落后。现在别人都用 C, C++，甚至 VC
了，我们还在讲 Pascal。不知道什么时候才能有VC课啊。你们出去也是要用VC的，只好自学了。"
于是，有些同学很多时候上课都捧着一本很重的"Windows
编程大全"之类的书，根本没有听课。吃饭时就念念有词的跟我说，"代码的优化是无止境的"，"匈牙利命名法真是伟大的发明" &#8230;&#8230;
这就是中国很多大学计算机系的情况。 </p>
<p>感觉到无知了？这不是偶然的，而是微软长久以来埋下的伏笔。它要让无知的大家都把它奉为神圣，它要
让支持UNIX，Xwindow的人一旦说 UNIX 好，Xwindow 好的时候，都被一群人围着说教："这个 Windows
也能做到"，"你对 Windows 有偏见"，"微软才是主流啊"，"你敢瞧不起 win2k？"，".NET
就是世界潮流"，"微软的毕竟是新技术"，"有钱就是有技术"&#8230;&#8230; 甚至在一番论战比较后败下来还是要说："Windows
性能差点，但是易用性强"，"Windows 是老百姓用的，要求别那么�"，"微软那么有钱，以后想超过 UNIX 还不容易吗？"&#8230;&#8230; </p>
<p>发达国家的计算机教育  </p>
<p>我
前段时间在 USENET 发文问有关 Scheme
语言的问题时，认识了一位丹麦人。他解决了我所有的问题，并且建议我阅读一些很"深奥"的有关程序语言语法，文法的书，他告诉我很多网站可以学习
LISP，Scheme，人工智能，算法。他叫我看 Jonathan Rees 的论文 "Syntactic
Closures"。他还打包给我寄过来一份 MIT 的 "How to Design Programs"。他说他在自己的 PC 机上装的是
Linux，他用 Emacs 编辑，运行Scheme 程序。他对 Emacs 的了解和爱好真是使人惊讶。他大学本科毕业时做的毕业设计是一个
Scheme 解释器。这对于我来说是望尘末及了。 </p>
<p>他是那么的不厌其烦，我的每一个问题他都详细的回答。我有时都觉得过于详细了，怎么这么耐心啊？我觉得他似乎是我的高中老师。他是什么样的人呢？我好奇的打听了他的情况。原来，他是丹麦一所普通高中的计算机老师。  </p>
<p>他说他在高中里讲授程序设计和算法，计算机语言文法。他说用 Scheme，他的学生不用再为内存泄漏等程序语言本身的问题而烦恼，而专注于问题和算法本身。有利于培养学生解决问题的能力，特别是用计算机解决数学问题的能力。  </p>
<p>天哪！为什么欧洲出现那么多数学家，几何学家？你看看别人重视的是什么！我们的计算机教育如果继续这样下去，只会沿着弯路越走越远！  </p>
<p>微软和它的朋友们的如意算盘  </p>
<p>下面来看看微软的收入是怎么来的。首先，Windows 98系列操作系统，一个就是 100多美元，每次升级又是几乎同样的价钱。Windows NT 还要贵几倍，而且有用户数目限制，5个用户的，10个用户的&#8230;&#8230; 以后如果要增加用户数目还要按比例付钱。  </p>
<p>花
了如此多钱买来的操作系统就能用了吗？它竟然连压缩程序都没有提供！你装上Windows 之后一般第一件事就是去下载一个 WinZip 吧，"只要
29 美元"。Windows会中病毒啊，马上花 70 美元买一个 Norton AntiVirus 吧。还有黑客呢？再买一个Norton
Internet Security 好了，100 美元。系统需要优化，磁盘需要整理，买一个Norton System Works
是你最佳的解决方案，100美元。 </p>
<p>可是你现在还是不能干正事啊！你想要一个 Word, PowerPoint？那就买一套 Office XP 吧，一起买便宜些，$459.90。  </p>
<p>那
些程序不会用啊！那些菜单怎么设置，到底有什么功能啊？看"帮助"也学不会。买本书看看吧，我推荐"Special Edition Using
Microsoft Office XP"，不贵，$27.99。这本书里面大部分是屏幕抓图，还是买一本旧的比较划算，$17.85。 </p>
<p>你如果只是当个秘书，上面的差不多还凑合了。可是你有更高的追求，你想成为 Windows程序员。首先买一个 Visual Studio.NET 吧，要不然怎么编译程序。$494.95。  </p>
<p>为了紧跟微软动向，世界潮流，不能不注册个 MSDN 什么的吧？这个贵一点，不过物有所值啊，$2,799。  </p>
<p>嗯，你现在已经是上层阶级，白领人士了。你现在可以像这样"自由"的，"安全"的生活了。  </p>
<p>为什么要反对使用 Windows  </p>
<p>很多人都说不应该完全否定 Window，Windows 也有它的长处。不应该骂微软。  </p>
<p>对。
Windows 容易操作，适合普通用户。如果微软把它自己定位在 P&amp;G，Philips
那样的地位，能够给我们的百姓提供周到的，完善的，价廉物美的服务。那我肯定是很喜欢它的。但是从上面的种种情况说明，微软是一个野心极大的国际垄断组
织！它的产品没有一个是不出问题的：Windows 不稳定，容易中病毒，而微软不为大家免费提供杀毒软件。我就是要让你们花钱买我的朋友
Symantec 的杀毒软件，谁叫你们已经上了我的贼船？这叫什么售后服务啊！ </p>
<p>你买来微软的程序，安装的时候一般都有一个协议，说：
"由于微软的程序造成你的数据损坏或丢失，微软概不负责。" 我想很多人肯定觉得这个不合理，不想按那个 "I
accept"。但是你的软件买都买来了，钱都花了，现在一按 "I decline"，安装程序马上就会退出。你只好被迫点击了 "I
accept"！这不是不平等条约吗？ </p>
<p>我已经目睹了好几个朋友的文档被 Microsoft Word
损坏，有的是编辑了十多天的30多页的论文，有的是费了很大工夫做出来的个人简历，那个朋友为此失去了到自己向往的P&amp;G
工作的机会。就在他要投简历的前一个晚上，就在那一瞬间&#8230;&#8230; 不知道他痛哭的时候有没有想起要投诉微软，可是谁叫我们用的都是盗版呢，况且你还点击了
"I accept"。 </p>
<p>微软仗势已经占有大部分PC市场，制定不符合国际标准的"微软的标准"，以不合理的方式压制其它公司的软件，这
个问题已经在美国司法部闹了很久了。他甚至在 Windows系列操作系统中放置能够通过网络泄漏用户信息的代码，以至于 Windows
刚进入澳大利亚时被澳大利亚政府禁止使用。 </p>
<p>有些人说："微软毕竟开创了一个历史，造就了今天的 IT 行业。" 但是，如果没有微软，我们今天早就用上非常稳定，非常可靠，非常方便，非常"傻瓜"的软件了！微软是阻挡信息技术发展的罪魁祸首。  </p>
<p>微
软的程序的工作方式(注意，我只是说操作方式，病毒的事情另外算)确实适合于一般家庭，上上网，发发邮件，打打游戏都不错。可是微软却要把自己包装成什么
"高科技"企业，要在世界各地设置"研究院"，在大学计算机系赠送不适合用于科研的
Windows产品，甚至出钱请图灵奖得主来中国畅谈"二十一世纪的计算"，还在大会上宣传自己的 .NET
技术。非要把别人认为自己是科学的，自己是领导世界高科技的。但是呢？它什么高科技也没有。欧洲，美国，哪一个关键部门在用微软的东西？NASA?
DOE? CERN?你仔细想一想，微软的程序对人类到底有什么重大作用？ </p>
<p>什么是 Windows 能干而 Linux 干不了的事情？--- <br>"Windows 能干而 Linux 干不了的事情，那就是不需要干的事情。"  </p>
<p>有个朋友看我半年没有用 Windows，有时就会问我："你只用 Linux，有没有发现有些Windows 能处理的事情 Linux 干不了？"--- <br>我回答说："Windows 能干而 Linux 干不了的事情，那就是不需要干的事情。"  </p>
<p>Windows 能做的有益的事情 Linux 都能做--- <br>Windows
下的某些功能确实是我们需要的，那么 Linux 的开发者们和用户也需要这种功能，他们就会去实现这种功能，而且比 Windows
的方式好得多。由于大多数科学家，工程师用的都是 Linux 或者某种商业 UNIX, 所以几乎所有商业的科学工程程序，比如Matlab,
Mathematica, AutoCAD, Candence的，Synopsys的，Avant! 的&#8230;&#8230;全都是先有UNIX
的版本(包括Linux)，然后再考虑移植给 Windows，甚至根本不移植给Windows，因为 Windows
的机器一般没有足够的能力运行这样的程序。你不要以为只有 Windows 才有 PSpice, UNIX 的 HSpice
要好得多，而且可以运行在大型主机上。当然它们不是免费的，但是它们值那个价钱。 </p>
<p>但是 Windows 下有些东西在 Linux 下没有很相似的，或者你找到很多类似的，但是它们每一个比起 Windows 的那个程序都要差很多，那么原因有两种可能性：  </p>
<p>有
一个完全类似的程序，但是由于它乍一看不漂亮，被你忽略了。而其它程序虽然看起来很漂亮，但是它们是一些初学编程的人写的。现在由于 Gtk, Qt
的诞生，Linux
下开发图形界面程序极其简单，很多初中生甚至小学生都可以随手编出一些漂亮不中用的程序。如果你整天寻找这样的程序挑来挑去，永远也找不到你满意的。当然
也有一流的程序用 Gtk 和 Qt，比如 GVIM 就可以用 Gtk 作为图形界面，我还知道 Synopsys 一些程序用了 Qt。 </p>
<p>我
曾经也犯过这样的错误，从外表区分一切。结果优秀的 FVWM, lftp, Mutt, wget
都被我忽略过。当我找回它们的时候，我是那么的羞愧不已，它们现在都是我的朋友 我第一次看到 FVWM
觉得它只不过是一个有很厚很难看边框的东西。可是现在，我的同学看到 FVWM 都说："哇！真漂亮。" </p>
<p>有另一种完全不同的方式可以达到相同的目的，甚至更好。  </p>
<p>很
多人很关心 Open Office, Star Office, AbiWord, ... 他们多么盼望有一天某一个Linux
程序能够完全兼容的打开一个复杂的 doc
文档。但是你永远也不可能有那一天。为什么呢？因为微软为了占有市场，必定不会让其它系统的程序能够完全兼容它的文档格式。它一定会不断变化 doc
文档的内部结构，隐藏一些秘密，让其它公司的程序打开 doc 文档时总是有某种问题，从而你必需购买 Microsoft Office 和
Windows。 </p>
<p>你应该想一下，那么多的高智商的大学教授，科学家，学生，他们用的都是 Linux 或者其它类型的 UNIX，他们没有 Word 可用，怎么处理文档呢？这么多年没有一个像Open Office 的程序出现，难道大家没有办法写文档吗？  </p>
<p>显
然不是这样。你看看那些高水平的学术杂志，论文，那些大学教授的网页，那些漂亮的幻灯片，它们是什么做的？原来 UNIX 用户早就有非常方便的
troff, LaTeX, SGML等东西可以处理文档，而且它们比起 Word 都要高明的多。Word
显然被这些大拿忽略了，以至于很久以来没有人想在 Linux 下开发一个类似 Word 的程序，除非某些公司想抢微软的饭碗。 </p>
<p>很多
人留着 Windows 在硬盘上的原因无非是为了用 Word 和 PowerPoint。我见过一个教授，他的 Windows 笔记本电脑上除了
PowerPoint 什么都没有。有一天演示的时候，他指着堆乱字符说："对不起，这是一个公式&#8230;&#8230;怎么每次都是这样&#8230;&#8230;"
其实有比PowerPoint
好几百倍的东西可以制造幻灯片，你可以用最简单的方法制造世界一流效果的论文和幻灯片。你待会儿可以看看我的TeX网页，你就会知道为什么我可以完全离开
Windows。 </p>
<p>Windows 能做的那些没用的事情 Linux 永远做不好  </p>
<p>电脑游戏 <br>有些人说 Linux 下不能玩 Windows 下所能得到的所有游戏。的确，Linux 下虽然也有少量的游戏，比如 Quake。但是它没有 Counter Strike, 没有 Star Craft, &#8230;&#8230;  </p>
<p>并不是说电脑游戏不该玩，但是应该适可而止。电脑是用来处理事务，帮助你学习，解决问题的工具，而不是一个玩具！整天沉迷于电脑游戏中，而不出去感觉外面的世界，你会变得越来越冷酷，越来越缺乏人情味。你与真实的世界越来越远。  </p>
<p>你
可以在 CS 里杀人，你可以在 Tomb Raider 里探险，你甚至可以在 Tony Hawk's Pro Skaters 里滑板&#8230;&#8230; 但是
It's not real！你虽然有很高的"反恐技巧"，但是遇到歹徒的时候，你是那么的怯懦；你虽然控制 Laura
伸手敏捷，但是你打篮球的时候怎么总是被人断球？你虽然可以轻易的在 THPS 里作出一个 "360 kickflip to hangten
grind to fakie"，但是你踩在自己的滑板上的时候还不会 ollie！ </p>
<p>说回来，如果你偶尔玩一下电脑游戏未尝不可。但是
世界上有远比 Windows + PC 更好的游戏方式。Sony 的 PlayStation2, SEGA 的 DreamCast,
Nintendo 的 N64，Namco的街机&#8230;&#8230;每一个都比 Windows 游戏精彩，每一个都有如此高的3D性能，以至于Pentium4,
Itanium + GForce4 都无法与它们比美！ </p>
<p>Linux
的用户们都是关心解决世界的关键问题的份子，他们哪里有时间用自己的机器来玩游戏啊？他们每天用Linux高效的做完自己的工作就到阳光下享受自然去了。
要玩游戏也是玩一些类似推箱子，贪吃蛇之类的智力小游戏。所以，你知道为什么 Linux 几乎没有游戏了吧？ </p>
<p>"整理硬盘，优化系统"  </p>
<p>这是一个非常有意思的话题，仅次于有关"病毒"的话题。相信很多 Windows 用户都有整理硬盘的经历。在很多 Windows 用户眼里，"硬盘用久了，会出现碎片，速度会减慢，需要一个程序来整理，整理硬盘的时候不要做其它工作"，这好像是天经地义的事情。  </p>
<p>我也曾经津津有味的看着 Norton Defrag 一点一点的把我的硬盘排序，调整，用图形的方式显示出来，然后报告�"100% 没有碎片。你的硬盘现在已经达到最佳状态。" 我现在才发觉我那时是多么的幼稚。  </p>
<p>Linux
和 UNIX
用户似乎从来没有"整理硬盘"这种说法呢？你觉得很奇怪吗？如果你觉得很奇怪，那说明你的思想在某种程度上被微软的垃圾程序禁锢了。你需要明白，UNIX
的大型主机很多必须是一天24小时，一年365又1/4天不停运转的，要是每个星期都要整理一次硬盘，在整理的时候几乎不能干任何事情，那是绝对行不通
的！ </p>
<p>Linux 机器根本不用整理硬盘，这就是为什么没有看到过 Linux 用户整理硬盘。Linux 的文件系统是比
Windows 的 FAT, FAT32, NTFS
高明得多的文件系统，它们不但可以对文件设置权限，实施完全的保护，而且可以"越用越整齐"，"越用碎片越少"！你应该把文件大部分放在 Linux
的分区，而不是 Windows 分区，因为它比 Windows分区可靠得多。 </p>
<p>还有更滑稽的事情就是有很多"Norton
System Doctor"，"Windows 优化大师"，"超级兔仔注册表魔法"
之类的程序存在，而且价格昂贵。似乎一个操作系统本来应该有很多问题，需要别的厂商做程序来"优化"它，而且为了得到优化，你需要付钱！这些问题
Linux 根本就没有，所以不需要什么优化。Linux 内核本身就是高度优化的。 </p>
<p>IDE  </p>
<p>有些人在抱怨为什么
Linux 没有一个良好的 IDE 开发环境。Linux 现在已经有一些IDE 了，但是总是有很多问题。你是不是正在寻找，正在期望 Linux
某一天可以有一个VC那样的开发环境？你有没有发现你正在进入微软给你设下的怪圈？你为什么一定要用 IDE？你说："IDE
开发迅速，调试方便，适合大型程序&#8230;&#8230;" 那说明微软的程序在你脑子里已经比较根深蒂固，你需要好好清醒一下了，看看我来告诉你。 </p>
<p>高明的 UNIX 程序员不用 IDE，IDE 从来就是给初级 Windows 程序员用的。  </p>
<p>你
看看大型的 UNIX 程序，包括 Linux 内核，各种网络服务程序，Xwindow 程序在内，哪一个是 IDE 搞出来的？我们实验室的
EDA 程序也没有一个是 IDE 弄的，我还知道Candence, Synopsys，Mentor 的高性能的图形界面 EDA 程序也都不是
IDE 写的。你信不信，微软的人在写 Windows 本身的时候也根本不用 IDE。微软内部程序员最喜欢的编辑器其实是 VIM，用 VIM
的微软程序员上次向乌干达的可怜儿童捐助了1000多美元，这是值得称赞的。 </p>
<p>有一次某杂志采访一些出名的 Linux
内核程序员，包括 Linus 在内，没有一个人用IDE，有的人用 VIM，有的用 Emacs，只有 Linus 说"GNU Emacs is
evil"，但是其实他用的是一种跟 Emacs 有同样键绑定功能的 MicroEmacs。大家都是用编辑器编辑了程序文件，然后用 make
这样的自动工具调用 gcc 编译器完成编译工作的。甚至高级的 Windows 程序员也不用 IDE，他们可以从命令行调用 cl，nmake
来编译自己的程序。虽然这样的 Windows 程序员很少，但是他们却是最了解 Windows，最高明的Windows 程序员。 </p>
<p>为
什么 UNIX 程序员不用 IDE？明白了这个道理你就能体会到 UNIX 的设计思想了。首先，一个 IDE
集成了编辑器，编译器，汇编器，调试器，跟踪器&#8230;&#8230; 这个编辑器功能肯定比不上 VIM 或 Emacs，编译器比不上 GCC，汇编器比不上
as，调试器比不上 gdb，ddd, 跟踪器比不上 strace, ltrace,
truss。你得到的是一套整合的低能的程序。如果你对调试器的功能不满意，你只好换用另外一套 IDE，但是这套 IDE
的热键，菜单，编辑器功能，按钮&#8230;&#8230; 跟原来那个有很大不同。你不得不花很多时间来熟悉新的环境，而不能保持原来的某些东西。 </p>
<p>而在
UNIX 下就不一样了。你可以用你最喜欢的 VIM 编辑程序，你在 VIM 里可以调用GNU make，make 可以调用 gcc, ld,
... make 的出错信息可以被 VIM 捕获，VIM 能帮你在源程序里定位。你如果喜欢 icc, 你可以让 make 用 icc 而不是
gcc。你如果觉得 gdb 跟踪变量时比较麻烦，你可以用 ddd 来显示各种数据结构之间的关系。你还可以在 Emacs 里调用
gdb，那样就可以同步显示源代码了。而且 VIM 和 Emacs 还可以编辑很多其它东西，比如信件，LaTeX 文档，HTML，配置文件&#8230;&#8230;
你不用另外找一个什么编辑器来干这些杂活了。很多程序比如 Mutt, tin 都可以在内部使用 VIM，这样就更方便了。实际上 make
在其它方面还能帮你很多忙，我的每一个比较大型的 LaTeX文档都是用 make 维护的。 </p>
<p>Linux 能干的高精尖的事情 Windows 都干不了  </p>
<p>当
然有很多事情是Linux/UNIX的专利了。因为 Windows 只能装在 PC 机上，好像以前也有 Alpha 可以使用 Windows
NT，但是就是没见到有人用。PC 机的能力是很低的，像我们编程序处理 NP-Hard 问题的人，用 Windows
的机器显然速度不够，而且有时一个问题算上几天甚至几个星期，Windows
机器是以"死机"著称的，我们怎么能放心？所以几乎所有科学计算程序，EDA 程序，高性能图像处理程序都不是 Windows
的。他们有时也会移植一些给 Windows，但是常常降低那些程序的能力。你比较过 Windows 版本的 Mathematica 和
Linux 的有什么区别吗？ </p>
<p>IBM 制造的最大的并行计算机有 8000 多个处理器，Windows 不可能有能力管理这么多处理器，它用的是什么操作系统？答案是 Linux。  </p>
<p>《泰坦尼克号》电影里的三维动画，那么细腻逼真，Windows机器能做出来吗？不行。那也是 Linux 机器做的。  </p>
<p>民航总局用来训练地情人员的虚拟现实训练设备，Windows 当然无能为力。那都是商业的 IRIX 机器。  </p>
<p>UNIX
是最早支持 TCP/IP
网络协议的系统。它上面有很多可以互相协作的网络服务程序，它们经过多年的使用和修订，已经达到比较完善的程度。而就在1997年，微软的比尔盖茨还在扬
言："Internet 是没有前途的。"
微软的这个"远见卓识"大家应该都已见识，它后来加上的网络服务程序IIS漏洞之多，让公安部都频频发出警报，大家也是见识了的。 </p>
<p>其实你知道了，Windows 没有一样有用的事情能比 UNIX 干的更好。  </p>
<p>Linux 干不了的有用的事情 Windows 照样干不了<br>当然 Linux 不是万能的。它也有不能干的事情，电脑也有干不了的事情。但是 Linux干不了的事情，Windows 肯定也干不了。这些事情就是我们需要探索，需要努力的事情了。在你探索的过程中，Linux 必定是你的好伙伴。  </p>
<p>不要把Linux和Xwindow掩盖起来！不要把我们的用户当成傻瓜。  </p>
<p>什么？你早就知道 Windows 是垃圾？噢！你怎么不早说呢！害我废话这么多。嘿嘿。  </p>
<p>"好了。你知道 Windows 是垃圾，你现在用什么�"  </p>
<p>"Linux + Xwindow"  </p>
<p>"那我问你，Xwindow 是什么样的？"  </p>
<p>"不就是跟 Windows 差不多吗？只不过 'Start' 按钮比较方，而且上面不是一个Windows 标志，而是一个脚丫子。点击一下居然还有很漂亮的中文菜单。我喜欢！"  </p>
<p>"你知道什么是'根窗口'吗？"  </p>
<p>"不知道。从来没听说过呢？"  </p>
<p>"根窗口就是遮盖整个屏幕的那个最大的窗口。"  </p>
<p>"哪儿有什么窗口啊！我没有看到呢？"  </p>
<p>你
发现了问题吗？这些 Linux 用户说是在用 Linux 和 Xwindow，但是他们对 Linux和 Xwindow
几乎完全不了解。很多人用了那么久 Xwindow
都不知道根窗口是什么东西，不知道其实按钮也是窗口，不知道窗口管理器和其它程序有什么关系，大家都以为窗口上面的按钮是程序自己放上去的，不知道窗口
�"class name"，"resource name"是什么东西。他们也不知道 .Xdefaults
是用来干什么的。特别是他们很多人都不知道 Xwindow 的字体是如何命名的，什么是 fontset，有了一个新的字体也不知道怎么安装。 </p>
<p>他
们被遮在 Linux 之上的一层一层的包装迷惑了，他们等待有图形界面的工具来帮助完成一切事情，他们认为 Linux 跟 Windows
一样，只是麻烦一点。他们知道 Linux内核很好，但是他们感觉不到 Linux 和 Xwindow 在操作层面的天生的先进性，随后不久就把
Linux 完全删除掉了。你发现没有，要用户理解 UNIX 和 Xwindow
的操作层面的先进性，才是留住用户的最好办法。如果用户体会不到操作时的方便和高效，内核再好他们也不会理会。 </p>
<p>但是用摹仿
Windows 的作法来吸引用户，永远会失败的。因为 Linux 如果摹仿Windows那一套低效率的方式，那么 Linux
的这套"低效率方式"永远比不上Windows 的那一套"低效率方式"。那么用户就会说："这个 Linux，没有一样比的上 Windows。" </p>
<p>Linux
天生就是继承了 UNIX 的高效的工作方式，为什么我们要把它掩盖起来？我们为什么只告诉用户 KDE 的菜单怎么用？我们为什么不能像早期的
Xwindow 书籍那样第一节就告诉用户什么是 X server, 什么是 X client，什么是 Window Manager,
什么是根窗口。第二章就告诉用户窗口有哪些属性，什么是 classname, resource name, hint，怎样使用
.Xdefaults, xrdb &#8230;&#8230; </p>
<p>在这里我又不得不说一下那些 Linux 的发行公司和写书的人，他们把 Linux
和Xwindow 包装起来，却没有从基本上告诉用户 Xwindow 的工作原理。很多书籍讲授的层次就是在Gnome, KDE
的菜单操作的层次，靠大量抓图来占篇幅，"繁荣"Linux 书籍市场。 </p>
<p>现在很多人已经把能够利用别人的库写出一个好看的程序作为自己
编程水平的象征。在这�"图形化"，"可视化" 的年代，你如果还在用 troff, LaTeX 写文档，你还在用VIM 自己编辑 HTML，用
Mutt 处理邮件，你还在用文本模式的 gdb 调试程序，你还在用Xlib 写程序, 你还在用 tin 上 USENET，你还在自己写
Makefile，写机器代码，你还在玩 Clossal Cave 这样的字符模式冒险游戏，那你就是老古董。 </p>
<p>其实这种思想是错误
的。虽然你是一个坚决的 Linux 支持者，但是你的思想是
Windows的思想。你认为图形界面，菜单，按钮就可以解决一切问题，就可以给你高效方便。你还是没能摆脱微软给你的潜移默化的东西。你其实离不开
Windows 那样的环境，你迟早会删掉自己的 Linux。 </p>
<p>GUI vs. CLI <br>做一个坚定不移的"两面派"  </p>
<p>大家看到这个标题是不是热血沸腾？两派大虾都可以围攻我了：  </p>
<p>GUI派用户："哇！我一看你这小子就是 CLI 的。要不然自己写什么 Makefile？用什么Mutt？"  </p>
<p>CLI派用户："切～ 你还用 X！高手都不用 X。你是 GUI 那边的。"  </p>
<p>可怜的我："555～～ 你们都不要我～～ GUI 和 CLI 就那么水火不容吗？"  </p>
<p>计
算机界这样的门派之分还很多。很有特点的就是 CLI 和 GUI 了。CLI (Command LIne)的狂热份子声称永远不用
X。我上次在实验室看到一个同学用一个 SecureCRT 登录到Sun 机器，然后用一个 vanilla vi 编辑程序，我建议他启动一个
GVIM 过来显示在Exceed 上可以有语法加亮。但是他坚决反对，说："高手不用X。你想想，要是我在一个很慢的网络连接怎么用
X？而且好多服务器没有装 X 程序。" </p>
<p>但是我们实验室的网速可够快，Windows 机器都有 Exceed 啊，而且 Sun
机器有全套X 客户程序包括 GVIM。他说他是 CLI 的坚决拥护者，但是他却在用 Windows，他后来打开了好几个
SecureCRT，每次从文本框输入地址，用户名和密码，从下拉菜单选择"SSH2"，然后点击"Connnect"。他还不断的夸SecureCRT
是"网络管理员投票选出的最受欢迎的登录方式"。老天，SecureCRT 本身就是个 GUI 啊，他其实没有明白Xwindow 的好处。 </p>
<p>你
说我是 GUI 的？我虽然很少在 console 下工作。但是我对 bash, VIM 很熟悉，我可以让 bash
按照我的键绑定方式来工作。我可以在 rxvt 里使用 Mutt 来收发 email。我的每个桌面上都常常堆放着一打不同大小的 rxvt。我用
VIM 编辑 LaTeX。我自己写Makefile 来维护 LaTeX 文档。我有时用 mpg321 来放
mp3。我上BBS用的我自己写的expect 脚本。 好了，CLI 派的朋友可以收我做盟友了 </p>
<p>你说我是 CLI 的老古董？我的
FVWM 被我配置为可以"手写操作"，我只要画一个"r"就可以启动 rxvt，我只要画一个 "U" 就可以启动 GVIM，&#8230;&#8230; 我用 GVIM
语法加亮模式编辑程序，我用 Mozilla 浏览网页，&#8230;&#8230; GUI 派的现在好像认我做朋友了 </p>
<p>好了。CLI 派的朋友，虽然我很喜欢命令行，但是我有时在屏幕上左右画一下就可以执行:  </p>
<p>Module
FvwmConsole -terminal rxvt -geometry 45x5-0+0 -bg gold -fg midnightblue
-fn "-adobe-courier-medium-r-*-*-14-*-*-*-*-*-*-*" <br>你是不是现在又想把我逐出师门？  </p>
<p>GUI 派的朋友，虽然我很喜欢窗口。但是我可以在 FvwmConsole 里输入：  </p>
<p>All (rxvt) MoveToDesk <br>把我所有的 rxvt 移动到我现在工作的桌面。"这家伙，怎么这么快就叛变了！"  </p>
<p>其
实何必分什么 GUI 和 CLI，UNIX 和 Xwindow 都是工业标准，它们从设计那天开始就有非常灵活的用法，各个程序，不管是 GUI
还是命令行的都可以互相协作。UNIX 和X 是一家，何必搞的那么偏激，非此即彼？你从我上面的行为可以看出 GUI 和
CLI的模糊界线吗？我就是坚定不移的"两面派"。 </p>
<p>UNIX 是简单的-- <br>"我相信简单就是最好，如果太复杂，我是不能理解的。" -Seymour Cray  </p>
<p>很
多第一次用 Linux 的人会惊奇的发现，Linux
的程序居然不�"安装"就可以运行，程序拷贝到随便那个目录都可以用，而不是一定要占用你第一个分区的空间。程序的设置只是一些简简单单的文本文件。你根
本不需要什么"注册表修改器" 就可以改变系统的设置。这就叫做简单，但是简单就是美。虽然这只是 UNIX
简单性的一个肤浅的认识，你已经体会到了某些东西。 </p>
<p>但是简单并不意味着功能弱，并不意味着落后。相反，简单意味着强大，意味着生命力。  </p>
<p>我不会再继续阐述我理解到的"UNIX 的简单"，因为这个需要自己去体会。  </p>
<p>UNIX 是永恒的 <br>有人说："Plan9 会取代 UNIX，Mach 会取代 Linux 内核。"  </p>
<p>但是你如果是一个深入体会了 UNIX 的人，你就会知道：UNIX 的思想是永恒的，不管时过境迁，Plan9 是否代替 UNIX，UNIX 的灵魂都会在 Plan9 身上现形！  </p>
<p>我
为同一个设备写过 Linux 内核和 Windows VxD 驱动程序。写 Linux 驱动程序时，我对 UNIX
设计的完美的一致性，远见性所折服。UNIX 用同样界面的 read(),
write()系统调用就可以对不同的对象：普通文件，设备文件，管道，管道文件，socket，&#8230;&#8230;进行统一的读写操作。我跟本不需要写一个测试用的应
用程序就可以对我的设备驱动进行测试，因为 cat, cp, dd, 它们也使用了同样的 read(),
write()，设备和普通文件在应用程序眼里没有区别。在那个还没有 Smalltalk, 没有 C++ 的年代，UNIX
的设计者已经使用了所谓的 "面向对象方法"。对，C 语言也可以实现面向对象。 </p>
<p>UNIX
的系统调用几十年都没有很大变化，这非但不是顽固，不进步的象征，反而是UNIX 的远见卓识的体现！这就跟 TeX
程序几十年都不变的情况差不多。这些才是真正的永恒的 master piece! 你应该改变所有软件都必需从 0.1, 1.0, 1.1,
1.2, 2.0,..., 3.0, 3.1, 95, 98, 2000, XP, ... 不断升级的想法。 </p>
<p>Windows
就不同了，它在最开头只是一个 DOS 之上的图形包装而已。后来为了兼容以前的糟糕设计，不得不加上很多累赘。我写 VxD
驱动程序的时候就深有体会，Windows 95 程序对设备的操作只有用
DeviceIoControl，我不得不写了两个应用程序来对设备驱动进行测试。Windows 内核的不一致性和隐密性使我非常恼火。不过
Windows WDM驱动程序现在也有了 ReadFile, WriteFile，&#8230;&#8230; 那说明什么？那说明 Windows 在向UNIX
学习，或者有可能是某个 UNIX 设计人员在微软打了几天临工，顺手加了几个UNIX 的东西进去。这样做是没有用的，Windows
从一开始就是非常糟糕的设计，它的历史的包袱太沉重了，缝缝补补有什么用？它只能永远的被 UNIX 甩在身后！ </p>
<p>UNIX 是强大的 <br>让聪明人干任何他们想干的事情。  </p>
<p>UNIX 的一个特点就是非常高的灵活性，Xwindow 也具有这种灵活性。这种灵活性体现在哪里呢？  </p>
<p>UNIX
的程序一般都有很多参数，不管你现在用的着用不着，总有人需要某些参数。它们的行为很多都可以用配置文件来改变。比如 GNU bash,
通常缺省的命令行输入方式是 Emacs 方式，但是只要我编辑一个 .inputrc 文件，就可以把它变成 vi
的输入方式，而且我还可以自己绑定键序列到某些操作。我可以用 shopt
来设置它的很多特点，比如是否进行通配符扩展，是否可以把一个变量当作一个目录来cd，是否可以自动纠正某些明显的目录名打字错误 &#8230;&#8230; </p>
<p>UNIX 程序设计的思想是提供给用户"机制"，而不限制用户制定"政策"。这是一个重要的尊重用户的作法。  </p>
<p>我
们再来看看 Xwindow。Xwindow
是一个出色的设计，它把显示服务器和客户程序分开。一个显示上既可以显示本机上的程序，也可以显示别的机器上的 X
程序，而它们都遵守你的窗口管理器的统一指挥，它们之间可以方便的传送剪贴版数据，各种事件 &#8230;&#8230; 比如有时我的 XFree86
上会出现四个不同机器上的 XTerm，两个不同机器上的 GVIM，&#8230;&#8230; 它们统一受本机上的 FVWM 指挥。 </p>
<p>Xwindow
程序都具有很多很多命令行参数和 resource 参数。你可以随意的在命令行或者 .Xdefaults 文件设置所有的颜色，字体，尺寸&#8230;&#8230;
而且如果你用 xrdb 把 .Xdefaults
导入到根窗口，那么其它机器上没有经过配置的同样的程序，显示到你的机器上的时候也会遵守同样的外观规定。 </p>
<p>Xwindow
的窗口具有 Property, 也就是一些可以自己定义的共享数据(原子)。正是因为这些 Property 的存在，使得 Xwindow
具有无比强大的生命力。X 的窗口管理器和其它客户程序之间并没有统一的协议，但是后来出现了 ICCCM(客户程序间通信规范)，这个规范就是通过
property 定义的。现在又有人定义了一套"扩展的窗口协议(EWM Hints)"，使得Xwindow 可以具有某些 Windows
的特征，比如一个工具条程序可以告诉窗口管理器："这个屏幕下面被我占据了24个像素的空间，你最大化程序的时候不要越过这个界线。" </p>
<p>一个强大的窗口管理程序比如 FVWM，它收到这样的提示时，可以答应工具条程序的这个要求，也可以不答应。一切选择的权力在于谁？当然是用户了！  </p>
<p>你想想，是不是有些 Windows 程序常常弹出一个窗口要你选择 "Yes or No"？你不点击它它就不下去。你觉不觉得你的程序在侵犯你的尊严？你是一个人，一个智慧的生物，怎能受到一个程序如此的待遇？  </p>
<p>还有就是很多 Windows 程序把人当成傻瓜，而它是"智能程序"。比如，有一个程序就是喜欢把你的每句话第一个字母都变成大写，我不说它是谁了，你遇到的时候就知道了。  </p>
<p>如果连"一句话开头一个字母要大写"这么明显的问题都需要程序帮你纠正的话，人脑还用来干什么？况且如果你故意想要不大写的话，那就更麻烦了，我楞是没有从它那一大堆菜单里找到怎么关闭这个愚蠢的选项。  </p>
<p>只有符号才能完全操纵计算机。  </p>
<p>我
们来说说很多初学 Linux 的用户。虽然他们在用 Linux，但是他们打心眼儿里是觉得Windows 的工作方式好，他们希望 Linux
有一天能"像Windows那样"。你说："我的鼠标一点，我菜单一拉，&#8230;&#8230; 就可以完成我的操作。" 但是我要告诉你："Linux 从来没有摹仿
Windows，将来也不会。Linux 从诞生之日起，它的工作方式就比 Windows 的先进。 </p>
<p>Linux 属于能勇敢面对符号的人。只有符号才能完全操纵计算机。"  </p>
<p>看
看优秀的 UNIX 程序，XFree86, FVWM, VIM, Emacs, proftpd, Mutt, wget, tin, ...
没有一个不是用配置文件来设置选项的。为什么这些程序没有方便的菜单可以用来配置？难道它们的设计者就那么低能，连个图形配置界面也写不出来？ </p>
<p>当
然不是。因为图形界面配置方式的能力是极其有限的，而配置文件和程序语言的表达能力却是无限的。用图形界面配置这些程序的话，如果你想达到配置文件的效
果，你需要成百上千的菜单，checkbox, radio button, ...
到时候你根本没办法找到你需要修改的地方了！而各个程序的配置文件的语法都有很多相似之处，一般就是一些命令，设置一些变量，参数，&#8230;&#8230;
一旦用会了一个，其它的也就容易理解了。如果你用惯了 awk, sed, Perl，你会觉得那才是真正的自动化啊。 </p>
<p>鼠标虽然是很好的工具，但是它的表达能力是有限的。你不可能光用鼠标就让电脑完全明白你的意思，它毕竟只有3个按钮。看看我的MetaPost页你就能体会到鼠标的这一弱点。所以我们虽然很喜欢鼠标，但是却不能完全依赖它。  </p>
<p>各个小程序的完美配合  </p>
<p>这
就是UNIX最重要的特点了，它就是UNIX设计的思想。让每个程序只具有一项专门的能力，然后让它们合作。Xwindow也继承了这种好传统。这恐怕就
是Windows和其它操作系统望尘末及的地方了。UNIX 程序设计之统一，配合之完美，真使我难以置信！shell, grep, find,
awk, sed, make, Perl, Emacs, vi, tin, Mutt, ... 它们是那么的具有一致性！你一旦学会了 sed
的正则表达式，其它程序基本上都能用了。你一旦学会了vi 和 VIM,
你会发现它的操作是那么的有规律性，似乎vi的设计者在几十年前就已经设计好了 VIM 在今天的完美而统一的操作方式！而且vi的操作还体现在
Mutt, tin 等很多程序中。你甚至可以把 bash 设置为 vi
的输入方式来输入命令行，我就是这么做的。一个程序可以调用另外一个程序来得到数据，可以把数据交给它处理后返回来，可以在自己的窗口里"嵌入"另外一个
程序。 </p>
<p>在 Windows 和其它非 UNIX 操作系统中，这种合作是非常困难的。我曾经在Windows下使用
Perl来进行一些自动工作。但是 Windows 的文件操作，管道是如此的不稳定，程序之间基本不能合作。你别想在 Visual Studio
窗口里面嵌入 UltraEdit 编辑器，你别想用一个 expect 脚本来控制 telnet 到水木清华BBS。 </p>
<p>Windows
的程序都是大而全，大而杂，所有的电子邮件程序都需要自己提供编辑器，自己发送和收取邮件，自己显示邮件的附件。每一个BBS程序都提供自己的
Virtual Terminal, 自己的通讯代码。每一个 IDE
都自己提供编辑器，编译器，汇编器，调试器。人们为了使用一种新的程序，需要适应所有这些它提供的界面，而不能使用自己喜欢的编辑器的键绑定，菜单组
织&#8230;&#8230; 不能 DIY！ </p>
<p>你要知道，最高级的电脑是定做的，自己想要什么什么CPU，什么主板，多少内存，什么硬盘，键盘，鼠标，显示器
都是自己选择的。最高级的滑板，自己想要什么牌子的版面，什么牌子的沙，什么桥，什么轮子，什么轴承，也都是自己选的。最高级的古球拍，木板，胶皮，海
绵，胶水都是可以自己选择&#8230;&#8230; 而用 Windows
程序，你得到的是大杂烩，就像你去买"品牌机"，只有那么几种配置，而且附带很多你不需要的软件和服务；就像你去买组装好的滑板，你想要大一点的轮子和窄
一点的板子，但是你没有这种选择余地！Windows
程序就相当于最廉价，最次的滑板。但是它却会花你更多的钱，因为一旦一个部件坏了，或者你不喜欢了，你不能另外找一个好的换掉它，你必需重新买全套配件！
</p>
<p>而 UNIX 和 Xwindow 就是高档的"组装货"。比如我用 Mutt 的时候，我可以用 VIM也可以用 pico
来编辑邮件，我可以用 ImageMagick 也可以用 xv 来显示附件里的图片，我可以用 lynx 把 HTML
附件转成文本嵌入窗口中，我也可以把 HTML 附件交给Mozilla 图形显示。我可以让 GnuPG
帮我把邮件进行数字签名和加密，我也可以用其它 PGP 程序。 </p>
<p>我想让 Postfix 而不是 sendmail
帮我发出邮件，我想让 fetchmail 帮我收邮件，转发给 postfix，然后被我自己写的Perl过滤器处理&#8230;&#8230;
这一切我都可以办到！我可以选择我最喜欢的专门的程序来完成专门的工作，然后把它们结合在一起，我也可以分别得到它们的好处。 </p>
<p>学 UNIX 绝对不是浪费时间 <br>有人告诉我："你看我用 Windows 什么都不用学。而用 Linux，光是安装就花了我一个星期！"  </p>
<p>首
先，我要告诉你的是，你装 Linux 花了一个星期，不是因为 Linux 不好装，而是因为你已经习惯了 Windows，对 Linux
最初难以理解而已。你想一想你最初安装Windows的时候呢？你花了多少时间搞明白什么是硬盘分区？什么是盘符？什么是目录？你认为Windows
就是那么容易可以学会的吗？虽然你觉得没花时间学，但是你以前在用别人的机器的时候已经耳濡目染，自然就了解了。而且由于你想要 Linux 和
Windows 并存于硬盘上，又增加了安装难度。而且你肯定没有得到有经验的 Linux
用户的帮助，否则他们会在20分种之内帮你搞定。一个星期也太夸张了. </p>
<p>如果一开始用的就是Linux就没有这个问题。你想想如果你没有
用过 windows，你肯定会很习惯 /etc, /usr, /usr/local ,... 而不是 C:, D:, E:, ...
是不是？如果你只用过Linux，你第一次用 windows 时恐怕也会问："/bin 目录哪里去了啊？" </p>
<p>最重要的是，你用惯了的UNIX工具，它们可以伴随你一生，而不会那么容易变化或消失。你可以永远不用再换另外的工具了。除非那个工具比你这个好的太多，而且可以完全模拟你现在的工具。  </p>
<p>我
们实验室一个60多岁的老师，用vi, cc, make, ...都几十年了，他以前的经验绝对没有白费，而且教会了我们一批又一批的学生。vi
伴随着 UNIX 的最初发行而诞生，直到今天还是世界上头两号编辑器之一！有些人的 FVWM 配置文件已经用了 10
多年，现在完全不经修改还可以用。 </p>
<p>看看 Windows 的工具，你从 Borland C++ 换到 VC,
就必需适应新的环境：菜单不同了，颜色不同了，按钮不同了，帮助信息不同了，热键不同了，编译器参数，调试器功能也不同了，&#8230;&#8230;
那个时候恐怕花要花你很多时间去适应。当你刚刚适应了 VC, 你又要换成VJ, PowerBuilder, C++Builder, ... </p>
<p>很
多windows程序员都是这样，开头在dos下用Turbo C, 然后是 Borland C, VC, C++ Builder,
......不断追赶微软的潮流。而且微软的SDK, MFC, .NET &#8230;&#8230; 什么都在不断变化，不断出问题，又不断的在修改&#8230;&#8230; Windows
程序员不得不买又厚又重的 Microsoft Press 的书籍，看了才一个月，又过时了。今天你才学会了写 VxD，明天你就必须用WDM
了。你不得不注册 MSDN 才能赶上 Microsoft 的步伐。很多人说："计算机是贵族的专业。" 这就是微软一手造成的。 </p>
<p>这
些东西才是没完没了的浪费大家的时间和金钱的。这是是浪费生命！我们为什么不使用从诞生就那么一致和完美的
UNIX？你需要理解先进工具的设计理念。UNIX
的工具就像我们用的汽车，它的离合器，油门，刹车，方向盘，后视镜，永远都在同样的位置。用惯了的话，你对你的汽车的每一个部件都会了如指掌，甚至你自己
都可以修车了。这难道不好吗？ </p>
<p>有人说："你说我们需要了解 UNIX，难道你要开车还必须了解汽车的结构吗？" 你去问问开车的司机，哪一个不了解汽车的结构的，那他的驾照就是混来的。你难道想要傻瓜型的"微软牌汽车"吗？我们来看看：  </p>
<p>你
买的微软牌汽车最开头只有一个座位，每加一个座位你得向汽车公司付钱。车上的防撞气囊不时会冒出来，说是为了你的安全。每开100英里要大修一次，每过一
年要换一次引擎。附带的，你还必须换用由微软汽车公司指定的石油公司提供的新型号的机油。你的车出了问题，但是法律规定，你不准私自拆开你的汽车来修理，
你必需到微软汽车公司指定的维修点去，需要付相当多的钱才能修好一个小毛病。 </p>
<p>最可气的是，你每换一个型号的微软牌汽车，它的刹车和离合
器都在不同的位置，你需要重新去考驾驶执照。如果这辆汽车在途中刹车失灵，你受了重伤，你也不能状告微软汽车公司，因为你买来汽车之后必须签一个合同，说
"由于微软牌汽车对你和家人造成的一切死伤，微软概不负责。" </p>
<p>怎样完全用 GNU/Linux 工作  </p>
<p>说了这么多
Windows 的不好。我还没有告诉你我怎么用 Linux 处理有些必要的事情。半年以前我由于中文老是配置不好，一直是双系统，不时需要重起到
Win2k 来处理汉字。后来我找到了 miniChinput, XSIM 和 SCIM 输入法。这下可以处理汉字了。而且 VIM 和Emacs
对汉字支持越来越好。我的大部分文本是用 VIM 编辑的，包括程序，信件，网页，LaTeX 论文，MetaPost 绘图语言。 </p>
<p>我不用 Word 这样的程序写论文，而是用 LaTeX，因为这是世界上效果最好，最方便的论文工具，是大多数学术杂志要求的格式。幻灯都是用 ConTeXt 做的，用起来很简单，而且效果非常漂亮。你可以看看我的TeX介绍。  </p>
<p>至
于绘图，你可以用很多可视化的工具，比如
xfig，dia。但是对于我来说，任何可视化的工具都不能完成某些任务，我需要一种可以精确描述图形的语言。我找到了MetaPost。它简单又好用，
而且效果是世界一流的。我的插图，如果不是图像，都是MetaPost 画出来的。 </p>
<p>我曾经抱怨 mozilla-mail
经常突然消失，损坏我好几封快要完成的信件。后来我发现mozilla 的邮件处理程序确实是不稳定的，功能又弱，有经验的 UNIX
用户都不用这样的程序。Mutt 是一个非常稳定可靠的 UNIX 邮件处理程序，而且功能非常强大。我曾经为 Gnome 和 KDE
的不稳定而烦恼。现在我找到了非常强大的 FVWM。KDE，Gnome也能和 FVWM 一起工作。虽然 Gnome 和 KDE
总体不稳定，但是某些部件程序还不错，很多 gtk, Qt 的程序也很不错，它们很多都是可以独立于这些桌面环境运行的。 </p>
<p>Linux 有很多强大方便的工作方式是 Windows 没有的，或者有类似的东西，但是很差劲或者用起来不方便。比如 ssh 服务，rsync，cvs，expect &#8230;&#8230;  </p>
<p>结论  </p>
<p>我
写这么多的目的是什么？我希望喜欢 Linux 的朋友，完全清除微软和 Windows
灌输在你脑子里的谬论，别再相信它们所谓的"新技术"，别再追赶 Windows，因为追赶Windows ＝
倒退。马克思有一个思想很重要，"新生事物并不一定是在最近出现的。" </p>
<p>UNIX，Xwindow, TeX 虽然都比 Windows 先出现，但是它们才是先进生产力的代表。我们要清楚的认识到什么才是真正的现代化，什么才是真正的自动化。  </p>
<p>消
除学计算机很难的幻觉，勇敢的拿起像 bash, FVWM, TeX, VIM, Emacs, Mutt
&#8230;&#8230;这样强大的程序，勇敢的面对符号。不要再埋怨"Linux 为什么不能像 Windows
那样"，不要再浪费时间试用这样那样的程序，不要再忙着升级。你需要理解 UNIX 的工作方式，因为那是大多数科学家的工作方式。Linux
可以成为你的好朋友，你需要认识它，了解它，信任它，才能完全的靠它来高效的工作。当然，在游戏机，手机，掌上电脑里，或者在用电脑来娱乐的时候，用一些
"傻瓜软件"还是不错的. </p>
<p>我希望小学，中学的计算机老师能够提高自己的素质，在孩子们的启蒙教育中充分利用Linux 神秘的特点，引起孩子们对数学，对符号的好奇心。诱导他们用计算机来解决世界上的有趣问题，而不要把教学的范围局限于计算机的操作和它自身的问题。  </p>
<p>附录: 我用来处理日常事务的 Linux 程序 <br>好
了好了。我知道你发现自己应该转向
Linux，你很后悔当初为什么中了微软的邪。但是不要着急。因为这些东西本来只是工具，它们是用来完成你的主要任务的辅助而已。你以前选错了工具，这不
要紧。你还是拥有你自己原来的专业技能，那才是最重要的。工具的东西只有慢慢适应转换，不能一蹴而就，否则你会感到非常没意思，甚至放弃。 </p>
<p>如
果你只想做一个像我这样的普通用户，主要目的是用 Linux
来完成自己的任务，那就可以不用系统管理员或者网络管理员的标准来要求自己，因为当一个系统和网络管理员确实很辛苦。这里我对实验室的网管同学鞠一躬，谢
谢你的指点和帮助. 不用把你的机器当成网络服务器，不用开放没有必要的服务，设置好 ssh, ftp
已经足够了。这样会省去了解很多没必要了解的东西的时间。不用过度考虑"安全"，因为 Linux 缺省已经很安全了。不过你有兴趣了解更多那也无妨。
</p>
<p>下面给出一些推荐使用的可以处理一般事情的程序。至于你的专业上要用到的科学和工程软件比如 Matlab, Mathematica,
Maple, HSpice, Design Compiler, &#8230;&#8230; 还有其它物理上的，化学上的，生物上的 &#8230;&#8230; 都必然有 Linux 和
UNIX
的版本。当然他们很多不是免费的，不要总是觉得什么都应该免费，自由不等于免费。它们是经过很多人辛勤劳动的产物，是可靠的程序，它们物有所值。 </p>
<p>下面列出我常用的一些 Linux 程序。一个列表里可能有很多，那是为了方便你来选择，我列出了比较信得过的。但其实很多只有第一个是我真正在用的，我不喜欢试用程序。我不是一个合格的网络管理员，我的服务器都只设置了我自己需要的功能，那样可以省去我很多麻烦。 </p>
<p>Shell: bash。它结合了 csh 和 ksh 的优点，并且有 readline 功能，你可以随意绑定自己的键盘。 <br>编辑器： VIM, Emacs。 <br>程序开发： GCC, make, ld, Scheme48, j2sdk, Perl, Python, Tcl/Tk ... <br>论文，幻灯工具：LaTeX, ConTeXt <br>绘图工具：MetaPost。这个语言太强了，以至于我只用它了。你不熟悉的话可以用xfig, dia 来画一些流程图之类的图片。 <br>图
像处理：ImageMagick。其中的 import 程序可以屏幕抓图，convert 程序可以转换图像格式，display
可以显示图片和简单编辑(缩放，换质量，转格式，简单绘图，简单虑镜)。通常我就这么点需要。如果你要更强大的图像工具可以用 Gimp,
它几乎和Photoshop差不多。 <br>自动管理工具：make。我可以用make来自动编译程序，自动编译文档，自动更新插图&#8230;&#8230; 全自动，而且不会重复劳动。 <br>数值计算程序：SciLab。这个程序基本上可以代替 Matlab。 <br>代
数计算程序：MAXIMA。这个程序基于世界上最老的计算机代数系统之一: 由美国能源部(DOE)发行的 MIT Macsyma 系统。它是用
Common Lisp 实现的。很多现在的符号计算程序比如 Maple 都从 MAXIMA 身上学到很多东西。它现在经过 DOE
批准以GPL发行，永远是一个自由软件。 <br>加密程序：GnuPG。我的 PGP 密钥就是它搞出来的。 <br>打包，压缩程序。什么都有: tar, gzip, bzip2, zip, rar, ... <br>虚拟光驱程序。Linux 不需要虚拟光驱程序，直接 mount 就行了。 <br>ftp 服务器：proftpd, vsftpd。proftpd 功能很强，但是我只用了最简单的一种设置。 <br>WWW 服务器：apache。(我一般没有开) <br>ftp
客户程序：lftp，ncftp。它们都是文本方式操作的，但是比起图形界面的方便的多。比如 lftp 几乎具有 bash 的所有方便功能，Tab
补全，bookmark, queue, 后台下载，镜像&#8230;&#8230; Linux 也有图形界面的 ftp
客户程序，但是大多不稳定，有很多问题。这就是很多人抱怨 Linux 不如 Windows 的一个小原因。还有很多人用 Wine 模拟
Windows 的leapftp，其实 lftp 比 leapftp 好很多，你需要的只是适应一下。 <br>自动下载工具：wget。它非常稳
定，有一次我下载一个程序，用 IE 和 Mozilla 下载回来的文件都是坏的，最后还是 wget
可靠的传输了数据。用它甚至可以镜像整个网站，比起WebZip 这样的 Windows
程序强多了，而且不会因为你不付钱就在下载回来的网页里强制插入广告。 <br>虚拟终端：rxvt, xterm, gnome-terminal, mlterm, ... <br>X server: XFree86 <br>窗口管理器：FVWM。编译加入了 libstroke。 <br>中文输入：XSIM。被我修改过以适应 FVWM 的需要。另外推荐你还可以用 SCIM。 <br>email 处理：Mutt + Postfix + fetchmail <br>看 PDF, PS, DJVU 文件：Acrobat Reader, xpdf, GhostScript, gv, djvu工具包和netscape 插件。 <br>看CAJ文档。我从来不看CAJ之类的文档，如果找不到PDF或PS，直接去图书馆借最好。<br>看网页：Mozilla, Phoenix, lynx。Mozilla-Xft 的显示效果比IE 好很多。 <br>英汉字典：IBM智能词典，星际译王。 <br>编辑网页：我用VIM 直接写 HTML。你如果想要图形方式的可以用其它的比如screem, BlueFish。 <br>登录其它 UNIX, Linux 机器：openSSH, telnet。 我喜欢用 openSSH 把其它机器的X 程序通过 ssh 加密的隧道传到我机器上显示。 <br>登录 Windows2000 server 的 display service: rdesktop，...我有一天试了一下，不错。后来就没有用过了。 <br>同步程序：rsync。我用 rsync 通过 ssh 来跟某些机器同步数据，或者做自己机器上不同目录间的同步。 <br>上BBS：rxvt(或任何一种终端) + telnet + chatbot(helloooo 机器人的程序) <br>QQ, ICQ: 我没有 QQ 或 ICQ。不过你可以用 Gaim, 它同时支持 QQ, ICQ 和很多其它的即时通信方式。ICQ 用户也可以用 Licq。 <br>放
录像：MPlayer, RealPlayer。MPlayer 太好了，直接就可以放 VCD, DVD, divx, wma, wmv ...
用 Windows 的同学都很羡慕我，说 Windows 要放这个需要大堆插件。rm 最好还是用 realplayer 放，它也是免费的。 <br>放音乐： xmms(mp3,ogg都可以), mpg321(放mp3), ogg123(放ogg)。mpg321 不如xmms管理音乐文件那么方便，但是有时我还是用 mpg321 放 mp3 作为背景音乐，因为懒得开一个xmms窗口:-)<br>游戏：我觉得 KDE 的那个 ksokoban(推箱子)，很好玩 :-) <br>看
Word 文档。请 Word 用户把文档全部转为 PDF 或 PS
再给我，文档里没有特殊的格式干脆就用文本吧，何必那么麻烦。以前很奇怪的是，通知里本来没有什么特殊的格式居然还要发doc附件的email。现在好
了，我们系发通知都用文本，PDF，甚至图片了。<br>其它程序：还有很多我需要用而你不一定用得着的。比如，Doctor Scheme, <br>Scheme48,
Scsh, kawa...这些程序只有 Doctor Scheme 有Windows版本。还有很多幕后工作但是你一般不察觉的：xinetd,
telnetd, sshd, crond, atd, lpd, ... 他们都比 Windows 的对应者强的多，或者根本没有对应者。 </p>
<p>附: </p>
<p><strong>写给支持和反对《完全用Linux工作》的人们</strong><br>作者：王垠 </p>
<p>在
一阵阵唾骂和欢呼声中，《完全用linux工作》被转载到了天涯海角。很多人支持我，也有很多人唾骂我。我不知道它是怎样流传到那么多地方，其实我不知道
它都被转到哪里去了&#8230;&#8230;
我知道现在这篇文章又会罗里罗索写很长（因为我计划写这样一个东西已经很久了，坐在Emacs前面总是有一种巫师在炼丹的感觉&#8230;&#8230;），所以先提出中心思想
吧。中心思想就是： </p>
<p>我只是一个傻瓜。看《完全用Linux 工作》的时候请用你们自己的判断力。  </p>
<p>几乎所有人都承认，
那篇文章很偏激。当时的情况是这样，我用 Linux 的时候被一个同学鄙视了，说："你怎么用像 DOS 一样落后的东西，真土！看我漂亮的
Win2000..."
这跟当面嘲笑别人老婆或者妈妈有什么区别？我义愤填膺啊，就几乎跟他吵起来。然后就写出了这篇文章放在主页上，叫了几个人来看。接着我珍爱的 TeX
又受到众人鄙视，于是我又写了一篇文章打击 Word，然后把 TeX 捧上了天。道理很简单，鄙视我喜欢的东西的人就是敌人
--邪教徒或者恐怖分子--他支持的我就反对，他反对的我就支持。为了使人信服，举例必用大科学家，世界一流大学，一流实验室的名号，虽然我不跟其中任何
一种沾边。还好那时候我还不认识上帝，要不就打他的名字了。论据不管是实际经历还是自己推测的，先写上去再说。扬眉吐气啊！隔壁微软研究院的哥们居然都被
我打动了，开始写 Linux 程序，学用 LaTeX 和 Emacs。不过几天之后我就把它删掉了，因为我自己都感觉到偏激。 </p>
<p>于是
就没管那篇文章了。可是没想到它竟然已经被转载到那么多地方，似乎引起不小的波澜。有段时间每天都收到十几封email，国内的，国外的，问技术问题的，
夸我的，骂我的，讲道理的，鄙视我的，想交朋友的，语重心长的，号称要删掉机器上的 Windows 的&#8230;&#8230; 我的主页居然也占据了"王垠"在
Google
上的首选位置，把那个日本的什么王公贵族"李王垠殿下"都挤下去了。大家似乎都知道我天花乱坠的本事了，有人就想找我写文章向别人推荐商业软件，我很后悔
没有趁机狠狠赚一笔。走到图书馆，亮出借书证，管理员张大了嘴说："哇！你就是那个 Linux 牛人啊！"，也不知道他是褒是贬。甚至有人把他的
BBS 昵称都改成了"坚决拥护精神领袖花生"
（花生是我的外号）。为此还骗到了好几顿报告�"报告"是清华专用动词，意思是请客吃饭）。虽然我觉得自己身上没有什么值得自豪的东西，但是又有点为自己
兴风作浪的本事感到惊讶。虽然我一再告诫自己要谦虚，但是不由的有一种毛泽东，甘地，甚至摩西的感觉。我更加体会到"网络上没有人知道你是一头猪"的真理
性。其实，不但网络上没有人知道我是一头猪，实际生活中也没有人知道，其实我是一头笨猪。 </p>
<p>这么长的时间之后，还有人写信给我说"深受鼓
舞"，"提壶灌顶"，"对不起我还在用 Windows 给你写信"，"真想删掉Windows 啊" &#8230;&#8230;
我很好奇，我的文章真的有那么大的威力？我再看这篇文章，觉得有点惨不忍睹，看了开头就不忍心再看下去。我告诉同学我很后悔写了一篇这么偏激的文章，可是
他�"徼枉必须过正，你没有错"，所以我也搞不清楚自己这样写对不对，这样自责对不对。就像我从来不敢看自己照片，却有时被人称为帅哥，就让我无法判断自
己是否帅一样。所以现在我就开始怀疑我自己是否真是一头笨猪。也许多年以后，我会正确的评价我的想法。就像我现在觉得我15岁的照片挺养眼一样，也许我会
发现自己其实是一头聪明猪？ </p>
<p>写这篇文章不是为了让自己免得被骂，也不是为了显示高深的猪的哲理。只是因为我深深的感到人应该有自己的判断力，不要简单的接受别人说的 DO's 和 DONT's。怀疑一切，同时又敞开心扉去了解一切。  </p>
<p>看过《完全用Linux工作》的朋友，请仔细检查里面的 DO's 和 DONT's。  </p>
<p>2004.8.26</p><img src ="http://www.cppblog.com/KevinYang/aggbug/28323.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-07-19 01:36 <a href="http://www.cppblog.com/KevinYang/articles/28323.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>【原创】用U盘制作启动盘引导恢复grub</title><link>http://www.cppblog.com/KevinYang/articles/28321.html</link><dc:creator>Kevin Yang</dc:creator><author>Kevin Yang</author><pubDate>Wed, 18 Jul 2007 17:03:00 GMT</pubDate><guid>http://www.cppblog.com/KevinYang/articles/28321.html</guid><wfw:comment>http://www.cppblog.com/KevinYang/comments/28321.html</wfw:comment><comments>http://www.cppblog.com/KevinYang/articles/28321.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/KevinYang/comments/commentRss/28321.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/KevinYang/services/trackbacks/28321.html</trackback:ping><description><![CDATA[不知道你是否有这样的经历，在重装完windows之后呢，发现grub消失了。<br>这时候很多人都会上baidu搜索什么&#8220;grub恢复&#8221;阿之类的关键词，然后<br>一看，这么麻烦，还不如重装系统来得简单呢。其实恢复grub并没有那么<br>复杂恐怖，如果你是个打算成为linux中手的话(说高手的话，估计你得吓<br>跑了),学会处理这些问题是很必要的。下面我结合自己的实践经验来讲一<br>下如果恢复grub，顺便说一下如果利用U盘作为启动盘来引导linux安装程序。<br>步骤有2:<br>1.制作启动光盘/U盘(如果你拥有一张安装光盘可以绕过此步骤)<br>2.进入安装程序恢复grub<br>下面先讲步骤1,制作启动光盘就不说了,用一张安装镜像然后刻录之即可.<br>重点讲如何制作启动U盘.<br>首先先下载一个工具叫USBoot1.7,注意1.7的版本与之前的版本多了一个功能<br>就是增加了对大容量U盘的支持.下面是他的软件界面图.<br><br><img src="file:///F:/Temp/moz-screenshot-3.jpg" alt=""><img alt="" src="http://www.bznis.com/UpLoadFiles/NewsPhoto/7jc2zBSY.jpg"><br><br>此次操作会格式化U盘,所以请先备份好你U盘里面的重要文件.选择好U盘盘符之后点击下面选择<br>工作方式为USB-ZIP模式,这种方式在作启动盘是比较成功(至于原因大家<br>有兴趣自己探索)接下来按照提示走.完毕之后呢,我们就拥有一个可以引导的<br>U盘了.接下来呢,我们要让这个U盘能够能够启动我们的grub程序.下载一个<br>grub for dos的程序,放到u盘中,然后编辑u盘中的autoexec.bat文件,在里面<br>写上<br>grub --config-file=(sdc0)/menu.lst<br>这样就可以利用grub来引导了,但在此之前我们要添加一个menu.lst的文件,<br>这个文件作为grub的引导菜单,具体制作方法可以baidu一下,不过我们暂时<br>不需要里面有什么内容,我们只需要运行一个grub命令行就可以了.<br>然后我们就可以来引导我们的安装程序了.<br><br>步骤2:引导安装程序修复系统<br>为了引导linux系统,我们需要两个文件,一个是vmlinuz,另外一个是initrd.img<br>这两个文件可以在我们的linux系统镜像中查找,是用来初始化内核和一些环境的<br>将这两个文件拷贝到U盘上,然后到grub命令行下,输入<br>kernel (hd0,0)/vmlinuz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (注意这里的(hd0,0)应该是用U盘启动之后<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 他自动将U盘作为第一快硬盘的第一快分区<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 了,如果提示找不到该文件的话时下其他的)<br>initrd (hd0,0)/initrd.img&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (初始化镜像)<br>boot 镜像文件名.iso&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (引导镜像文件,即我们下载的安装镜像)<br>然后我们就可以看到熟悉的安装界面出现了,此时我们再按下Alt+F2进入命令<br>行界面,首先挂载我们原先的linux系统到安装临时系统上,<br>mkdir /mnt/linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (建立挂载文件夹)<br>mount /dev/hda4 /mnt/linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (挂载,这里的sdc是我的设备号,具体大家<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 可以用fdisk -l命令查看一下自己原先的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; linux是哪个设备,不行的话可以试着挂载<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 一下)<br>root /mnt/linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (将当前命令行切换到原来linux系统的<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这样之后的操作都是针对原先系统的了)<br>grub&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (进入grub)<br>root (hd0,5)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (设置grub引导根分区所在地)<br>setup (hd0,0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; (将grub安装在第一块硬盘的mbr上面,这样<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; windows分区也可以用grub来引导了)<br>退出,重启,引导第一快硬盘即可看到熟悉的grub又出来了.<br>grub是一个比较优秀的引导程序,我们也可以利用这种思想来制作一个grub<br>界面的超级启动U盘,这样以后不管windows还是linux系统怀了都可以用他来<br>修复了.  <img src ="http://www.cppblog.com/KevinYang/aggbug/28321.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/KevinYang/" target="_blank">Kevin Yang</a> 2007-07-19 01:03 <a href="http://www.cppblog.com/KevinYang/articles/28321.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>