﻿<?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>BlogJava-David.Ko-随笔分类-Ubuntu</title><link>http://www.blogjava.net/ThinkingTalking/category/22680.html</link><description>Follow my heart!</description><language>zh-cn</language><lastBuildDate>Sun, 22 Aug 2010 12:18:07 GMT</lastBuildDate><pubDate>Sun, 22 Aug 2010 12:18:07 GMT</pubDate><ttl>60</ttl><item><title>ubuntu9.10升级Qt版本到4.6的方法</title><link>http://www.blogjava.net/ThinkingTalking/archive/2010/07/12/325900.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Mon, 12 Jul 2010 11:16:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2010/07/12/325900.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/325900.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2010/07/12/325900.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/325900.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/325900.html</trackback:ping><description><![CDATA[https://launchpad.net/~mapopa/+archive/qt4.6<br />
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/325900.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2010-07-12 19:16 <a href="http://www.blogjava.net/ThinkingTalking/archive/2010/07/12/325900.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu下SVN服务器的安装及使用xinetd进行管理</title><link>http://www.blogjava.net/ThinkingTalking/archive/2010/04/21/319022.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Wed, 21 Apr 2010 12:55:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2010/04/21/319022.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/319022.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2010/04/21/319022.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/319022.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/319022.html</trackback:ping><description><![CDATA[1.安装<br />
# apt-get install subversion<br />
# apt-get install xinetd<br />
2.配置<br />
#svnadmin create /home/project1Repo<br />
#gedit /home/project1Repo/conf/svnserve.conf<br />
使下面的三项配置生效：<br />
anon-access = read<br />
auth-access = write<br />
password-db = passwd<br />
添加用户及密码：<br />
#gedit /home/project1Repo/conf/passwd<br />
添加项目:<br />
#svn import -m "clean kernel" /home/hufsh/programs/android-kernel file:///home/project1Repo<br />
3.xinetd<br />
#gedit /ect/xinetd.conf<br />
service <span class="hilite2">svn</span><br />
{<br />
&nbsp;&nbsp;&nbsp;  disable = no<br />
&nbsp;&nbsp;&nbsp;  port = 3690<br />
&nbsp;&nbsp;&nbsp;  socket_type = stream<br />
&nbsp;&nbsp;&nbsp;  protocol = tcp<br />
&nbsp;&nbsp;&nbsp;  wait = no<br />
&nbsp;&nbsp;&nbsp;  user = <span class="hilite2">hufsh</span><br />
&nbsp;&nbsp;&nbsp;  server = /usr/local/bin/svnserve<br />
&nbsp;&nbsp;&nbsp;  server_args = -i -r /home/<span class="hilite2">svn</span>
<p>}</p>
#/etc/init.d/xinetd restart<br />
启动:<br />
#svnserve -d -r /home/ --listen-host 192.168.1.100<br />
停止:<br />
#killall svnserve<br />
<br />
<br />
<p style="margin: 1em 0px 0.5em; padding: 0px;">假设你必须添加了一个特性至一个项目，且这个项目是受版本控制的，你差不多需要完成如下几个步骤：</p>
<ol style="margin: 5px 0px 5px 35px; padding: 0px;">
    <li style="margin: 0px; padding: 2px 0px;">
    <div>使用SVN checkout或者SVN switch从这个项目的trunk获得一个新的工作拷贝（branch）</div>
    </li>
    <li style="margin: 0px; padding: 2px 0px;">
    <div>使用SVN切换至新的branch</div>
    </li>
    <li style="margin: 0px; padding: 2px 0px;">
    <div>完成新特性的开发（当然，要做足够的测试，包括在开始编码前）</div>
    </li>
    <li style="margin: 0px; padding: 2px 0px;">
    <div>一旦这个特性完成并且稳定（已提交），并经过你的同事们确认，切换至trunk</div>
    </li>
    <li style="margin: 0px; padding: 2px 0px;">
    <div>合并你的分支至你的工作拷贝（trunk），并且解决一系列的冲突</div>
    </li>
    <li style="margin: 0px; padding: 2px 0px;">
    <div>重新检查合并后的代码</div>
    </li>
    <li style="margin: 0px; padding: 2px 0px;">
    <div>如果可能的话，麻烦你的同事对你所编写、更改的代码进行一次复查（review）</div>
    </li>
    <li style="margin: 0px; padding: 2px 0px;">
    <div>提交合并后的工作拷贝至trunk</div>
    </li>
    <li style="margin: 0px; padding: 2px 0px;">
    <div>如果某些部署需要特殊的环境（生成环境等等），请更新相关的tag至你刚刚提交到trunk的修订版本</div>
    </li>
    <li style="margin: 0px; padding: 2px 0px;">
    <div>使用SVN update部署至相关环境</div>
    </li>
</ol>
<br />
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/319022.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2010-04-21 20:55 <a href="http://www.blogjava.net/ThinkingTalking/archive/2010/04/21/319022.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>linux下淘宝安全控件问题</title><link>http://www.blogjava.net/ThinkingTalking/archive/2009/09/21/295912.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Mon, 21 Sep 2009 13:17:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2009/09/21/295912.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/295912.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2009/09/21/295912.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/295912.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/295912.html</trackback:ping><description><![CDATA[我的环境：ubuntu9.04 firefox3.0.14<br />
<br />
下载压缩包http://blog.alipay.com/wp-content/2008/10/aliedit.tar.gz<br />
解压：tar -zxvf aliedit.tar.gz<br />
验证MD5:md5sum aliedit.tar.gz<br />
复制到指定目录:cp aliedit.so aliedit.xpt ~/.mozilla/plugins<br />
重启firefox.<br />
OK!<br />
<br />
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/295912.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2009-09-21 21:17 <a href="http://www.blogjava.net/ThinkingTalking/archive/2009/09/21/295912.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu多媒体问题解决</title><link>http://www.blogjava.net/ThinkingTalking/archive/2009/09/20/295749.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Sun, 20 Sep 2009 06:55:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2009/09/20/295749.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/295749.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2009/09/20/295749.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/295749.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/295749.html</trackback:ping><description><![CDATA[1、mp3乱码:<br />
Rhythmbox播放mp3时有时会有乱码出现，此时可以cd到mp3所在的文件夹，使用下面的命令解决:<br />
mid3iconv -e GBK *.mp3<br />
2、mplayer Error:<br />
报错信息: could not open required directshow codec drvc.dll<br />
解决步骤:<br />
到http://www.mplayerhq.hu/MPlayer/releases/codecs/下载all-20071007.tar.bz2包，解压到usr/lib/codecs目录下<br />
# find /usr/lib -name drvc*<br />
/usr/lib/codecs/drvc.so<br />
# ldd /usr/lib/codecs/drvc.so<br />
libstdc++.so.5 =&gt; not found<br />
这样可以看出, libstdc++.so.5需要安装<br />
# apt-get install libstdc++5<br />
<br />
PS:通过修改配置文件可以优化mplayer,命令如下:<br />
<pre>sudo cp /etc/mplayer/mplayer.conf /etc/mplayer/mplayer.conf_backup<br />
sudo gedit /etc/mplayer/mplayer.conf<br />
如果觉得界面不好看，可以使用SMplayer，它是mplayer的前台图形界面，基于Qt4：<br />
sudo apt-get install smplayer<br />
<br />
</pre>
<br />
<br />
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/295749.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2009-09-20 14:55 <a href="http://www.blogjava.net/ThinkingTalking/archive/2009/09/20/295749.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>bash的内部命令</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156794.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Mon, 29 Oct 2007 14:17:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156794.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/156794.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156794.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/156794.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/156794.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;<a href='http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156794.html'>阅读全文</a><img src ="http://www.blogjava.net/ThinkingTalking/aggbug/156794.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2007-10-29 22:17 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156794.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>运行Shell程序的方法</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156793.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Mon, 29 Oct 2007 14:16:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156793.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/156793.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156793.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/156793.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/156793.html</trackback:ping><description><![CDATA[运行Shell程序的方法
<p>　　用户可以用任何编辑程序来编写Shell程序。因为Shell程序是解释执行的，所以不需要编译成目的程序。按照Shell编程的惯例，以bash为例，程序的第一行一般为&#8220;#！/bin/bash&#8221;，其中 # 表示该行是注释，叹号 ！ 告诉Shell运行叹号之后的命令并用文档的其余部分作为输入，也就是运行/bin/bash并让/bin/bash去执行Shell程序的内容。</p>
<p>　　执行Shell程序的方法有3种。</p>
<p>　　1．sh Shell程序文件名</p>
<p>　　这种方法的命令格式为：</p>
<p>　　bash Shell程序文件名</p>
<p>　　这实际上是调用一个新的bash命令解释程序，而把Shell程序文件名作为参数传递给它。新启动的Shell将去读指定的文件，可执行文件中列出的命令，当所有的命令都执行完后结束。该方法的优点是可以利用Shell调试功能。</p>
<p>　　2．sh</p>
<p>　　格式为：</p>
<p>　　bash&lt; Shell程序名</p>
<p>　　这种方式就是利用输入重定向，使Shell命令解释程序的输入取自指定的程序文件。</p>
<p>　　3．用chmod命令使Shell程序成为可执行的</p>
<p>　　一个文件能否运行取决于该文档的内容本身可执行且该文件具有执行权。对于Shell程序，当用编辑器生成一个文件时，系统赋予的许可权都是644(rw-r-r--)，因此，当用户需要运行这个文件时，只需要直接键入文件名即可。</p>
<p>　　在这3种运行Shell程序的方法中，最好按下面的方式选择：当刚创建一个Shell程序，对它的正确性还没有把握时，应当使用第一种方式进行调试。当一个Shell程序已经调试好时，应使用第三种方式把它固定下来，以后只要键入相应的文件名即可，并可被另一个程序所调用。</p>
<p>　　4．bash程序的调试</p>
<p>　　在编程过程中难免会出错，有的时候，调试程序比编写程序花费的时间还要多，Shell程序同样如此。</p>
<p>　　Shell程序的调试主要是利用bash命令解释程序的选择项。调用bash的形式是：</p>
<p>　　bash -选择项Shell程序文件名</p>
<p>　　几个常用的选择项是：</p>
<p>　　-e 如果一个命令失败就立即退出。</p>
<p>　　-n 读入命令但是不执行它们。</p>
<p>　　-u 置换时把未设置的变量看做出错。</p>
<p>　　-v 当读入Shell输入行时把它们显示出来。</p>
<p>　　-x 执行命令时把命令和它们的参数显示出来。</p>
<p>　　上面的所有选项也可以在Shell程序内部用&#8220;set -选择项&#8221;的形式引用，而&#8220;set +选择项&#8221;则将禁止该选择项起作用。如果只想对程序的某一部分使用某些选择项时，则可以将该部分用上面两个语句包围起来。</p>
<p>　　（1）未置变量退出和立即退出</p>
<p>　　未置变量退出特性允许用户对所有变量进行检查，如果引用了一个未赋值的变量就终止Shell程序的执行。Shell通常允许未置变量的使用，在这种情况下，变量的值为空。如果设置了未置变量退出选择项，则一旦使用了未置变量就显示错误信息，并终止程序的运行。未置变量退出选择项为-u。</p>
<p>　　当Shell运行时，若遇到不存在或不可执行的命令、重定向失败或命令非正常结束等情况时，如果未经重新定向，该出错信息会显示在终端屏幕上，而Shell程序仍将继续执行。要想在错误发生时迫使Shell程序立即结束，可以使用-e选项将Shell程序的执行立即终止。</p>
<p>　　（2）Shell程序的跟踪</p>
<p>　　调试Shell程序的主要方法是利用Shell命令解释程序的-v或-x选项来跟踪程序的执行。-v选择项使Shell在执行程序的过程中，把它读入的每一个命令行都显示出来，而-x选择项使Shell在执行程序的过程中把它执行的每一个命令在行首用一个+加上命令名显示出来。并把每一个变量和该变量所取的值也显示出来。因此，它们的主要区别在于：在执行命令行之前无-v，则显示出命令行的原始内容，而有-v时则显示出经过替换后的命令行的内容。</p>
<p>　　除了使用Shell的-v和-x选择项以外，还可以在Shell程序内部采取一些辅助调试的措施。例如，可以在Shell程序的一些关键地方使用echo命令把必要的信息显示出来，它的作用相当于C语言中的printf语句，这样就可以知道程序运行到什么地方及程序目前的状态。</p>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/156793.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2007-10-29 22:16 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156793.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell程序设计的流程控制</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156791.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Mon, 29 Oct 2007 14:13:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156791.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/156791.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156791.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/156791.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/156791.html</trackback:ping><description><![CDATA[和其他高级程序设计语言一样，Shell提供了用来控制程序执行流程的命令，包括条件分支和循环结构，用户可以用这些命令创建非常复杂的程序。
<p>　　与传统语言不同的是，Shell用于指定条件值的不是布尔运算式，而是命令和字串。</p>
<p>　　1．测试命令</p>
<p>　　test命令用于检查某个条件是否成立，它可以进行数值、字符和文件3个方面的测试，其测试符和相应的功能分别如下。</p>
<p>　　（1）数值测试：</p>
<p>　　-eq 等于则为真。</p>
<p>　　-ne 不等于则为真。</p>
<p>　　-gt 大于则为真。</p>
<p>　　-ge 大于等于则为真。</p>
<p>　　-lt 小于则为真。</p>
<p>　　-le 小于等于则为真。</p>
<p>　　（2）字串测试：</p>
<p>　　= 等于则为真。</p>
<p>　　!= 不相等则为真。</p>
<p>　　-z字串 字串长度伪则为真。</p>
<p>　　-n字串 字串长度不伪则为真。</p>
<p>　　（3）文件测试：</p>
<p>　　-e文件名 如果文件存在则为真。</p>
<p>　　-r文件名 如果文件存在且可读则为真。</p>
<p>　　-w文件名 如果文件存在且可写则为真。</p>
<p>　　-x文件名 如果文件存在且可执行则为真。</p>
<p>　　-s文件名 如果文件存在且至少有一个字符则为真。</p>
<p>　　-d文件名 如果文件存在且为目录则为真。</p>
<p>　　-f文件名 如果文件存在且为普通文件则为真。</p>
<p>　　-c文件名 如果文件存在且为字符型特殊文件则为真。</p>
<p>　　-b文件名 如果文件存在且为块特殊文件则为真。</p>
<p>　　另外，Linux还提供了与（！）、或（-o）、非（-a）三个逻辑操作符，用于将测试条件连接起来，其优先顺序为：！最高，-a次之，-o最低。</p>
<p>　　同时，bash也能完成简单的算术运算，格式如下：</p>
<p>　　$[expression]</p>
<p>　　例如：</p>
<p>　　var1=2</p>
<p>　　var2=$[var1*10+1]</p>
<p>　　则var2的值为21。</p>
<p>　　2．if条件语句</p>
<p>　　Shell程序中的条件分支是通过if条件语句来实现的，其一般格式为：</p>
<p>　　if 条件命令串</p>
<p>　　then</p>
<p>　　条件为真时的命令串</p>
<p>　　else</p>
<p>　　条件为假时的命令串</p>
<p>　　fi</p>
<p>　　3．for循环</p>
<p>　　for循环对一个变量的可能的值都执行一个命令序列。赋给变量的几个数值既可以在程序内以数值列表的形式提供，也可以在程序以外以位置参数的形式提供。for循环的一般格式为：</p>
<p>　　for变量名 　 　[in数值列表]</p>
<p>　　do</p>
<p>　　若干个命令行</p>
<p>　　done</p>
<p>　　变量名可以是用户选择的任何字串，如果变量名是var，则在in之后给出的数值将顺序替换循环命令列表中的$var。如果省略了in，则变量var的取值将是位置参数。对变量的每一个可能的赋值都将执行do和done之间的命令列表。</p>
<p>　　4．while和until循环</p>
<p>　　while和until命令都是用命令的返回状态值来控制循环的。While循环的一般格式为：</p>
<p>　　while</p>
<p>　　若干个命令行1</p>
<p>　　do</p>
<p>　　若干个命令行2</p>
<p>　　done</p>
<p>　　只要while的&#8220;若干个命令行1&#8221;中最后一个命令的返回状态为真，while循环就继续执行do...done之间的&#8220;若干个命令行2&#8221;。</p>
<p>　　until命令是另一种循环结构，它和while命令相似，其格式如下：</p>
<p>　　until</p>
<p>　　 若干个命令行1</p>
<p>　　do</p>
<p>　　 若干个命令行2</p>
<p>　　done</p>
<p>　　until循环和while循环的区别在于：while循环在条件为真时继续执行循环，而until则是在条件为假时继续执行循环。</p>
<p>　　Shell还提供了true和false两条命令用于创建无限循环结构，它们的返回状态分别是总为0或总为非0。</p>
<p>　　5．case条件选择</p>
<p>　　if条件语句用于在两个选项中选定一项，而case条件选择为用户提供了根据字串或变量的值从多个选项中选择一项的方法，其格式如下：</p>
<p>　　case string in</p>
<p>　　exp-1)</p>
<p>　　若干个命令行1</p>
<p>　　；；</p>
<p>　　exp-2)</p>
<p>　　 若干个命令行2</p>
<p>　　；；</p>
<p>　　&#8230;&#8230;</p>
<p>　　*)</p>
<p>　　其他命令行</p>
<p>　　esac</p>
<p>　　Shell通过计算字串string的值，将其结果依次和运算式exp-1, exp-2等进行比较，直到找到一个匹配的运算式为止。如果找到了匹配项，则执行它下面的命令直到遇到一对分号(；；)为止。</p>
<p>　　在case运算式中也可以使用Shell的通配符（&#8220;*&#8221;、&#8220;？&#8221;、&#8220;[ ]&#8221;）。通常用 * 作为case命令的最后运算式以便在前面找不到任何相应的匹配项时执行&#8220;其他命令行&#8221;的命令。</p>
<p>　　6．无条件控制语句break和continue</p>
<p>　　break用于立即终止当前循环的执行，而contiune用于不执行循环中后面的语句而立即开始下一个循环的执行。这两个语句只有放在do和done之间才有效。</p>
<p>　　7．函数定义</p>
<p>　　在Shell中还可以定义函数。函数实际上也是由若干条Shell命令组成的，因此它与Shell程序形式上是相似的，不同的是它不是一个单独的进程，而是Shell程序的一部分。函数定义的基本格式为：</p>
<p>　　functionname</p>
<p>　　{</p>
<p>　　 若干命令行</p>
<p>　　}</p>
<p>　　调用函数的格式为：</p>
<p>　　functionname param1 param2&#8230;</p>
<p>　　Shell函数可以完成某些例行的工作，而且还可以有自己的退出状态，因此函数也可以作为if, while等控制结构的条件。</p>
<p>　　在函数定义时不用带参数说明，但在调用函数时可以带有参数，此时Shell将把这些参数分别赋予相应的位置参数$1, $2, ...及$*。</p>
<p>　　8．命令分组</p>
<p>　　在Shell中有两种命令分组的方法：()和{}。前者当Shell执行()中的命令时将再创建一个新的子进程，然后这个子进程去执行圆括弧中的命令。当用户在执行某个命令时不想让命令运行时对状态集合（如位置参数、环境变量、当前工作目录等）的改变影响到下面语句的执行时，就应该把这些命令放在圆括弧中，这样就能保证所有的改变只对子进程产生影响，而父进程不受任何干扰。{}用于将顺序执行的命令的输出结果用于另一个命令的输入（管道方式）。当我们要真正使用圆括弧和花括弧时（如计算运算式的优先顺序），则需要在其前面加上转义符（\）以便让Shell知道它们不是用于命令执行的控制所用。</p>
<p>　　9．信号</p>
<p>　　trap命令用于在Shell程序中捕捉信号，之后可以有3种反应方式：</p>
<p>　　（1）执行一段程序来处理这一信号。</p>
<p>　　（2）接受信号的默认操作。</p>
<p>　　（3）忽视这一信号。</p>
<p>　　trap对上面3种方式提供了3种基本形式：</p>
<p>　　第一种形式的trap命令在Shell接收到与signal list清单中数值相同的信号时，将执行双引号中的命令串。</p>
<p>　　trap 'commands' signal-list</p>
<p>　　trap "commands" signal-list</p>
<p>　　为了恢复信号的默认操作，使用第二种形式的trap命令：</p>
<p>　　trap signal-list</p>
<p>　　第三种形式的trap命令允许忽略信号：</p>
<p>　　trap " " signal-list</p>
<p>　　注意：</p>
<p>　　（1）对信号11（段违例）不能捕捉，因为Shell本身需要捕捉该信号去进行内存的转储。</p>
<p>　　（2）在trap中可以定义对信号0的处理（实际上没有这个信号），Shell程序在其终止（如执行exit语句）时发出该信号。</p>
<p>　　（3）在捕捉到signal-list中指定的信号并执行完相应的命令之后，如果这些命令没有将Shell程序终止的话，Shell程序将继续执行收到信号时所执行的命令后面的命令，这样将很容易导致Shell程序无法终止。</p>
<p>　　另外，在trap语句中，单引号和双引号是不同的。当Shell程序第一次碰到trap语句时，将把commands中的命令扫描一遍。此时若commands是用单引号括起来的话，那么Shell不会对commands中的变量和命令进行替换，否则commands中的变量和命令将用当时具体的值来替换。</p>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/156791.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2007-10-29 22:13 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156791.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Shell编程语法</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156789.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Mon, 29 Oct 2007 14:12:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156789.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/156789.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156789.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/156789.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/156789.html</trackback:ping><description><![CDATA[其实作为命令语言互动式地解释和执行用户输入的命令只是Shell功能的一个方面，Shell还可以用来进行程序设计，它提供了定义变量和参数的手段以及丰富的程序控制结构。使用Shell编程类似于DOS中的批处理文件，称为Shell script，又叫Shell程序或Shell命令文件。
<p>　　<strong> Shell基本语法</strong></p>
<p>　　像高级程序设计语言一样，Shell也提供说明和使用变量的功能。对Shell来讲，所有变量的取值都是一个字串，Shell程序采用$var的形式来引用名为var的变量的值。</p>
<p>　　Shell有以下几种基本类型的变量。</p>
<p>　　（1）Shell定义的环境变量：</p>
<p>　　Shell在开始执行时就已经定义了一些和系统的工作环境有关的变量，用户还可以重新定义这些变量，常用的Shell环境变量有：</p>
<p>　　HOME 用于保存注册目录的完全路径名。</p>
<p>　　PATH 用于保存用冒号分隔的目录路径名，Shell将按PATH变量中给出的顺序搜索这些目录，找到的第一个与命令名称一致的可执行文件将被执行。</p>
<p>　　TERM 终端的类型。</p>
<p>　　UID 当前用户的识别字，取值是由数位构成的字串。</p>
<p>　　PWD 当前工作目录的绝对路径名，该变量的取值随cd命令的使用而变化。</p>
<p>　　PS1 主提示符，在特权用户下，默认的主提示符是#，在普通用户下，默认的主提示符是$。</p>
<p>　　PS2 在Shell接收用户输入命令的过程中，如果用户在输入行的末尾输入&#8220;\&#8221;然后回车，或者当用户按回车键时Shell判断出用户输入的命令没有结束时，就显示这个辅助提示符，提示用户继续输入命令的其余部分，默认的辅助提示符是&gt;。</p>
<p>　　（2）用户定义的变量：</p>
<p>　　用户可以按照下面的语法规则定义自己的变量：</p>
<p>　　变量名=变量值</p>
<p>　　要注意的一点是，在定义变量时，变量名前不应加符号$，在引用变量的内容时则应在变量名前加$；在给变量赋值时，等号两边一定不能留空格，若变量中本身就包含了空格，则整个字串都要用双引号括起来。</p>
<p>　　在编写Shell程序时，为了使变量名和命令名相区别，建议所有的变量名都用大写字母来表示。</p>
<p>　　有时我们想要在说明一个变量并对它设置为一个特定值后就不在改变它的值时，可以用下面的命令来保证一个变量的只读性：</p>
<p>　　readonly 变量名</p>
<p>　　在任何时候，创建的变量都只是当前Shell的局部变量，所以不能被Shell运行的其他命令或Shell程序所利用，而export命令可以将一个局部变量提供给Shell执行的其他命令使用，其格式为：</p>
<p>　　export 变量名</p>
<p>　　也可以在给变量赋值的同时使用export命令：</p>
<p>　　export 变量名=变量值</p>
<p>　　使用export说明的变量，在Shell以后运行的所有命令或程序中都可以访问到。</p>
<p>　　（3）位置参数：</p>
<p>　　位置参数是一种在调用Shell程序的命令行中按照各自的位置决定的变量，是在程序名之后输入的参数。位置参数之间用空格分隔，Shell取第一个位置参数替换程序文件中的$1，第二个替换$2，依次类推。$0是一个特殊的变量，它的内容是当前这个Shell程序的文件名，所以，$0不是一个位置参数，在显示当前所有的位置参数时是不包括$0的。</p>
<p>　　（4）预定义变量：</p>
<p>　　预定义变量和环境变量相类似，也是在Shell一开始时就定义了的变量。所不同的是，用户只能根据Shell的定义来使用这些变量，而不能重定义它。所有预定义变量都是由$符和另一个符号组成的，常用的Shell预定义变量有：</p>
<p>　　$# 位置参数的数量。</p>
<p>　　$* 所有位置参数的内容。</p>
<p>　　$? 命令执行后返回的状态。</p>
<p>　　$$ 当前进程的进程号。</p>
<p>　　$! 后台运行的最后一个进程号。</p>
<p>　　$0 当前执行的进程名。</p>
<p>　　其中，$?用于检查上一个命令执行是否正确。（在Linux中，命令退出状态为0表示该命令正确执行，任何非0值表示命令出错。）</p>
<p>　　$$变量最常见的用途是用做暂存文件的名字以保证暂存文件不会重复。</p>
<p>　　（5）参数置换的变量：</p>
<p>　　Shell提供了参数置换功能以便用户可以根据不同的条件来给变量赋不同的值。参数置换的变量有4种，这些变量通常与某一个位置参数相联系，根据指定的位置参数是否已经设置类决定变量的取值，它们的语法和功能分别如下。</p>
<p>　　a. 变量=${参数-word}：如果设置了参数，则用参数的值置换变量的值，否则用word置换。即这种变量的值等于某一个参数的值，如果该参数没有设置，则变量就等于word的值。</p>
<p>　　b. 变量=${参数=word}：如果设置了参数，则用参数的值置换变量的值，否则把变量设置成word，然后再用word替换参数的值。注意，位置参数不能用于这种方式，因为在Shell程序中不能为位置参数赋值。</p>
<p>　　c. 变量=${参数？word}：如果设置了参数，则用参数的值置换变量的值，否则就显示word并从Shell中退出，如果省略了word，则显示标准信息。这种变量要求一定等于某一个参数的值。如果该参数没有设置，就显示一个信息，然后退出，因此这种方式常用于出错指示。</p>
<p>　　d. 变量=${参数+word}：如果设置了参数，则用word置换变量，否则不进行置换。</p>
<p>　　所有这4种形式中的&#8220;参数&#8221;既可以是位置参数，也可以是另一个变量，只是用位置参数的情况比较多。</p>
<sohu_ad_last><sohumpbanner><mp1 />
 <img src ="http://www.blogjava.net/ThinkingTalking/aggbug/156789.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2007-10-29 22:12 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/10/29/156789.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Emacs23 配置指南</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149537.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Sat, 29 Sep 2007 04:49:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149537.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/149537.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149537.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/149537.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/149537.html</trackback:ping><description><![CDATA[从http://forum.ubuntu.org.cn/viewtopic.php?t=18274 拷贝来的<br />
<span class="postbody">声明： 本人在配置 emacs23 过程中参考了网上众多网友的帖子。因此，很多部分都不是原创，在此就当作一个emacs23解决方案收集帖把！^_^ <br />
<br />
<span style="color: blue;">首先有一个问题要说说，就是在 gnome环境下，使用utf8的local的时候，emacs无法调出scim/fcitx输入法，虽然emacs自带输入法，但是很不好用。据说这个问题是gnome的问题。因为我不用gnome，所以也没有什么解决办法. <br />
不过最新的cvs的代码已经解决了这个问题，可以使用 xft  字体，在 gnome 下面也能够调用输入法，论坛上的 karron 对这个问题很有研究，就不重复了。具体可以查找他的帖子。地址在这里： <a target="_blank" href="http://forum.ubuntu.org.cn/viewtopic.php?t=29742">http://forum.ubuntu.org.cn/viewtopic.php?t=29742</a> <br />
<br />
第二要说的就是这个帖子有些日子了，当时的链接由于论坛的 ftp 需要用户名和密码后都不能直接用了，所以目前只给出具体的 url(http方式登录的，ftp方式自己稍作修改即可)，可以直接登录下载，关于用户名和密码的问题到下面的网页查看。 <a target="_blank" href="http://forum.ubuntu.org.cn/viewtopic.php?t=9685">http://forum.ubuntu.org.cn/viewtopic.php?t=9685</a></span> <br />
<br />
1.下载源代码 <br />
可以用最新的 cvs版的，这样需要从 cvs上下代码了，此时需要做一些准备工作 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">sudo apt-get install ssh cvs(这个是为了在 cvs上下载代码用的) <br />
            sudo apt-get install texinfo(这个是为了方便后面的编译man包)</td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
然后到 cvs服务器上下载最新的代码，先进入自己家目录 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"> export CVS_RSH="ssh" <br />
            cvs -z3 -d:pserver:anonymous@cvs.sv.gnu.org:/cvsroot/emacs co -r emacs-unicode-2 emacs <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
然后就等待把，一段时间后 cvs会结束，此时会在你的家目录下面建立一个emacs的目录，这个目录下面就是 emacs 的 cvs代码，整个大概需要 80M左右的文件，而且如果速度不是很好的话，会很烦的。 <br />
对于心急的朋友，还有一个办法，我几个月前 cvs了一个源码，打包后放到 共享 ftp上了，可以到那里下载。 <br />
在目录 "software/文本工具" 下面。需要注意的是这个包还不支持 xft 字体，因此要用 xft 字体的朋友们最好还是 cvs。 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"> http://ftp.ubuntu.org.cn/software/文本工具/emacs23.tar.bz2 <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
<br />
2.编译 <br />
先配置一些编译环境把，具体的我记不太请了 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">sudo apt-gt install build-essential <br />
            sudo apt-get build-dep emacs21 <br />
            sudo apt-get install xserver-xorg-dev <br />
            sudo apt-get install xorg-dev <br />
            sudo apt-get install libncurses5  <br />
            sudo apt-get install libncurses5-dev <br />
            (感谢关注本帖的朋友们提供)</td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
如果是 cvs的包，那么直接进入 家目录下面的emacs目录，如果是从共享 ftp上 wget 来的，需要先解压 <br />
<br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">tar jxvf emacs23.tar.bz2</td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
同样会生成一个emacs 的目录，然后用下面的方法编译 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"> ./configure --prefix=/usr --with-x-toolkit=gtk <br />
            如果这一步报错，很可能是因为没有安装 gtk2的开发包，那就安装吧。( sudo apt-get install libgtk2.0-dev) <br />
            同时根据报错的提示来安装其他的dev包。 <br />
            make bootstrap <br />
            make info <br />
            sudo make install <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
如果提示缺少什么包，那么就安装下相应的包把。 <br />
编译的过程中出现了一些警告，我是没有理会他，呵呵，只要不出现 error,问题就不大。 <br />
<span style="color: blue;">要是实在不想浪费时间编译也可以直接下载我上传的emacs23的包，直接解压后进入目录 sudo make install 就好了。郁闷，不会打deb包。</span> <br />
<span style="color: red;">昨天刚刚打了一个 deb包，测试了一下，还可以的说。需要的朋友们可以直接下载 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">http://ftp.ubuntu.org.cn/software/文本工具/emacs_23-1_i386.deb</td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
</span> <br />
<span style="color: red;">有朋友反映上面的地址不能下载了，因为这个自从扔进去之后我一直没有管了，而且这个包很古老了，还是在没有 xft 支持的时候的东西,造成的不便先说声抱歉。后面我打了一个带了 xft 支持的包，具体情况看  <a target="_blank" href="http://forum.ubuntu.org.cn/viewtopic.php?t=40210">http://forum.ubuntu.org.cn/viewtopic.php?t=40210</a>  <br />
</span> <br />
3.初步配置 <br />
如果上面的编译安装没有任何问题的话，恭喜你，安装成功了。可以运行一下看看效果！当时的图片已经不在了，就不截图了~ <br />
此时是没有~/.emacs 文件的。这个文件是 emacs 的初始化配置文件此时就建立一个把。 <br />
先来一些基本的配置吧。首先是中文字体，ubuntu下默认的 emacs 的字体太让人不爽了，我们可以在 .Xresources中设定。 <br />
将下面的代码放到你的 ~/.Xresources中，没有这个文件的话就新建一个。 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"> Emacs.Font:fontset-chinese <br />
            Emacs.Fontset-0:-*-fixed-medium-r-*-*-14-*-*-*-c-*-fontset-chinese,\  <br />
            chinese-gb2312:-*-wenquanyi bitmap song-*-*-normal--*-*-*-*-*-*-iso10646-1,\ <br />
            chinese-big5-1:-*-wenquanyi bitmap song-*-*-normal--*-*-*-*-*-*-iso10646-1,\ <br />
            chinese-big5-2:-*-wenquanyi bitmap song-*-*-normal--*-*-*-*-*-*-iso10646-1 <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
说明：我这里用的是文泉驿字体显示中文，用
fixed字体显示英文，这样就可以正常的显示绝大多数的字体了。但是有些繁体还是不正常，比较郁闷的说。另外，如果不想用 wqy
字体，也可以用其他的字体，比如ar pl new sung等等的，只要在
xlsfonts的列表中能够看到，就可以在这里的冒号后面使用，如果对其他的编码有要求的话，也可以指定字体。在emacs 的
Options-&gt;mule-&gt;describe language
enviroment中可以看到对各个环境以的描述。要设置的话，很简单：把相应的环境放到冒号前面，把字体放到冒号后面就好。 <br />
写好后用 xrdb -load ~/.Xresources 然后再启动，看看，字体是不是漂亮多了~ <br />
然后可以设置一些其他的东西，需要的话，把下面的代码加入到 ~/.emacs中把(没有就新建) <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">(setq default-major-mode 'text-mode);一打开就起用 text 模式。 <br />
            (global-font-lock-mode t);语法高亮 <br />
            (auto-image-file-mode t);打开图片显示功能 <br />
            (fset 'yes-or-no-p 'y-or-n-p);以 y/n代表 yes/no，可能你觉得不需要，呵呵。 <br />
            (column-number-mode t);显示列号 <br />
            (show-paren-mode t);显示括号匹配 <br />
            (display-time-mode 1);显示时间，格式如下 <br />
            (setq display-time-24hr-format t) <br />
            (setq display-time-day-and-date t) <br />
            (tool-bar-mode nil);去掉那个大大的工具栏 <br />
            (scroll-bar-mode nil);去掉滚动条，因为可以使用鼠标滚轮了 ^_^ <br />
            (mouse-avoidance-mode 'animate);光标靠近鼠标指针时，让鼠标指针自动让开，别挡住视线。很好玩阿，这个功能 <br />
            (setq mouse-yank-at-point t);支持中键粘贴 <br />
            (transient-mark-mode t);这个忘了，郁闷！ <br />
            (setq x-select-enable-clipboard t);支持emacs和外部程序的粘贴 <br />
            (setq frame-title-format "zhan@%b");在标题栏提示你目前在什么位置。你要把zhan改成自己的用户名 <br />
            (setq default-fill-column 80);默认显示 80列就换行 <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
等等等等，还有非常多的配置，就不在这里贴出来了。网上也有很多，都有详细的解释的。各位朋友们可以自己去查找。 <br />
<br />
4.高级一些的配置 <br />
说高级只不过是需要一些elisp包的原因了。这些包在网上都能够找到的。 <br />
4.1、首先来改变 emacs的界面把，默认的那个一点特色都没有。这个相关的文件是 color-theme.el,其中包含了70多种颜色样式。已经上传到ftp  <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">http://ftp.ubuntu.org.cn/software/文本工具/color-theme.el</td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
下载回来后放到一个地方，这个目录可以随意，我的放在~/myEmacs下面，如果放在别处的参照设置就好了 <br />
把下面的代码加入到 .emacs中 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">(load-file "/home/zhan/myEmacs/color-theme.el") <br />
            (color-theme-darkblue);选择 darkblue的配色方案 <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
可以打开 emacs看看效果，这时，在 Tools-&gt;Color Themes中是可以选择的。这时出现一个
buffer在其中有颜色列表的名字，在相应的 颜色上按鼠标中键就可以预览这种配色方案，如果喜欢的话，就可把这种方案加入到 .emacs中，替换
darkblue这部分，有空格的中间用短横线连起来。(就是减号) <br />
<br />
---------------发个帖子好累阿，其余的部分明天再发了 <img alt="Smile" src="http://forum.ubuntu.org.cn/images/smiles/icon_smile.gif" border="0" />------------------------------- <br />
<br />
继续 ===============(还是放到一个帖子里面，便于大家查阅和指点错误)=================== <br />
<br />
4.2、编译环境的安装 <br />
可能不光是 C/C++的环境，这个配置好了有许多的方便之处。主要使用 cedet的插件，这个的官方网站在 <a target="_blank" href="http://cedet.sourceforge.net/">http://cedet.sourceforge.net</a> 同时我也上传到了 ftp <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"> http://ftp.ubuntu.org.cn/software/文本工具/cedet-1.0beta3b.tar.gz</td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
安装和配置比较简单了，其中的INSTALL说的很清楚了。 <br />
我是解压到 ~/myEmacs <br />
然后 进入目录，用make 编译，其他的选项可以看看INSTALL <br />
然后把如下的部分加入到.emacs中 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">  (add-hook 'texinfo-mode-hook (lambda () (require 'sb-texinfo))) <br />
            (load-file "/home/zhan/myEmacs/cedet-1.0beta3b/common/cedet.el") <br />
            (semantic-load-enable-code-helpers) <br />
            (autoload 'speedbar-frame-mode "speedbar" "Popup a speedbar frame" t) <br />
            (autoload 'speedbar-get-focus "speedbar" "Jump to speedbar frame" t) <br />
            (define-key-after (lookup-key global-map [menu-bar tools]) <br />
            [speedbar] <br />
            '("Speedbar" . <br />
            speedbar-frame-mode) <br />
            [calendar]) <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
这样集成了 speedbar eieio semantic等等的插件在编程的时候很有用。 <br />
然后可以下载ecb插件，就是emacs code browser,就是个代码阅览器 <br />
直接上官网下载或者到 ftp下载 官网也在cedet的那个地方 <br />
同时可以 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">http://ftp.ubuntu.org.cn/software/文本工具/ecb-2.32.zip</td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
然后直接解压到 ~/myEmacs下面 <br />
在 .emacs中加入 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">(add-to-list 'load-path "/home/zhan/myEmacs/ecb-2.32") <br />
            (require 'ecb) <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
现在可以看看效果了，哈，可以看到在Tools的下拉菜单中有 start code browser 和speedbar 的选项，看看，很有意思的，可以选择打开一个 c/c++文件等等的看看效果。(值得注意的是必须弄好 cedet之后ecb才能正确的载入) <br />
<br />
4.3、emacs的tex插件 auctex <br />
使用auctex可以很方便的在emacs中方便的编辑 tex文档 <br />
auctex的网站我忘记了，不好意思。不过我也在 ftp上传了 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"> http://ftp.ubuntu.org.cn/software/文本工具/auctex-11.82.tar.gz</td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
下载回来后解压，然后进入目录 ./configure&amp;&amp;make&amp;&amp;sudo make install就好了 <br />
然后在 .emacs中加入 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">  (load "auctex.el" nil t t) <br />
            (load "preview-latex.el" nil t t) <br />
            (setq TeX-auto-save t) <br />
            (setq TeX-parse-self t) <br />
            (setq-default TeX-master nil) <br />
            (add-hook 'LaTeX-mode-hook 'LaTeX-install-toolbar) <br />
            (add-hook 'LaTeX-mode-hook 'turn-on-auto-fill) <br />
            (add-hook 'LaTeX-mode-hook 'turn-on-reftex) <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
这样，在编辑 tex文件时，就可以使用这个了，要是前面打开了 图片支持的功能，还可以方便的使用那个 preview的功能，这个功能可以直接预览当时所写的一些公式，插入的图片，以及列表等等，而且速度也很快。大家可以试一下。 <br />
基本的操作在菜单中都有，就不多说了。 <br />
<br />
------------------------今天就写到这里吧，明天介绍一下一些有趣的插件以及配置------------------ <br />
4.4 tabbar 插件 <br />
这个插件比较好用，就是一个标签，这样在编程或者干什么的时候开了多个窗口的话，可以在顶上显示出标签 <br />
，而且这个标签还可以自动分组，比较好用。 <br />
插件不知道在什么地方弄来的了，好象是从王垠的网站上弄来的。上传到ftp上了 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">http://ftp.ubuntu.org.cn/software/文本工具/tabbar.el</td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
我下回来后直接放到了 ~/myEmacs中， <br />
把下面两句加到.emacs中 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"> (load-file "/home/zhan/myEmacs/tabbar.el") <br />
            (require 'tabbar) <br />
            (tabbar-mode) <br />
            ;(global-set-key (kbd "C-=") 'tabbar-backward-group);;这几句的目的是绑定快捷键这样就可以直接用快捷键来操做了。 <br />
            ;(global-set-key (kbd "C--") 'tabbar-forward-group);;不过没有发现有很大用处，所以注释了。 <br />
            ;(global-set-key (kbd "C-0") 'tabbar-backward) <br />
            ;(global-set-key (kbd "C-9") 'tabbar-forward) <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
现在打开多个文件看看，应该发现有tab出现了。 <br />
<br />
4.5 ido的配置,这个可以使你在用C-x C-f打开文件的时候在后面有提示，有很多可以配置的选项，懒了，就没有配置，哪位可以补充一下配置方法。我是直接打开了ido的支持，在emacs23中这个是自带的。 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">(require 'ido) <br />
            (ido-mode t) <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
<br />
4.6配置一个字典服务器，在emacs中直接支持英文查单词！ <br />
首先做一点准备工作 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">sudo apt-get install dict-xdict //这个可以在本机上配置一个字典服务器。装好后用 dict hello应该可以看到 hello的解释。^_^ <br />
            http://ftp.ubuntu.org.cn/software/文本工具/dictionary-1.8.7.tar.gz //下载我上传的插件 <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
然后解压 dictionary的那个压缩包。进入目录 make， 然后 cp *.elc /usr/share/emacs/site-lisp(其实这些那个README文件已经写过了) <br />
这样就装好了，下面是配置。 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"> (autoload 'dictionary-search "dictionary" <br />
            "Ask for a word and search it in all dictionaries" t) <br />
            (autoload 'dictionary-match-words "dictionary" <br />
            "Ask for a word and search all matching words in the dictionaries" t) <br />
            (autoload 'dictionary-lookup-definition "dictionary" <br />
            "Unconditionally lookup the word at point." t) <br />
            (autoload 'dictionary "dictionary" <br />
            "Create a new dictionary buffer" t) <br />
            (autoload 'dictionary-mouse-popup-matching-words "dictionary" <br />
            "Display entries matching the word at the cursor" t) <br />
            (autoload 'dictionary-popup-matching-words "dictionary" <br />
            "Display entries matching the word at the point" t) <br />
            (autoload 'dictionary-tooltip-mode "dictionary" <br />
            "Display tooltips for the current word" t) <br />
            (autoload 'global-dictionary-tooltip-mode "dictionary" <br />
            "Enable/disable dictionary-tooltip-mode for all buffers" t) <br />
            ;;==========================上面是readme中写过的东西，没有深究，照抄了，下面是键设定====================== <br />
            <br />
            (global-set-key [mouse-3] 'dictionary-mouse-popup-matching-words);;这个是最常用的，呵呵，右键弹出查找的菜单 <br />
            (global-set-key [(control c)(d)] 'dictionary-lookup-definition) <br />
            (global-set-key [(control c)(s)] 'dictionary-search) <br />
            (global-set-key [(control c)(m)] 'dictionary-match-words) <br />
            <br />
            (setq dictionary-server "localhost") ;;设定服务器在本地       <br />
            (global-dictionary-tooltip-mode t) <br />
            (dictionary-tooltip-mode t) <br />
            ;;基本没有什么难度，大家自己研究把。 <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
配置好了以后，在emacs中输入一个英文单词，点击右键看看。呵呵，知道怎么用了把~，这个还可以增加词典等等的，只要改一改 dictd的设置，与emacs无关了，需要的话，我可写一点出来，也很简单。 <br />
<br />
4.7 emms的设置 <br />
可能你觉得这个很变态,用emacs来听歌，但是其实是很方便的，可以自带歌词显示的！！ <br />
需要 mpg321这个包，如果有 ogg的，还需要 ogg123等等，直接安装把 <br />
首先下载我上传的emms的包 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"> http://ftp.ubuntu.org.cn/software/文本工具/emms-2.0.tar.gz</td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
解压到 ~/myEmacs中，然后添加配置 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code"> (add-to-list 'load-path "~/myEmacs/emms-2.0/") <br />
            (require 'emms-setup) <br />
            (emms-devel) <br />
            <br />
            (setq emms-player-mplayer-command-name "mplayer" <br />
            emms-player-mplayer-parameters '("-slave") <br />
            emms-player-list '(emms-player-mpg321 <br />
            emms-player-ogg123 <br />
            emms-player-mplayer <br />
            emms-player-mplayer-playlist)) <br />
            (setq emms-player-mpg321-parameters '("-o" "alsa"));;mpg321使用alsa输出 <br />
            (setq emms-source-file-default-directory "~/Music" ;;歌曲目录 <br />
            emms-lyrics-dir "~/Music/lyrics"  );;歌词目录。 <br />
            <br />
            ;; keys,键绑定 <br />
            (global-set-key (kbd "&lt;f3&gt;")    'emms-playlist-mode-go-popup) <br />
            (global-set-key (kbd "C-c e t") 'emms-play-directory-tree) <br />
            (global-set-key (kbd "&lt;f3&gt;")    'emms-playlist-mode-go-popup) <br />
            (global-set-key (kbd "C-c e t") 'emms-play-directory-tree) <br />
            (global-set-key (kbd "C-c e x") 'emms-start) <br />
            (global-set-key (kbd "C-c e v") 'emms-stop) <br />
            (global-set-key (kbd "C-c e n") 'emms-next) <br />
            (global-set-key (kbd "C-c e p") 'emms-previous) <br />
            (global-set-key (kbd "C-c e o") 'emms-show) <br />
            (global-set-key (kbd "C-c e h") 'emms-shuffle) <br />
            (global-set-key (kbd "C-c e l") 'emms-play-playlist) <br />
            (global-set-key (kbd "C-c e SPC") 'emms-pause) <br />
            (global-set-key (kbd "C-c e a")   'emms-add-directory-tree) <br />
            (global-set-key (kbd "C-c e r")   'emms-toggle-repeat-track) <br />
            (global-set-key (kbd "C-c e R")   'emms-toggle-repeat-playlist) <br />
            (global-set-key (kbd "C-c e f")   'emms-play-file) <br />
            (global-set-key (kbd "C-c e d")   'emms-play-directory) <br />
            (global-set-key (kbd "C-c e m")   'emms-lyrics-toggle-display-on-minibuffer);;显示歌词 <br />
            (global-set-key (kbd "C-c e M")   'emms-lyrics-toggle-display-on-modeline);;显示歌词 <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
使用我就不多说了，比较简单，摸索一下很快就会了。还有歌词的我没有用过，不知道会不会有问题 <br />
其实可以看到，其中设置了播放器 mplayer因此播放一些视频文件也是可以的~~ <br />
<br />
4.8 gnus的配置 <br />
先稍微介绍一下 gnus能够干些什么，gnus可以用来收发邮件，可以用来订阅新闻组等等的。新闻组是个很不错的东西，和邮件列表很像的说，不了解的可以看看这个文档。 <a target="_blank" href="http://news.yaako.com/data/whatisnewsgroup.pdf">http://news.yaako.com/data/whatisnewsgroup.pdf</a>  其中说，不懂上新闻组的，就是菜鸟！呵呵，我也弄不清什么的，才上几天的 新闻组,发现一个问题，就是好多客户端都是 outlook什么的。上网翻了一下，找到了一些文档，整理在这里把。 <br />
gnus是emacs自带的，功能很是强大，我才刚刚学用，还有很多不清楚的地方，还请看这篇帖子的大哥们能够指点一二。使用
gnus的话，主要是配置，可以把配置写在 .emacs中，不过建议单独写在 .gnus.el中，这样的话不必每次开机都自动启用gnus,在按下
M-x gnus的时候才会启动设置。下面是简单的.gnus.el的设置 <br />
</span>
<table align="center" border="0" cellpadding="3" cellspacing="1" width="90%">
    <tbody>
        <tr>
            <td><span class="genmed"><strong>代码:</strong></span></td>
        </tr>
        <tr>
            <td class="code">;;设定个人信息  <br />
            (setq user-full-name "yourname");;名字 <br />
            (setq user-mail-address "yourmail@***.com");邮箱地址 <br />
            ;设定nntp服务器，现在国内很全的就是这两个了 <br />
            (setq gnus-select-method '(nntp "south.newsfan.net"));全中文的新帆新闻组，这个是电信的服务器，还有一个北方的服务器 news.newsfan.net. <br />
            (add-to-list 'gnus-secondary-select-methods '(nntp "news.yaako.com"));这个服务器上有很多中文的组，具体的上面的pdf有说明。 <br />
            (gnus-agentize);打开代理，允许离线阅读 <br />
            (add-hook 'gnus-group-mode-hook 'gnus-topic-mode) ;使用话题模式，更适合阅读 <br />
            (setq gnus-summary-show-article-charset-alist <br />
            '((1 . cn-gb-2312) (2 . big5) (3 . gbk) (4 . utf-8))) ;设定解码顺序 <br />
            (eval-after-load "mm-decode" <br />
            '(progn <br />
            (add-to-list 'mm-discouraged-alternatives "text/html") <br />
            (add-to-list 'mm-discouraged-alternatives "text/richtext")));阅读的时候把html的头部什么的去掉，只要text部分 <br />
            ;;========================邮件组的设置已经可以了，下面配置收发信件======================================== <br />
            ;(setq pop3-leave-mail-on-server
            t);;这一句是说不要把服务器上的信件删除，但是这样每次把没有删除的信件又取回来一次，很烦，所以我去掉了，那位高手知道如何不删除信件又不重复取信
            的方法，麻烦告诉我一声，谢谢 <br />
            (setq mail-sources <br />
            '((pop :server "pop3服务器" <br />
            :user "用户名" <br />
            :port "pop3" <br />
            :password "密码"))) <br />
            (setq gnus-secondary-select-methods '((nnfolder "")));使用nnfolder的方式存放邮件，这个是最常用的方式 <br />
            <br />
            ;;===================配置 smtp服务其器发送信件============================ <br />
            (setq smtpmail-auth-credentials <br />
            '(("smtp服务器" <br />
            25 <br />
            "用户名" <br />
            "密码")));;这个用户名和密码要和 smtp服务器对应 <br />
            (setq smtpmail-default-smtp-server "smtp服务器") <br />
            (setq smtpmail-smtp-server "smtp服务器") <br />
            (setq message-send-mail-function 'smtpmail-send-it) <br />
            这里有个对应gmail的配置，据说gmail比较特殊，pop3需要ssl, smtp也很怪。相应的设置在这里： <br />
            ;; Pop3 <br />
            ;;(setq mail-sources <br />
            ;;  '((pop :server "pop.gmail.com" <br />
            ;;         :port 995 <br />
            ;;         :user "email.account" <br />
            ;;         :connection ssl <br />
            ;;         :leave t))) <br />
            <br />
            ;; Smtp <br />
            ;;(setq message-send-mail-function 'smtpmail-send-it) <br />
            ;;(setq smtpmail-default-smtp-server "smtp.gmail.com") <br />
            ;;(setq smtpmail-smtp-service 587) <br />
            ;;(setq smtpmail-starttls-credentials <br />
            ;;  '(("smtp.gmail.com" <br />
            ;;     587 <br />
            ;;     nil <br />
            ;;     nil))) <br />
            ;;(setq smtpmail-auth-credentials <br />
            ;;  '(("smtp.gmail.com" <br />
            ;;     587 <br />
            ;;     "email.account" <br />
            ;;     nil))) <br />
            </td>
        </tr>
    </tbody>
</table>
<span class="postbody"> <br />
这样就可以使用 gnus来泡新闻组和收发邮件了，现在邮件应该在mail.misc这个组里面，如果没有可以新建 。 <br />
具体使用和详细的配置我是参考的 这里的文章;  <a target="_blank" href="http://www.emacs.cn/Gnus/Gnus">http://www.emacs.cn/Gnus/Gnus</a>  还有 <a target="_blank" href="http://learn.tsinghua.edu.cn:8080/2005210329//document-backup/gnus.el.html">http://learn.tsinghua.edu.cn:8080/2005210329//document-backup/gnus.el.html</a> 对gnus有兴趣的可以去看看。 <br />
<br />
--------------------------- <br />
就写到这里把，已经把emacs的强大体现了一点了，其他的东西我自己也不知道，有兄弟熟悉的的话可以帮助完善。呵呵。</span>
<span class="genmed"><strong>代码:</strong></span>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/149537.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2007-09-29 12:49 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149537.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Emacs 快速指南</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149535.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Sat, 29 Sep 2007 04:48:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149535.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/149535.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149535.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/149535.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/149535.html</trackback:ping><description><![CDATA[<div class="cnt">
<p>【注意：位于【】之间的内容是译注，比如本行，下同。】 </p>
<p>Emacs 键盘命令通常包含 CONTROL 键（有时候以 CTRL 或 CTL 来标示）和 META 键（有时候用 EDIT 或 ALT 来标示）。为了避免每次都要写出全名，我们 约定使用下述缩写： </p>
<pre> C-&lt;chr&gt;  表示当输入字符 &lt;chr&gt; 时按住 CONTROL 键。<br />
因此 C-f 就表示：按住 CONTROL 键再输入 f。<br />
<br />
M-&lt;chr&gt;  表示当输入字符 &lt;chr&gt; 时按住 META（或 EDIT 或 ALT）键。<br />
如果你的键盘上没有 META 、EDIT 或 ALT 键，用下述方法也等效：<br />
先按一下 ESC 键然后放开，再输入 &lt;chr&gt;。我们用 &lt;ESC&gt; 来表示<br />
ESC 键。<br />
</pre>
<p>重要提示：要退出 Emacs，请用 C-x C-c（两个连续的组合键）。下文中左边顶
行的&#8220;&gt;&gt;&#8221;字样用来提示你尝试键盘命令。比如： &lt;&lt;Blank lines inserted around
following line by help-with-tutorial&gt;&gt;
[本页当中特意留出一些空白是出于教学目的，请继续往后看] &gt;&gt; 现在输入 C-v （查看下一屏文字）移动到下一屏。 </p>
<pre>   （别紧张，在输入字符 v 的同时注意要按住 CONTROL 键）<br />
从现在开始，每读完当前一屏你都需要这样做一次。<br />
</pre>
<p>值得注意的是，当你从上一屏滚到下一屏时，中间会有两行的重复；这样做是为 了维持滚屏的连续性，方便你顺畅、连续地阅读。 </p>
<p>用编辑器，开门第一件事就是学会在文字中移动。你已经知道了 C-v 可以向下移 动一屏，要往上移，请用 M-v （也就是按住 META 键，然后输入v，如果你没有 META、EDIT 或 ALT 键那么就先按 &lt;ESC&gt; 再按 v）。 </p>
<p>&gt;&gt;  试试 M-v，然后再试试 C-v，来回遛几次。 </p>
<ul>
    <li>小结（SUMMARY） </li>
</ul>
<hr />
<p>以下命令在翻页浏览时相当有用： </p>
<pre>        C-v     向前移动一屏<br />
M-v     向后移动一屏<br />
C-l     重绘屏幕，并将光标所在行置于屏幕的中央<br />
（注意是 CONTROL-L，不是 CONTROL-1）<br />
</pre>
<p>&gt;&gt; 找到光标，留意其附近的文字，然后输入 C-l。 </p>
<pre>   找找光标在哪里，你会发现其附近的文字并没有变化。<br />
</pre>
<p>如果你的键盘上有 <span class="wikiword">PageUp</span> 和 <span class="wikiword">PageDn</span>，也可以用这两个键来滚屏。不过使用 C-v 和 M-v 的效率要更高一些。 </p>
<ul>
    <li>基本的光标控制（BASIC CURSOR CONTROL） </li>
</ul>
<hr />
<p>整屏的移动很有用，但是如何在文字中精确定位呢？ </p>
<p>有几种方式可以选择。用方向键当然可以，不过更有效率的方法是保持双手位于 主键盘区，然后使用 C-p 、 C-b 、 C-f 和 C-n 这四个命令。它们的功能和方 向键是一样的，如下图所示： </p>
<pre>                             上一行 C-p<br />
:<br />
:<br />
向左移 C-b .... 目前光标位置 .... 向右移 C-f<br />
:<br />
:<br />
下一行 C-n<br />
</pre>
<p>&gt;&gt; 用 C-n 或 C-p 将光标移到上图的中央。 </p>
<pre>   按 C-l，整幅图会被显示在屏幕的中央。<br />
</pre>
<p>&#8220;P N B F&#8221;四个字母分别代表了四个词，用这四个词记忆这些组合键会更容易： P 代表 previous（上一行），N 代表
next（下一行），B 代表 backward（回 退），而 F 则代表 forward（前进）。这些组合键今后将与你形影不离。 </p>
<p>&gt;&gt; 按几次 C-n 把光标往下挪到这里。 </p>
<p>&gt;&gt; 用 C-f 把光标移动到这一行，然后再用 C-p 往上挪。 </p>
<pre>   注意观察当光标在一行的中央时 C-p 命令的行为。<br />
</pre>
<p>每行文字都以一个&#8220;换行符&#8221;结束，&#8220;换行符&#8221;把行与行区分开来。文件的最后 一行也应该也有一个换行符（不过 Emacs 并不强制要求这一点）。 </p>
<p>&gt;&gt; 在一行的行头输入 C-b。 </p>
<pre>   光标应该会移动到前一行的行尾，因为光标在回退过程中越过了换行符。<br />
</pre>
<p>同样 C-f 也可以像 C-b 一样越过换行符。 </p>
<p>&gt;&gt; 连按几次 C-b，感受一下光标的移动。 </p>
<pre>   然后按几次 C-f 回到本行的行尾。<br />
再按一次 C-f，光标会移动到下一行。<br />
</pre>
<p>当你移动光标穿越屏幕的上下边界时，在边界外的文字会移动到屏幕内，这称为 &#8220;滚动&#8221;（scrolling）。滚动使得光标可以被移动到文字中的任何位置，并且还 不会让光标跑到屏幕外边去。 </p>
<p>&gt;&gt; 用 C-n 将光标下移，一直越过屏幕边界，同时观察发生了什么变化。 </p>
<p>如果你嫌一个字符一个字符地挪光标太慢，你还可以一个词一个词地跳。M-f (META-f) 可以将光标往前移动一个词，而 M-b 则是往后移。【这里的&#8220;词&#8221;指 英文单词，对中文来说，则是指移动到下一个标点符号。】 </p>
<p>&gt;&gt; 试试 M-f 和 M-b。 </p>
<p>如果光标停在一个词的中间，M-f 会移动到这个词的末尾。如果光标处于词与词 之间的空白处，M-f 会移动到下一个词的末尾。M-b 的功能类似，只是方向相反。 </p>
<p>&gt;&gt; 按几次 M-f 和 M-b，中间夹杂一些 C-f 和 C-b。 </p>
<pre>   你可以观察到 M-f 和 M-b 在不同位置上所表现出来的不同行为。<br />
</pre>
<p>请注意 C-f 、C-b 和 M-f 、M-b 两对之间的类比关系。通常的惯例是：META 系 列组合键用来操作&#8220;由语言定义的单位（比如词、句子、段落）&#8221;，而 CONTROL 系列组合键用来操作&#8220;与语言无关的基本单位（比如字符、行等等）&#8221;。 </p>
<p>类似的惯例在&#8220;行&#8221;与&#8220;句子&#8221;之间也同样适用：C-a 和 C-e 可以将光标移动到 &#8220;一行&#8221;的头部和尾部；而 M-a 和 M-e 则将光标移动到&#8220;一句&#8221;的头部和尾部。 </p>
<p>&gt;&gt; 按两次 C-a，再按两次 C-e。 </p>
<pre>   按两次 M-a，再按两次 M-e。<br />
</pre>
<p>想一想为什么重复的 C-a 命令会没有作用，而重复的 M-a 命令则会让光标不断 地回退到上一个句子。虽然这个类比规律并不严格，但是很自然。 </p>
<p>光标停留的位置也可以称作&#8220;点位&#8221;（point）。或者干脆说，光标指示出了屏幕 上&#8220;点位&#8221;在文本中的位置。 </p>
<p>这里对简单的光标移动命令做一个总结，其中也包括了整词和整句的移动： </p>
<pre>        C-f     向右移动一个字符<br />
C-b     向左移动一个字符<br />
<br />
M-f     向右移动一个词【中文是移动到下一个标点符号】<br />
M-b     向左移动一个词【中文是移动到上一个标点符号】<br />
<br />
C-n     移动到下一行<br />
C-p     移动到上一行<br />
<br />
C-a     移动到行首<br />
C-e     移动到行尾<br />
<br />
M-a     移动到句首<br />
M-e     移动到句尾<br />
</pre>
<p>&gt;&gt; 把上面所有的命令都练习几次，这些可都是最常用的命令。 </p>
<p>这里还要介绍两个重要的光标移动命令：M-&lt; （META 小于号）可以将光标移动到 所有文字的最开头；M-&gt; （META 大于号）可以将光标移动到所有文字的最末尾。 </p>
<p>注意，在大部分键盘上，小于号（&lt;）需要用上档键（Shift）来输入，所以在这 些键盘上你应该用 Shift 键来输入 M-&lt;，如果不按 Shift 键，你输入的会是 M-comma（META 逗号）。 </p>
<p>&gt;&gt; 试一试 M-&lt; ，移到本快速指南的最开始。 </p>
<pre>   然后再按几次 C-v 回到这里。<br />
</pre>
<p>&gt;&gt; 试一试 M-&gt; ，移到本快速指南的最末尾。 </p>
<pre>   然后再按几次 M-v 回到这里。<br />
</pre>
<p>如果你的键盘上有方向键的话，也可以用它们来移动光标。不过我们有三个理由 推荐你学习 C-b 、C-f 、C-n 、和
C-p：（1）它们在任何键盘上都能用。（2） 当你熟练使用 Emacs 之后，你会发现用这些组合键比用方向键要快得多，因为你
的手不需要离开打字区。（3）一旦你习惯了使用这些组合键，你也可以很容易地 适应其它更高级的光标移动命令。 </p>
<p>大部分的 Emacs 命令接受数字参数，并且对于多数命令而言，这些数字参数的作
用是指定命令的重复次数。为一个命令指定数字参数（也就是重复次数）的方法 是：先输入
C-u，然后输入数字作为参数，最后再输入命令。如果你有META （或 EDIT 或 ALT）键，那么还有另一种办法：按住 META
键不动，然后输入数字。不 过我们还是建议你用 C-u，因为它在任何终端机上都能用。这种数字参数也称为
&#8220;前缀参数&#8221;，意思是说这个参数是先于使用它的命令而输入的。 </p>
<p>举例来说， C-u 8 C-f 会向前移动 8 个字符。 </p>
<p>&gt;&gt; 为 C-n 或者 C-p 指定一个数字参数，这样你可以只用一个命令就把光标移动 </p>
<pre>   到本行的附近。<br />
</pre>
<p>虽然大部分命令用数字参数来作为其重复次数，但是也有些命令例外，它们将数 字参数另做它用。比如有些命令（目前还没学到）仅仅将前缀参数作为一个标 志——只要有一个前缀参数出现，不管其值为何，命令的功能都会改变。 </p>
<p>而 C-v 和 M-v 则属于另一种类型的例外。当给定一个参数时，它们将滚动你指 定的&#8220;行数&#8221;，而不是&#8220;屏数&#8221;。举例来说，C-u 8 C-v 将屏幕向下滚动 8 行， 而不是 8 屏。 </p>
<p>&gt;&gt; 现在试试看，输入 C-u 8 C-v。 </p>
<p>这个命令应该已经将文字向上滚动了 8 行。如果你想将它再次地向下滚动，你可 以给定一个参数然后执行 M-v。 </p>
<p>如果你正在使用一个窗口系统，比如 X11 或者微软的 Windows，那么在 Emacs 窗口的左边或者右边应该有一个长方形的区域叫&#8220;滚动条&#8221;，你可以用鼠标操纵 滚动条来滚动文字。 </p>
<p>&gt;&gt; 试着在&#8220;滚动条内的反白区域&#8221;上按一下鼠标中键。 </p>
<pre>   文字应该会滚动到鼠标所指示的位置。<br />
</pre>
<p>&gt;&gt; 当按住中键时，试着将鼠标上下移动。 </p>
<pre>   你会看到文字随着鼠标的移动而上下滚动。<br />
【Windows 版本符合 Windows 程序的传统操作习惯，上述操作不适用。】<br />
</pre>
<ul>
    <li>在 EMACS 失去响应的时候（WHEN EMACS IS HUNG） </li>
</ul>
<hr />
<p>如果 Emacs 对你的命令失去响应，你可以很安全地用 C-g 来终止这个命令。 C-g 也可以被用来终止一个执行过久的命令。 </p>
<p>C-g 还可以被来取消数字参数和那些输入到一半的命令。 </p>
<p>&gt;&gt; 输入 C-u 100 设定一个值为 100 的数字参数，然后按 C-g。 </p>
<pre>   现在再按 C-f，光标应该只会移动一个字符，因为你已经用 C-g 取消了参数。<br />
</pre>
<p>如果你不小心按了一下 &lt;ESC&gt;，你也可以用 C-g 来取消它。 【这个说法似乎有问题，因为按照这个按键顺序输入的应该是 C-M-g。 </p>
<pre>  取消&lt;ESC&gt; 的正确做法是再连按两次 &lt;ESC&gt;。】<br />
</pre>
<ul>
    <li>被禁用的命令（DISABLED COMMANDS） </li>
</ul>
<hr />
<p>有一些 Emacs 命令被&#8220;禁用&#8221;了，以避免初学者在不了解其确切功能的情况下误 用这些命令，造成麻烦。 </p>
<p>如果你用到了一个被禁用的命令，Emacs 会显示一个提示消息，告诉你这个命令 到底是干什么的，询问你是否要继续，并在得到你的肯定之后再执行这命令。 </p>
<p>你要是真的想执行被禁用的命令，那么在 Emacs 询问你的时候应该按空格。一般 来说，如果你不想执行，按&#8220;n&#8221;就行了。 </p>
<p>&gt;&gt; 试试 C-x C-l （这是一个被禁用的命令） </p>
<pre>   然后用 n 来回答问题。<br />
</pre>
<ul>
    <li>窗格（WINDOWS） </li>
</ul>
<hr />
<p>Emacs 可以有多个窗格，每个窗格都显示不同的文字。我们后面再介绍怎么对付 多个窗格，现在先让我们先搞明白如何关掉多余的窗格。其实也很简单： </p>
<pre>        C-x 1   只保留一个窗格（也就是关掉其他所有的窗格）。<br />
</pre>
<p>也就是先按 CONTROL-x 然后再按 1。C-x 1 会保留光标所在的窗格，并将其扩大 到整个屏幕，同时关掉所有其它的窗格。 </p>
<p>&gt;&gt; 把光标移到本行然后输入 C-u 0 C-l。 </p>
<p>&gt;&gt; 输入 CONTROL-h k CONTROL-f。观察当一个新窗格出现时当前窗格（用来显示 </p>
<pre>   CONTROL-f 命令的文档）是如何缩小的。<br />
</pre>
<p>&gt;&gt; 输入 C-x 1 关掉文档窗格。 </p>
<p>这个命令跟先前学到的命令不太一样，因为它包含了两个字符，以 CONTROL-x 开 始。有一系列命令都是以 CONTROL-x
开始的，这些命令许多都跟&#8220;窗格、文件、 缓冲区【缓冲区（buffer）会在后文详细介绍】&#8221;等等诸如此类的东西有关，其 中有些命令可能有 2
个、3 个或者 4 个字符长。 </p>
<ul>
    <li>插入与删除（INSERTING AND DELETING） </li>
</ul>
<hr />
<p>插入文字很简单，敲键盘就行了。你能看到的字符，比如 A、7、* 等等，都被 Emacs 视为文字并且可以直接插入。敲 &lt;Return&gt;（回车键）会插入一个换行符。 </p>
<p>你可以用 &lt;Delback&gt; 来删除最后输入的的一个字符，这个跟你在 Emacs 之外的 用法应该一样。一般来说
&lt;Delback&gt; 就是位于 &lt;Return&gt; 键上方某处的一个大号
键，通常被标示为&#8220;Delete&#8221;、&#8220;Del&#8221;或者&#8220;Backspace&#8221;。 </p>
<p>如果你找到了标着&#8220;Backspace&#8221;的键，那么它应该就是 &lt;Delback&gt;；即便你又在 键盘其它地方找到了一个标示为&#8220;Del&#8221;的键，那么它也应该不是 &lt;Delback&gt;。 </p>
<p>一种更通用的说法是，&lt;Delback&gt; 将位于光标前的一个字符删除。 </p>
<p>&gt;&gt; 现在就试试——敲点字，然后按几下 &lt;Delback&gt; 删除它们。 </p>
<pre>   不用担心你会修改文件，你干什么都没关系，这里就是专给你练习用的。<br />
</pre>
<p>如果一行文字很长、超出了窗格的宽度，显示不下的部分会在紧邻的下一行继续 显示。这时会有一个反斜线（控制台下是反斜线，如果你用图形窗口系统，则应 该是一个小小的转弯箭头）显示在右边沿，表明这是某一行的接续显示。 </p>
<p>&gt;&gt; 输入文字，一直到屏幕的右边界，然后继续，你会看到一个接续行出现。 </p>
<p>&gt;&gt; 用 &lt;Delback&gt; 删掉一些文字，直到此行长度小于窗格宽度，接续行就消失了。 </p>
<p>你可以像删除其他字符一样删除换行符。删除两行中间的换行符会将两行合并成 一行。如果合并的结果使这一行太长，超出了窗格的宽度，它就会以一个接续行 来显示。 </p>
<p>&gt;&gt; 移动光标到本行的开头并输入 &lt;Delback&gt;。 </p>
<pre>   这时本行与其前一行将被合并为一行。<br />
</pre>
<p>&gt;&gt; 输入 &lt;Return&gt; 重新插入你刚才删除的换行符。 </p>
<p>前面说过，大部分的 Emacs 命令都可以指定重复次数，这其中也包括输入字符的 命令。重复执行输入字符的命令实际上就是输入多个一样的字符。 </p>
<p>&gt;&gt;  试试 C-u 8 *，这将会插入 ********。 </p>
<p>好，现在你应该已经掌握了最基本的的文本插入和修改功能，其实删除还可以 &#8220;以词为单位&#8221;进行，下面是一个关于&#8220;删除&#8221;操作的小结： </p>
<pre>        &lt;Delback&gt;    删除光标前的一个字符<br />
C-d          删除光标后的一个字符<br />
<br />
M-&lt;Delback&gt;  移除光标前的一个词<br />
M-d          移除光标后的一个词<br />
<br />
C-k          移除从光标到&#8220;行尾&#8221;间的字符<br />
M-k          移除从光标到&#8220;句尾&#8221;间的字符<br />
</pre>
<p>【可能你已经注意到了&#8220;删除（delete）&#8221;和&#8220;移除（kill）&#8221;的用词区别，后 文会有详细说明。】 </p>
<p>注意&#8220;&lt;Delback&gt; 和 C-d&#8221;还有&#8220;M-&lt;Delback&gt; 和 M-d&#8221;是根据前述惯例从 C-f 和
M-f 衍生出来的（其实&lt;Delback&gt;不是控制字符，我们先忽略这一点）。C-k 和 M-k 的关系在某种程度上与 C-e 和
M-e 一样——如果把&#8220;一行&#8221;和&#8220;一句&#8221; 作一个类比的话。 </p>
<p>你也可以用一种统一的办法来移除缓冲区里的任何一部分：首先把光标移动到你 想要移除的区域的一端，然后按 C-@ 或
C-SPC（任一即可，SPC指空格）【注意， C-SPC 往往被中文用户设定成输入法热键，如果这样，C-SPC 就被系统拦截而无 法输入给
Emacs 了，因此这里还是推荐使用C-@。】，然后再移动到另一端，再 按 C-w 就可以把位于这两点之间的所有文字移除了。 </p>
<p>&gt;&gt; 移动光标到上一段开头的&#8220;你&#8221;字。 &gt;&gt; 输入 C-@ 。Emacs 应该会在屏幕的下方显示一个&#8220;Mark
set&#8221;的消息。 &gt;&gt; 移动光标到第二行中的&#8220;端&#8221;字。 &gt;&gt; 输入
C-w，就会把从&#8220;你&#8221;开始到&#8220;端&#8221;之前的文字全部移除。 </p>
<p>注意,&#8220;移除（kill）&#8221;和&#8220;删除（delete）&#8221;的不同在于被移除的东西可以找回
来，而被删除的就不行了。【实际上，移除掉的东西虽然看起来&#8220;消失&#8221;了，但 实际上被 Emacs
记录了下来，因此还可以找回来；而删除掉的东西虽然也可能还 在内存里，但是已经被Emacs&#8220;抛弃&#8221;了，所以就找不回来了。】重新插入被移除
的文字称为&#8220;召回（yank）&#8221;。一般而言，那些会去除很多文字的命令会把去除
掉的文字储存起来（它们被设定成了&#8220;可召回&#8221;），而那些只是去除一个字符或 者只是去除空白的命令就不会储存那些被去除掉的东西（因此你就无法召回）。
</p>
<p>&gt;&gt; 移动光标到一非空白行的行头，然后输入 C-k 移除那一行上的文字。 </p>
<p>&gt;&gt; 再次 C-k，你可以看到它移除了跟在那一行后面的换行符。 </p>
<p>注意，单独的 C-k 会把一行的内容移除，而第二个 C-k 则会移除换行符，并使 其后所有的行都向上移动。C-k
处理数字参数的方式很特别，它会把参数指定的 那么多行连同其后的换行符一起移除，而不仅仅是重复 C-k 而已。比如 C-u 2 C-k
会把两行以及它们的换行符移除；而如果只是输入 C-k 两次显然不是这个结 果。 </p>
<p>将被移除的文字恢复的动作称为&#8220;召回（yanking）&#8221;。（就好像你把别人从你身 边移走的东西又猛力地拉回来。）你可以在你删除文字的地方召回，也可以在别 的地方召回，还可以多次召回同样的文字以得到它的多个拷贝。 </p>
<p>召回的命令是 C-y。它会在光标所在处插入你最后移除的文字。 </p>
<p>&gt;&gt; 试试看，输入 C-y 将文字召回。 </p>
<p>如果你一次连按了好几下 C-k，那么所有被移除的行会被存储在一起，只要一个 C-y 就可以把它们都召回。 </p>
<p>&gt;&gt; 在这里试试，连续按几次 C-k。 </p>
<p>现在再来恢复刚刚被我们移除的文字： </p>
<p>&gt;&gt; 按 C-y。然后把光标往下移动几行，再按一次 C-y。 </p>
<pre>   现在你应该知道怎么复制文字了。<br />
</pre>
<p>C-y 可以把最近移除的文字召回，但如果你想召回的东西不是最近移除的，该怎 么办呢？它们当然没有丢，你可以用 M-y 来召回它们。在用
C-y 召回最近移除 的文字之后，紧接着再用 M-y 就可以召回再前一次被移除的文字，再按一次 M-y 又可以召回再上一次的，因此只要多按几次
M-y 就可以找到你想要召回的东 西了。找到了之后，你什么也不用做，把它们晾在那里，继续你的编辑就行了。 </p>
<p>如果你一次按 M-y 按了很多下，你可能会回到起始点，也就是最近移除的文字。 【看得出这实际上是一个环。】 </p>
<p>&gt;&gt; 移除一行，移动一下光标，然后再移除另外一行。 </p>
<pre>   按 C-y 将第二次移除的那行召回来。<br />
紧接着再按 M-y，它将会被第一次移除的那行取代。<br />
试着再按几下 M-y 看看会发生什么。<br />
再继续，直到第二行被召回来，然后再做个几次。<br />
如果你愿意，你可以试着给 M-y 指定一个正的或负的参数。<br />
</pre>
<ul>
    <li>撤销（UNDO） </li>
</ul>
<hr />
<p>如果你修改了一段文字，又觉得改得不好，可以用 undo 命令进行撤销： C-x u。 </p>
<p>通常 C-x u 会消除一个命令所造成的所有改变；如果你在一行中连续多次地使用 C-x u，你会把以前的命令也依次撤销。 </p>
<p>但是有两个例外： 1） 没有改变文字的命令不算（包括光标移动命令和滚动命令） 2） 从键盘输入的字符以组为单位——每组 20 个字符——来进行处理。 </p>
<pre>    （这是为了减少你在撤销&#8220;插入文字&#8221;动作时需要输入 C-x u 的次数）<br />
</pre>
<p>&gt;&gt; 用 C-k 将这一行移除，然后输入 C-x u ，它会再次出现。 </p>
<p>C-_ 也是撤销命令；它的作用跟 C-x u 一样，但是它比较容易多次输入。C-_ 的 缺点是在某些键盘上可能不太容易按，这也正是我们同时提供 C-x u 的原因。在 某些终端上，你可以按住 CONTROL 再按&#8220;/&#8221;来输入 C-_。 </p>
<p>数字参数对于 C-_ 和 C-x u 的意义是执行撤销的重复次数。 </p>
<ul>
    <li>文件（FILE） </li>
</ul>
<hr />
<p>想保存工作成果就要记得存盘，否则一旦退出 Emacs 你编辑的文字就都丢了。要 存盘，就要在编辑前&#8220;寻找&#8221;到一个存盘文件。（这个过程通常也被称为&#8220;访问&#8221; 文件。） </p>
<p>寻找到一个文件意味着你可以在 Emacs 里查看这个文件的内容。从很多角度讲，
这就等于你在直接编辑这个文件。但是你所做的修改只有在&#8220;存盘&#8221;的时候才会 被写入文件。也正因为如此，你可以丢弃一个改到一半的文件而不必把这个残废
文件也保存到计算机上。最后就算你真正存了盘，Emacs 也会把存盘前的文件重 命名保存，以防你改完之后又想反悔。 </p>
<p>在屏幕的下方，你应该能够看到头尾都是短线&#8220;-&#8221;的一行，其开头通常都是诸如 &#8220;--:--
TUTORIAL.cn&#8221;这样的东西，这些文字就代表了你当前正在访问的文件。
现在你访问的文件叫&#8220;TUTORIAL.cn&#8221;，它只是给你个人临时使用的一个拷贝。只 要你用 Emacs
寻找到一个文件，文件名就会出现在上述位置。 </p>
<p>寻找文件的命令有一个特别之处，那就是你必须给出文件名。我们称这个命令 &#8220;从终端读入了一个参数&#8221;（在这里，这个参数显然就是文件名）。当你输入了 这个命令之后： </p>
<pre>        C-x C-f   寻找一个文件<br />
</pre>
<p>Emacs 会提示你输入文件名。你输入的文件名会出现在屏幕最底端的一行，这一 行被称为小缓冲（minibuffer），在小缓冲里你可以使用通常的 Emacs 编辑命令 来编辑文件名。 </p>
<p>在小缓冲里输入文件名（其实输入别的东西也一样）时可以用 C-g 取消。 </p>
<p>&gt;&gt; 输入 C-x C-f，然后输入 C-g </p>
<pre>   这会关掉小缓冲，同时也会取消使用小缓冲的 C-x C-f 命令。<br />
当然了，你也没有找任何文件。<br />
</pre>
<p>输入完文件名之后用 &lt;Return&gt; 结束，然后 C-x C-f 命令开始工作并找到你指定 的文件。小缓冲在 C-x C-f 命令结束之后也会消失。 </p>
<p>眨眼间文件就会显示在屏幕上，你可以开始编辑了。存盘用这个命令： </p>
<pre>        C-x C-s   储存这个文件<br />
</pre>
<p>这个命令把 Emacs 中的文字存储到文件中。第一次存盘的时候 Emacs 会将原文 件重命名以保留原文。重命名的规则通常是在原文件名之后添加一个&#8220;~&#8221;字符。 </p>
<p>存盘结束后，Emacs 会显示写入文件的文件名。你最好养成经常存盘的习惯，这 样在系统崩溃或者死机的时候你不会损失太多。 </p>
<p>&gt;&gt; 输入 C-x C-s 把本快速指南存下来。 </p>
<pre>   你会看到&#8220;Wrote ...TUTORIAL.cn&#8221;这样的消息显示在屏幕的下方。<br />
</pre>
<p>注意：使用某些终端的时候，输入 C-x C-s 会冻结屏幕【屏幕没有任何输出】， 这样你就看不到 Emacs
的任何变化。其原因是操作系统的&#8220;流量控制&#8221;功能把 C-s 拦截了，并且冻结了屏幕，Emacs 自然也就看不到这个输入了。用 C-q 可以
解除屏幕冻结。要解决这个问题，请参考 Emacs 手册里的&#8220;Spontaneous Entry to Incremental
Search&#8221;一节【Emacs 手册可能还没有中文翻译】，那里可能有 一些有用的建议。 </p>
<p>你可以寻找一个已有的文件然后查看或者编辑，你还可以寻找一个不存在的文件。 实际上这正是用 Emacs
创建新文件的方法：找到不存在的新文件，然后从零开始。 在存盘的时候，Emacs 才真正创建这个文件然后再存盘。在这之后一切就跟你编
辑一个已有文件一样了。 </p>
<ul>
    <li>缓冲区（BUFFER） </li>
</ul>
<hr />
<p>如果你用 C-x C-f 找到第二个文件，第一个文件仍然会在 Emacs 里。要切回第 一个文件，你可以 C-x C-f 再次寻找它。这样，你可以在 Emacs 里同时打开很 多文件。 </p>
<p>&gt;&gt; 用 C-x C-f foo &lt;Return&gt; 的方式建立一个名为&#8220;foo&#8221;的文件。 </p>
<pre>   然后敲入一些文字，再用 C-x C-s 保存文件&#8220;foo&#8221;。<br />
最后，输入 C-x C-f TUTORIAL.cn &lt;Return&gt; 回到这里。<br />
</pre>
<p>Emacs 把每个编辑中的文件都放在一个称为&#8220;缓冲区（buffer）&#8221;的地方。每寻 找到一个文件，Emacs 就在其内部开辟一个缓冲区。用下面的命令可以列出当前 所有的缓冲区： </p>
<pre>        C-x C-b   列出缓冲区<br />
</pre>
<p>&gt;&gt; 现在就试一下 C-x C-b </p>
<p>观察一下缓冲区是如何命名的，它很可能跟其对应的文件同名。事实上，你在一 个 Emacs 窗格里看到的任何文字都是某个缓冲区的一部分。 </p>
<p>&gt;&gt; 输入 C-x 1 离开缓冲区列表 </p>
<p>不管存在多少缓冲区，任何时候都只能有一个是&#8220;当前&#8221;缓冲区，也就是你正在
编辑的这个。如果你想编辑另外一个缓冲区，那么你必须&#8220;切换&#8221;过去。上面讲 过，用 C-x C-f
可以切换到某个文件对应的缓冲区。不过还有一个更简单点的办 法，那就是用 C-x b。用这个命令，你必须输入缓冲区的名称。 </p>
<p>&gt;&gt; 输入 C-x b foo &lt;Return&gt; 以回到文件&#8220;foo&#8221;的缓冲区。 </p>
<pre>   然后输入 C-x b TUTORIAL.cn &lt;Return&gt; 回到这里。<br />
</pre>
<p>大多数情况下，缓冲区和与其对应的文件是同名的（不包括目录名），不过这也 不是绝对的。用 C-x C-b 得到的缓冲区列表中显示的总是缓冲区的名称。 </p>
<p>你在 Emacs 窗格里看到的&#8220;任何&#8221;文字都一定是属于某个缓冲区的。也有些缓冲 区并没有对应文件：比如显示缓冲区列表的缓冲区就是这样，再比如一个名叫 &#8220;*Messages*&#8221;的缓冲区也没有对应的文件，这个缓冲区里存放的都是在 Emacs 底部出现的消息。 </p>
<p>&gt;&gt; 输入 C-x b *Messages* &lt;Return&gt; 瞅瞅消息缓冲区里都有什么东西。 </p>
<pre>   然后再输入 C-x b TUTORIAL.cn &lt;Return&gt; 回到这里。<br />
</pre>
<p>如果你对文件做了修改，然后切换到另一个文件，这个动作并不会帮你把第一个 文件存盘，对第一个文件的修改仍然仅限于 Emacs
中，也就是在它对应的缓冲区 里。同时对第二个文件的修改也不会影响到第一个文件。这很有用，但是也挺麻
烦，因为如果你又想要存储第一个文件，你还需要先用 C-x C-f 切换回去，然后 再用 C-x C-s
存盘，这显然太麻烦了。你需要一个更简便的方法，而 Emacs 当 然已经替你想到了： </p>
<pre>        C-x s   保存多个缓冲区<br />
</pre>
<p>C-x s 会找到所有已被修改但尚未存盘的缓冲区，然后向你逐个询问，是否需要 存盘？ </p>
<p>&gt;&gt; 插入一行文字，然后输入 C-x s。 </p>
<pre>   它应该会问你，是否要储存名为 TUTORIAL.cn 的缓冲区？<br />
按&#8220;y&#8221;告诉它你想存盘。<br />
</pre>
<ul>
    <li>命令集扩展（EXTENDING THE COMMAND SET） </li>
</ul>
<hr />
<p>Emacs 的命令就像天上的星星，数也数不清。把它们都对应到 CONTROL 和 META 组合键上显然是不可能的事情。Emacs 用扩展（eXtend）命令来解决这个问题， 扩展命令有两种风格： </p>
<pre>        C-x     字符扩展。  C-x 之后输入另一个字符或者组合键。<br />
M-x     命令名扩展。M-x 之后输入一个命令名。<br />
</pre>
<p>很多扩展命令都很有用，虽然与你已经学过的命令比起来，他们可能不那么常用。 你应该已经见过一些扩展命令了，比如用 C-x C-f
寻找文件和用 C-x C-s 保存 文件。退出 Emacs 用的 C-x C-c 也是扩展命令。（不用担心退出 Emacs 会给你
带来什么损失，Emacs 会在退出之前提醒你保存文件的） </p>
<p>在控制台下，C-z 可以暂时离开 Emacs——当然，你还可以再回来。 </p>
<p>在允许 C-z 的系统中，C-z 会把 Emacs&#8220;挂起&#8221;，也就是说，它会回到 shell 但不退出 Emacs。在那些最常用的 shell 中，通常可以用&#8220;fg&#8221;或者&#8220;%emacs&#8221; 命令再次回到 Emacs 中。 </p>
<p>在没有提供挂起功能的系统中，C-z 会在 Emacs 之下创建一个子 shell 来让你 运行其它程序，并且再次&#8220;回到&#8221; Emacs 中——虽然我们并没有真正离开过。这 种情况下，通常用shell 命令&#8220;exit&#8221;从子 shell 回到 Emacs。 </p>
<p>C-x C-c 最好在你打算退出登陆的时候再用。在 Emacs 被诸如邮件处理程序之类 的外部程序调用之后，也可以用 C-x C-c 退出。不过一般来讲，如果你不想退出 登录，最好还是把 Emacs 挂起而不是退出。 </p>
<p>C-x 的扩展命令有很多，下面列出的是你已经学过的： </p>
<pre>        C-x C-f         寻找文件。<br />
C-x C-s         保存文件。<br />
C-x C-b         列出缓冲区。<br />
C-x C-c         离开 Emacs。<br />
C-x 1           关掉其它所有窗格，只保留一个。<br />
C-x u           撤销。<br />
</pre>
<p>用命令名扩展的命令一般都不太常用，或者只在部分模式下被用到。比如
replace-string（字符串替换）这个命令，它会在全文范围内把一个字符串替换 成另一个。在你输入 M-x 的时候，Emacs
会在屏幕底端向你询问，然后你应该输 入命令名。如果你想输入&#8220;replace-string&#8221;，其实只需要敲&#8220;repl
s&lt;TAB&gt;&#8221;就 行了，Emacs 会帮你自动补齐的。输入完之后按 &lt;Return&gt; 。 </p>
<p>字符串替换命令需要两个参数——被替换的字符串和用来替换它的字符串。每个 参数的输入用换行符来结束。 </p>
<p>&gt;&gt; 将光标移到本行的下两行空白，然后输入 </p>
<pre>   M-x repl s&lt;Return&gt;changed&lt;Return&gt;altered&lt;Return&gt;。<br />
<br />
【为了继续练习，保留一行原文如下：<br />
Notice how this line has changed: you've replaced... 】<br />
</pre>
<p>请注意这一行是怎么改变的：在光标之后的范围内，你已经将&#8220;changed&#8221;这个 词——不管它在哪里出现——全部用&#8220;altered&#8221;替换掉了。 </p>
<ul>
    <li>自动保存（AUTO SAVE） </li>
</ul>
<hr />
<p>如果你修改了一个文件但是还没来得及存盘，然后你的计算机罢工了，那么你编
辑的东西很可能就找不回来了。为了避免这样的不幸一再发生，Emacs 会定期将
你正在编辑的文件存入一个&#8220;自动保存&#8221;文件中。自动保存的文件名的头尾各有
一个&#8220;#&#8221;字符，比如你正在编辑&#8220;hello.c&#8221;，那么它的自动保存文件就叫 &#8220;#hello.c#&#8221;。在你正常存盘之后，Emacs
会删除自动保存文件。 </p>
<p>假如不幸真的发生了，你大可以从容的打开原来的文件（注意不是自动保存文件） 然后输入 M-x recover file&lt;Return&gt; 来恢复你的自动保存文件。在提示确认的 时候，输入 yes&lt;Return&gt; 就行了。 </p>
<ul>
    <li>回显区（ECHO AREA） </li>
</ul>
<hr />
<p>如果 Emacs 发现你输入多字符命令的节奏很慢，它会在窗格的下方称为&#8220;回显区&#8221; 的地方给你提示。回显区位于屏幕的最后一行。 </p>
<ul>
    <li>状态栏（MODE LINE） </li>
</ul>
<hr />
<p>位于回显区的正上方的一行被称为&#8220;状态栏&#8221;。状态栏上会显示一些信息，比如： </p>
<p>--:**  TUTORIAL.cn       (Fundamental)--L670--54%---------------- </p>
<p>状态栏显示了 Emacs 的状态和你正在编辑的文字的一些信息。 </p>
<p>你应该知道文件名的意思吧？就是你找到的那个文件嘛。-NN%-- 显示的是光标在 全文中的位置。如果位于文件的开头，那么就显示
--Top-- 而不是 --00%--；如 果位于文件的末尾，就显示 --Bot--。如果文件很小，一屏就足以显示全部内容， 那么状态栏会显示
--All--。 </p>
<p>L 和其后的数字给出了光标所在行的行号。 </p>
<p>最开头的星号（*）表示你已经对文字做过改动。刚刚打开的文件肯定没有被改动 过，所以状态栏上显示的不是星号而是短线（-）。 </p>
<p>状态栏上小括号里的内容告诉你当前正在使用的编辑模式。缺省的模式是 Fundamental，就是你现在正在使用的这个。它是一种&#8220;主模式&#8221;。 </p>
<p>Emacs 的主模式林林总总。有用来编辑程序代码的——比如 Lisp 模式；也有用 来编辑各种自然语言文本的——比如 Text 模式。任何情况下只能应用一个主模 式，其名称会显示在状态栏上，就在现在显示&#8220;Fundamental&#8221;的地方。 </p>
<p>主模式有时会改变一些命令的行为。比如说，不管编辑什么样的程序代码，你都
可以用一个统一的命令来添加注释，但是在不同的语言中注释的语法往往是不同 的，这时相应的主模式就会分别用各自的语法规则来添加注释。主模式都是可以
用 M-x 启动的命令，所以 M-x fundamental-mode 就可以切换到 Fundamental 模式。 </p>
<p>如果你要编辑自然语言文本——比如现在——你应该用 Text 模式。 </p>
<p>&gt;&gt; 输入 M-x text mode&lt;Return&gt;。 </p>
<p>别害怕，没有什么命令会改变功能。不过你可以发现，M-f 和 M-b 现在把单引号 （'）视为词的一部分了。而在先前，在 Fundamental 模式中，M-f 和 M-b 都将 单引号视为分隔单词的符号。 </p>
<p>主模式通常都会搞一些类似的小动作，因为很多命令其实完成的是&#8220;相同的工 作&#8221;，只是在不同情况下会有不同的工作方式而已。【所谓&#8220;求同存异&#8221;，在 Emacs 里得到了很好的体现】 </p>
<p>用 C-h m 可以查看当前主模式的文档。 </p>
<p>&gt;&gt; 用 C-u C-v 将本行带到靠近屏幕的上方。 &gt;&gt; 输入 C-h m，看看 Text 模式与 Fundamental 模式有哪些不同。 &gt;&gt; 输入 C-x 1 关掉文档窗格。 </p>
<p>主模式之所以称之为&#8220;主（major）&#8221;模式，是因为同时还有&#8220;辅模式&#8221;（minor
mode）存在。辅模式并不能替代主模式，而是在主模式之外再做一些辅助的修改。
每个辅模式都可以独立地开启和关闭，跟其它辅模式无关，跟主模式也无关。所 以你可以不用辅模式，也可以用一个或者多个辅模式。 </p>
<p>有一个叫做自动折行（Auto Fill）的辅模式用处很大，特别是在编辑自然语言文 本的时候。这个辅模式启动后，Emacs 会在你打字超出一行边界时自动替你换行。 </p>
<p>用 M-x auto fill mode&lt;Return&gt; 启动自动折行模式。启动之后，如果我们再用 一次 M-x auto
fill mode&lt;Return&gt;，自动折行模式就被关闭了。也就是说，如果
自动折行模式没有开启，这个命令会开启它；而如果已经开启了，这个命令会关 闭它。我们说这个命令用来&#8220;开关（toggle）&#8221;模式。 </p>
<p>&gt;&gt; 现在输入 M-x auto fill mode&lt;Return&gt;。然后随便敲点什么，直到你看到它 </p>
<pre>   分成两行。必须敲一些空格，因为 Auto Fill 只在空白处进行断行。【空格<br />
对英文来说是必须的，而对中文则不必。】<br />
</pre>
<p>行边界通常被设定为 70 个字符【这里指英文字符】，你可以用 C-x f 命令来重 新设定之。指定新行边界可以用数字参数来进行传递。 </p>
<p>&gt;&gt; 输入 C-x f 并传递参数 20： C-u 2 0 C-x f。 </p>
<pre>   然后输入一些文字，观察 Emacs 的自动折行动作<br />
最后再用 C-x f 将边界设回 70。<br />
</pre>
<p>如果你在段落的中间做了一些修改，那么自动折行模式不会替你把整个段落重新 折行。重新自动折行用 M-q，注意使用的时候光标必须位于你想折行的那一段里。 </p>
<p>&gt;&gt; 移动光标到前一段中，然后输入 M-q。 </p>
<ul>
    <li>搜索（SEARCHING） </li>
</ul>
<hr />
<p>Emacs 可以向前或者向后搜索字符串。搜索命令是一个移动光标的命令：搜索成 功后，光标会停留在搜索目标出现的地方。 </p>
<p>Emacs 的搜索命令的独特之处在于，它是&#8220;渐进的（incremental）&#8221;，意思是搜 索与输入同时进行：你在这边一个字一个字地输入你想搜索的东西，同时 Emacs 在那边就替你搜索了。 </p>
<p>C-s 是向前搜索，C-r 是向后搜索。不过手别这么快！先等等别着急试。 </p>
<p>在你按下 C-s 之后，你会发现回显区里有&#8220;I-search&#8221;字样出现，这是在提示 你目前 Emacs 正处于&#8220;渐进搜索&#8221;状态，正在等待你输入搜索字串。&lt;Return&gt; 会结束搜索。 </p>
<p>&gt;&gt; 输入 C-s 开始一个搜索。注意敲慢一点，一次输入一个字符。 </p>
<pre>   慢慢输入&#8220;cursor&#8221;整个词，每敲一个字就暂停一下，注意观察光标。<br />
现在你应该已曾经找到&#8220;cursor&#8221;这个词了。<br />
</pre>
<p>&gt;&gt; 再按一次 C-s，搜索下一个&#8220;cursor&#8221;出现的位置。 &gt;&gt; </p>
</div>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/149535.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2007-09-29 12:48 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149535.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Ubuntu Linux实务操作(4)</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149533.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Sat, 29 Sep 2007 04:46:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149533.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/149533.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149533.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/149533.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/149533.html</trackback:ping><description><![CDATA[<div class="cnt"><strong>GNU/Linux目錄的结构</strong><br />
<br />
在GNU/Linux里面，所有的目錄都是从 /(root)根目錄所扩展的树状结构。也许有些朋友会问，如果有很多颗硬盘，那不就有很多根目录吗?
事实不是这样的！那些硬盘的某个分割区不会像MS
Windows一樣，分割成C槽、D槽和E槽等等，而都是在那个根目錄或底下的某个子目錄，只是把某个分割区掛载(mount)到那个目錄罢了，也就是說
在Microsoft Windows的X槽对应到GNU/Linux的话，就是掛载在某一个目錄底下。<br />
<br />
如果这樣的掛来掛去，总要有个初始化源头让我们掛吧?  所以至少要有一块分割区给根目錄/(root)，其它的目錄就会以此为基础续掛在根目錄的某个子目錄下。如此就会形成一个如下图4-1的树状结构。<br />
<br />
GNU/Linux的发行版太多了，在早期每个发行版都有自己首选的目錄分配方式，不同的版本有不一样的目录分配，因此而造成很多使用者的困扰。为了平息
这樣的乱局，Filesystem Hierarchy
Standard(FHS：http://www.pathname.com/fhs/)就出面制定了一些标準，让各个发行版有个纲要可以知道哪个目錄要
放什麼樣的东西。当前FHS定义的是每个目錄的大纲，所以很多细部配置文件的文件名或许还是有所不同，但是几乎都放在同一个目錄底下了。这樣用户在寻找的
时候，应该是容易许多了。所以Ubuntu也遵循这樣的命名结构，图4-1在別的发行版也适用。<br />
<br />
我们了解了上面的內容之后，知道在安装时必需有一个/(root)根目錄，其它目錄是依附在它下面。这些其它的目錄所使用的实体硬盘空间可以是独立出来在
另外一颗硬盘或同一颗的其它分割区或者甚至不用独立出来。如果沒有独立出来的话，就是使用
/(root)根目錄分割区的空间或者在上一层的实体分割区空间。<br />
<br />
<br />
<div forimg="1">
<div forimg="1"><img class="blogimg" small="0" src="http://hiphotos.baidu.com/dhaudgh/pic/item/8674a658cab623db9c82049b.jpg" border="0"  alt="" /></div>
<br />
</div>
<br />
<br />
<br />
根据表4-1读者可以自行评估哪一个目錄比较重要，然后決定是否独立出来，这樣子可以拿来当成损害控管之用。后面也会有一些比较容易看懂的实际例子。<br />
<br />
<div forimg="1"><img class="blogimg" small="0" src="http://hiphotos.baidu.com/dhaudgh/pic/item/8ee5b9b1ded1d95108230266.jpg" border="0"  alt="" /></div>
<br />
<br />
<br />
<strong>硬件设备的代号</strong><br />
<br />
在GNU/Linux裡面有个很好玩的特色，就是所有硬件设备都是可以看成是某个文件来操作。这樣有个好处是，应用软件只要管好对那个文件要如何操作，而
不必要管实际上硬件的运作。其中代表设备的文件和实际运作的硬件中间的关连，就是GNU/Linux kernel所需要负责的。<br />
<br />
对於IDE硬盘来說，常常组装计算机的人应该都知道主机板上最多只有两个IDE插槽，而每个插槽都可以通过排線接两个硬盘。主机板上第一个插槽就是
IDEl (Primary)，第二个插槽就是IDE2
(Secondary)，每个插槽上可以接的两颗硬盘其中一颗是Master，另外一颗就是Slave，至於怎樣判断可以通过硬盘上的jumper来得
知。若是硬盘上的jumper插在cable
selection的话，那麼从排線前端数过来第一颗就是Master，如表4-3，我们可以得知插在第一个插槽的Master硬盘，它的文件别名位置就
是/dev/hda，若光盘机是装在第二个插槽且jumper预设是Slave的话，这时候光盘机的文件代号的位置就在 /dev/hdb。<br />
<br />
对於SCSI，SATA和随身碟则都是 /dev/sd
[a-z]，但是它们会依照顺序排下去，理论上会先排SCSI，然后是SATA，最后才是随身碟，不会有重疊的部份。因为现在很多新的计算机都採用
SATA硬盘，所以请记得这些SATA硬盘的别名都是和SCSI用一樣的。举例来說，若你有两台SATA硬盘，但是沒有SCSI设备，那麼第一颗SATA
硬盘的文件位置别名就是/dev/sda，第二颗就是 /dev/sdb，就是这么简单。<br />
<br />
<br />
<div forimg="1"><img class="blogimg" small="0" src="http://hiphotos.baidu.com/dhaudgh/pic/item/b733fd3d450babc29e3d6260.jpg" border="0"  alt="" /></div>
<br />
<br />
<br />
<strong>分割区概述(Partition)</strong><br />
<br />
前面已经提到了，在MicroSoft
Windows中同一颗硬盘的各个槽其实就代表了不同的分割区。一般人通常都喜欢把硬盘分割成C区和D区，若需要重新安装系统的时候，就会把所有数据和文
件都放在D区，只要把系统碟C区格式化刪除，再重装系统，如此数据就不用备份出来，可以很容易完成重装且保存数据。同樣地，在GNU/Linux也是一
樣，我们喜欢把重要的目錄分別放在不同的分割区，这樣子系统出了问题也能很容易来救援。<br />
<br />
<br />
我们来一个比喻，我们把硬盘想像成是一间很大的办公室，如图4-2所示，门口部份有一个柜子让你放办公室相关的消息。那个柜子就叫作主要开机扇区
(MBR，Master Boot Recorder) ，而柜子裡面有两个抽屜，一个是放置开机管理程序(boot
loader)，另外一个就是放置磁盘分割表(partition table)，这个磁盘分割表就是纪錄整个办公室隔间隔局的地方。<br />
<br />
<br />
<div forimg="1"><img class="blogimg" small="0" src="http://hiphotos.baidu.com/dhaudgh/pic/item/2823b218b5bf4ab14bedbc62.jpg" border="0"  alt="" /></div>
<br />
<br />
<br />
因为磁盘分割表的空间有限，所以我们只能存储最多四间隔间的信息，若你沒有在这四个隔间把整个坪数划分完，那麼多出来的空间就不能使用的。而整间办公室能
隔成的房间总共有两种，一种是主分割区(Primary)
，另外一种是扩展分割区(Extended)，且规定扩展分割区最多只能有一间。那麼扩展分割区是要拿来做什麼用的呢?其实扩展分割区是不能直接使用的，
可以看成它是另外一种房间，前面也有柜子存储扩展分割区底下的信息，但是因为裡面沒有家俱，所以沒办法直接使用。所以扩展分割区还要再分割成逻辑分割区
(Logical)，从扩展分割区再分割的逻辑分割区最多可以分割到12个，故最后可用的最多分割区数会有3个主分割区+12个逻辑分割区=15个分割
区，那就满足使用了。<br />
<br />
<br />
<div forimg="1"><img class="blogimg" small="0" src="http://hiphotos.baidu.com/dhaudgh/pic/item/f8022b3078e2289ca8018e63.jpg" border="0"  alt="" /></div>
<br />
<br />
<br />
每个分割区在GNU/Linux都有它的设备文件别名，它的别名就是硬盘设备代号后面加上数字。例如我们把4个分割区都分割成主要分割区，那麼就会如图4
-3所示，给的分割区别名分別是hdal到hda4。但是这个时候如果想要超过4个分割区呢?
那就得要使用扩展分割区。我们可以把图4-3最后一个主分割区換成扩展分割区，再把那个扩展分割区分割成3个逻辑分割区，最后会如图4-4，会有6个分割
区可以用。<br />
<br />
逻辑分割区一定是从hda5开始，而前面刚好有hdal到hda4这4个别名，就是给主分割区和扩展分割区瓜分的，至於扩展分割区是不能直接用的，最多也只有一个，要扩展分割区裡面的逻辑分割区才可以直接被使用。<br />
<br />
<br />
<div forimg="1"><img class="blogimg" small="0" src="http://hiphotos.baidu.com/dhaudgh/pic/item/5622027a5e7cdae82f73b36d.jpg" border="0"  alt="" /></div>
<br />
<br />
<br />
当然我们也可以用一个主分割区配上一个扩展分割区，如图4-5来达到和图4-4一樣有6个分割区的效果，但是我们实务上比较喜欢先把主要分割区用完，再来搭配扩展分割区使用。不管怎樣，只要记得一个规则，主要分割区加扩展分割区最多只能有4个，其它的都随使用者来发挥。<br />
<br />
<br />
<div forimg="1"><img class="blogimg" small="0" src="http://hiphotos.baidu.com/dhaudgh/pic/item/57ae90c235d7421e0ff4776d.jpg" border="0"  alt="" /></div>
<br />
<br />
<br />
在linux中一定要被独立划分出来的分割区有 /(root)和swap，若你只要这樣基本的分割法，那麼安装的时候选自动分割就是採用这种作法，但是对於有特殊需求的人，可以使用手动规划方式。<br />
<br />
<br />
● /(root)分割区：所有的目录都是根目录的子目录，所以这个分割区一定要有。<br />
<br />
● swap分割区：swap分割区是做什麼用的呢?其实它可大可小，尤其是在内存大家都装768MB或1
GB的年代。它的功能类似微软Windows XP的虚存，不过在Windows
XP裡面虚存是单独一个文件存放在C区，但是在GNU/Linux內则是独立成为一个分割区。通常swap是在跑大程序时候，若需要用到的内存比系统拥有
的主記憶存还大时，才会先把一些不常用的数据放到虚存裡面，然后等要用到时，再把它叫出来。而依照一般旧制经验法则，swap是主記憶存的两倍，但是笔者
建议是和主記憶存一樣大就好或者干脆512 Mb的swap就很夠用了。<br />
<br />
<br />
<strong>文件系统格式概述</strong><br />
<br />
在Microsoft
Winsows的世界，硬盘可以格式化成NTFS、FAT32、FATl6等等不同的格式。同樣地，在GNU/Linux底下也是有很多不同的文件系统格
式可供选择。当前在GNU/Linux底下，比较常用的有这几种格式：Ext2／Ext3、ReiserFS、XFS和JFS等数种。当然各种格式都有其
优缺点，所以我们将做一些简单的介绍。<br />
<br />
除了Ext2以外，其它几种都是日誌型文件系统。那什麼是日誌型文件系统呢? 就是系统会多用一些额外的空间纪錄硬盘的数据状态，因而在不正常开关机后，不需整个硬盘重新扫描来恢复正常的系统状态。<br />
<br />
● Ext2：此为一非常老旧且不支持日誌系统的文件系统格式，早期的Linux玩家应该还记得吧，在每次不正常关机后，重新开机时错误检查会需要很久，而且在不正常关机下，常常会让你一次不见很多文件，现在已经很少人使用这类文件系统了。<br />
<br />
●
Ext3：为Ext2个改良版，所以Ext2可以直接升级成为Ext3而不必重新格式化，这也可以让旧的Ext2系统更加稳定。而主要和Ext2的差別是
增加了日誌系统(metadata)，所以在不正常开关机后，可以迅速使系统恢复。而因为它与旧有的文件系统兼容，因此很多发行版都缺省使用Ext3。但
是在实际测试上，它的硬盘使用率其实不佳，大概只有真正空间的93％会被使用到，至於其它性能测试表现则为中等。在格式化与创建文件系统的时间也是其它文
件系统的数十倍。<br />
<br />
● ReiserFS：http://www.namesys.com：採用日誌型的文件系统，为Hans
Reiser所创，因此以他的名字来命名。技术上使用的是B*-tree为基础的文件系统，其特色为从处理大型文件到眾多小文件都可以用很高的效率处理。
实务上ReiserFS
在处理文件小於1k的小文件时，效率甚至可以比Ext3快約10倍，所以ReiserFS专长是在处理很多小文件。而在一般操作上，它的性能表现也有中上
的程度。<br />
<br />
●
XFS：http://oss.sgi.com/projects/xfs/：绘图工作站公司SGI为了高级绘图处理器系统IRIX所设计的文件格式，也
是属於日誌型文件系统。而SGI亦将其移植到GNU/Linux上。因为原本是针对高性能绘图设计，且为高阶工作站所使用，所以在稳定性和效率上是无雍置
疑的。论其在实务上的表现，它在处理各种文件尺寸混合的情況下效率最好，並且在一般使用上有<br />
不错的表现。<br />
<br />
●
JFS：http://jfs.sourceforge.net：为全球最大计算机供应商IBM为AIX系列设计的日誌型文件系统，技术上使用的是B+-
tree为基础的文件系统和ReiserFS使用B*-tree不同。IBM
AIX服务器在很多金融机构上使用，所以稳定性是沒话說的。而它最重要的特色是在处理文件I/O的时候是所有文件系统里面最不佔CPU资源的，也就是
CPU使用率最低。而且在这樣节省使用CPU的情況下，它的效率表现还有中上以上的程度。<br />
<br />
虽然Ext3性能不好(在日誌型文件系统中效率上算是最糟糕的)
，那为何还有那麼多人使用?那是因为当时Ext3可以直接从Ext2升级，而不需要先备份数据，然后格式化后再把文件复制回去，所以使用人数最多。但这也
不能全然怪它，因为它为了和Ext2兼容，所以背负了很多的历史包袱。因此我推荐新的电脑考虑使用ReiserFX、XFS或JFS。若是以性能为考虑，
则可以选择ReiserFS或XFS。若是系统资源不多，要使用最低的CPU使用率，那麼可以选择JFS，因为它有著最好的性能资源比。<br />
<br />
在网络上有一些文件系统性能评估，这裡列出来给大家参考一下：<br />
<br />
★ http://www.debian-administration.org/articles/388<br />
<br />
★ http://fsbench.netnation.com/<br />
<br />
★ http://linuxgazette.net/122/TWDT.html<br />
<br />
★ http://linuxgazette.net/102/piszcz.html<br />
<br />
<br />
<strong>开始规划你的硬盘</strong><br />
<br />
随著任务的不同，你可以有各种不同的硬盘规划。笔者假设你使用80 GB的IDE硬盘，内存512 MB，因此规划swap是512 MB，硬盘设备别名是hda。<br />
<br />
<br />
以下是几种不同的硬盘规划，分別是适合入门，高级和服务器所需要，大家可以视需求自行参考。不过你在进行分割之后，有可能会因为換算的关系，少了个几MB，那是沒有关系的，只要不要太离谱，都应该是沒问题的。<br />
<br />
<br />
<div forimg="1">
<div forimg="1"><img class="blogimg" small="0" src="http://hiphotos.baidu.com/dhaudgh/pic/item/74f8491e9bd09ef11ad5766f.jpg" border="0"  alt="" /></div>
<br />
</div>
<br />
<br />
每个分割区都是可以存放独立的文件系统，互相不影响，所以大家也可以在hdal安装Windows
XP，然后hda2安装GNU/Linux，再通过MBR上的bootloader来选择要用哪个分割区来开机。如果读者真的想要使用双系统的话，推荐是
先安装Windows
XP，並且在安装时留下剩下的空间来做额外的分割区给Ubuntu使用，如此在安装Ubuntu以后，Ubuntu的bootloader-GRUB将会
自动设置成启动的时候可以有双系统供你选择。请记得最好不要先安装Ubuntu再安装Windows XP，这樣GRUB的设置会被Windows
XP洗掉，那你就得要手动重新安装GRUB到MBR了。<br />
<br />
若是你真的不想重装Windows XP，可以先重整硬盘，然后用SPFDISK这个工具程序把硬盘的分割表更改尺寸，这樣就可以挤出空间来装Ubuntu，但这个方法特別留意，並不一定会成功，而且也许会造成你的数据遗失。<br />
<br />
<br />
<div forimg="1"><img class="blogimg" small="0" src="http://hiphotos.baidu.com/dhaudgh/pic/item/d919e9544f82025dd0090668.jpg" border="0"  alt="" /></div>
</div>
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/149533.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2007-09-29 12:46 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149533.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>ubuntu系统目录结构 </title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149532.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Sat, 29 Sep 2007 04:43:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149532.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/149532.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149532.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/149532.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/149532.html</trackback:ping><description><![CDATA[http://hi.baidu.com/dhaudgh/blog/item/b2e3c6d3db2bb0dea9ec9a20.html/cmtid/4d2cc9fa1ebd16dfb58f314d#4d2cc9fa1ebd16dfb58f314d
<img src ="http://www.blogjava.net/ThinkingTalking/aggbug/149532.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2007-09-29 12:43 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/09/29/149532.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>终端聊天</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/06/09/123002.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Sat, 09 Jun 2007 04:22:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/06/09/123002.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/123002.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/06/09/123002.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/123002.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/123002.html</trackback:ping><description><![CDATA[irssi -c irc.ubuntu.com<br><br>irssi命令:<br><font size="-1">rssi is an IRC client program with a text-mode user
interface. Written in the C programming language for Unix-like
operating systems, it is licensed under the terms of the GNU General
Public License. Irssi also runs under Microsoft Windows with the aid of
Cygwin, and may acquire a graphical front-end sometime in the future.
Additionally, irssi is available on Mac OS X with Fink or natively with
MacIrssi or the Cocoa-client Colloquy.
</font><br><br> <img src ="http://www.blogjava.net/ThinkingTalking/aggbug/123002.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2007-06-09 12:22 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/06/09/123002.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Install Ubentu7.04</title><link>http://www.blogjava.net/ThinkingTalking/archive/2007/05/22/119049.html</link><dc:creator>David.Ko</dc:creator><author>David.Ko</author><pubDate>Tue, 22 May 2007 01:53:00 GMT</pubDate><guid>http://www.blogjava.net/ThinkingTalking/archive/2007/05/22/119049.html</guid><wfw:comment>http://www.blogjava.net/ThinkingTalking/comments/119049.html</wfw:comment><comments>http://www.blogjava.net/ThinkingTalking/archive/2007/05/22/119049.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/ThinkingTalking/comments/commentRss/119049.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/ThinkingTalking/services/trackbacks/119049.html</trackback:ping><description><![CDATA[1.下载ISO文件和引导文件包<br>2.按照引导文件里的配置步骤配置，在这里强调ISO文件要放到fat32格式的磁盘下，ntfs目前不支持.<br>3.重启机器，选中Ubuntu linux一行，回车,进入安装目录，和windows安装差不多 。<br>4.磁盘分区,我分了两个。一个是主分区(12GB)，一个是交换分区swap（内存大小的两倍）.<br>5.等待安装完毕。重启 <br>6.按照下面的网址里的配置方式配置你的系统：<br><a  href="http://wiki.ubuntu.org.cn/index.php?title=%E5%BF%AB%E9%80%9F%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/FeistyFawn&amp;variant=zh-cn">http://wiki.ubuntu.org.cn/index.php?title=%E5%BF%AB%E9%80%9F%E8%AE%BE%E7%BD%AE%E6%8C%87%E5%8D%97/FeistyFawn&amp;variant=zh-cn</a><br>这里强调的是软件源的配置很关键，不好的话下东西是很慢的。我用的是n99和清华的源.<br>7.配置完毕，重启<br>8.好了，系统就配到这了。<br>下面写Java开源套装的环境配置<br>jdk+tomcat+eclipse+mysql<br>这里建议不要用软件管理器安装jdk因为你要配置你的JAVA_HOME<br>编辑\etc\bash.bashrc<br>sudo gedit&nbsp; \etc\bash.bashrc<br>在末尾加入<br>export JAVA_HOME=你的JDK安装目录<br>export JRE_HOME=<br>export CLASSPATH=.;$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH<br>export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH<br>保存 <br>配置默认JVM<br>
<pre>sudo update-alternatives --config java<br>输入 有包含 "sun" 的行的前面的数字。然後回车确定。<br>JDK就配置好了 .<br></pre>
<br>  <img src ="http://www.blogjava.net/ThinkingTalking/aggbug/119049.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/ThinkingTalking/" target="_blank">David.Ko</a> 2007-05-22 09:53 <a href="http://www.blogjava.net/ThinkingTalking/archive/2007/05/22/119049.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>