Unix使用制表符的方式
当査看键盘时,会发现键盘上有一个<Tab> 键。这个键继承自打字机上所使用的制表
符。尽管我们己经不再使用制表符,但是仍然使用<Tab>键,而且Unix仍然使用制表符设
置。为了理解其原因,我们先返回到打字机主宰办公机器领域的时代。
单词“tab”是“tabulate,制表”的缩写,意味着将信息组织成表格。老式打字机上的
<Tab>键被设计用来帮助按列排列信息,并在段落的开头缩进文本。下面举一个示范如何
使用<Tab>键的例子。
假设您正在使用一台老式的打字机,您希望键入一个3列的表格。各列应该在位置1、
15和25处对齐。在准备过程中,您分别在位置15和25处设置了两个小的机械标记,该
标记称为制表位(tab stop)
一旦完成这个之后,按下<Tab>将使托架水平移动到下一个制表位。例如,如果您在
位置8上,那么按<Tab>键托架将移动到位貿15。如果您在位置19上,那么按下<Tab>
键托架将移动到位置25。因此,以这种方式设置制表位可以方便地跳到位置15和25上,
而不必重复地按<Space>键(而且还不必在不小心按<Space>键太多次的情况下返回)。
现在就准备好输入表格了。首先,您在打字机中插入一张纸,并将托架定位到行的开
头。键入第一列的信息,然后按<Tab>键。这将使托架移动到位置15。键入第二列的信息,
然后再次按<Tab>键。现在托架将移动到位置25o然后再键入第三列的信息。现在就结束
了表格第一行的键入。向左推动托架返问控制杆,使托架移动到下一行的幵头,从而准备
好键入下一行信息。
尽管原始的Unix终端(参见第7章)并不是打字机,但是它们确实在纸张上打印信息,
并且在遇到制表符时可以水平跳跃。基于这一原因,Unix被设计为无论何时,当终端遇到
制表符时,它都像打字机一样将光标移动到当前行的下一个制表位,而且时至今日,情况
依然如此。Unix终端通过将光标移动到下一个制表位“显示”制表符。
默认情况下,Unix假定每隔8个字符(从位置1开始)有一个制表位。因此,默认Unix
的制表位是1、9、17、25、33等。当键入文本并按<Tab>键时,Unix就插入一个不可见的
制表符。以后,当查看文本时,终端将通过创建足够多的水平空格跳到下一个制表位来“显
示”制表符,就像打字机上的<Tab>键一样。
考虑下面的例子。您有一个一行的文件,该文件包含一个字母“A”、一个制表符、字
符串“BBBBB”、另一个制表符以及字符串“CCC”:
A<Tab>BBBBB<Tab>CCC
如果使用cat命令显示该文件,将看到:
A BBBBB CCC
其中A位于位置1上。BBBBB从位置9开始,而CCC从位置17开始。
当然,您看不到制表符:它们看上去就像真空区。因此,对于您的眼睛来说,字母之
间的空隙就像空格字符一样,而空格字符同样是不可见的。例如,在上面的例子中,当查
看cat命令的输出时,您无法辨别A 和在这个例子中)之间的真空区是1 个制表符
还是7个空格。
因此,这就出现了一个问题:当希望缩进文本或者按列对齐数据时,是使用制表符好
呢还是使用空格好呢?程序员已经对这个问题争论了很长一段时间,因为他们需要使用真
空区缩进控制流结构(if-then-else、while循环等)。
一些程序员倾向于使用制表符进行缩进,因为它们比较简单。例如,毎按一
键,它就插入一个制表符,从而自动地将文本缩进到下一个制表位。如果使用的是空格,
则需要按<Space>键多次,才能手工对齐文本。
另外,制表符也比空格灵活。例如,如果希望修改在屏幕上看到的缩进量,则只需在
文本编辑器程序中改变制表位设置,如果使用的是空格,则不得不遍历程序中的每一行,
增加或者删除实际空格字符。
其他程序员则坚持使用空格进行缩进。他们说制表符很笨拙,因为它们生成的空格数
量是变化的。他们指出,一个制表符可能表示1至8个空格,这取决于它在行中的位置。
而当使用空格时,使用的空格数量正好是键入的空格数量:键入4个空格,得到的就是4
个空格。
此外,尽管确实可以在大多数文本编辑器中调整制表位设置,但是大多数时间只能限
于使用默汄的制表位,即位置1、9、17、25等。这种间隔方式有时显得太多余,因为它创
建了大缩进,使文本难以阅读。通过使用真实的空格,可以按照自己的意愿任意缩进2、3
或者4个空格,完全满足自己的需要,而不管使用的是文本编辑器还是其他程序。
当然,生成水平间隔的需求不仅仅限于计算机程序。无论何时,当使用要求缩进或者
按列组织的任意类型的文本时,必须选择使用制表符还是空格。
我无法告诉您使用哪一个,因为每个人都有自己的喜好,认为某一种更适应自己。随
着时间的过去,您将会知道哪个选择更适合您自己。(就个人而言,相对于制表符,我更倾
向于使用空格)。我能够告诉您的就是,无论您最终选择了哪一种,有两个Unix程序可以
使生活更简单(expand和unexpand),稍后我们再对这两个程序展开讨论。但是,首先我
们需要讨论一个更基本的问题。

浙公网安备 33010602011771号