什么是 GNU?

作者:Arnold Robbins

本专栏简要介绍了 贝尔实验室的 Plan 9,这是一个由贝尔实验室最初的 Unix 团队开发的操作系统。我们将重点关注 Plan 9 的用户界面部分。这很有趣,因为主要组件要么可以从 AT&T 免费获得,要么已经在免费提供的软件中被克隆。文章将在下个月结束。

在 20 世纪 80 年代后期,贝尔实验室的研究小组开始觉得 Unix 作为研究工具已经走到了尽头。他们决定是时候重新开始了,吸取从 Unix 中学到的有益经验,并在此基础上继续前进。一个全新的操作系统被开发出来,名为 贝尔实验室的 Plan 9

结果记录在两组论文中。早期的论文讨论了 Plan 9 的总体设计、它的 shell、编译器和窗口系统。后期的论文包含关于该系统的其他论文以及该系统的完整参考手册。真正棒的是,所有这些的 PostScript 文件都通过匿名 ftp 提供(请参阅侧边栏)。参考手册非常庞大,超过 650 页;如果您有双面打印机,这将有助于打印。Plan 9 许可证持有者和其他对 Plan 9 感兴趣的人也可以使用邮件列表。

Plan 9 是一个分布式系统。它由三个组件组成:文件服务器,所有用户文件都存储在那里;CPU 服务器,执行计算密集型任务;以及终端,处理用户界面。计算和文件服务器是位于机房的大型机器。在贝尔实验室,它们通过高速光纤网络连接,尽管软件并不要求这样做。终端是小型计算机,配备鼠标、键盘、位图显示器以及与文件和计算服务器的网络连接。终端可能出于性能原因而配备本地磁盘驱动器,但它们用于缓存文件,并非绝对必要。

Plan 9 也是一个异构系统。该操作系统已被移植到 MIPS、Motorola 680x0、Intel 80386/486 和 Sun SPARC 架构。在贝尔实验室,他们倾向于使用 MIPS 系统作为服务器,而其他系统作为终端,但这同样没有内置到软件中。

Plan 9 在程序员可见的软件架构中也有许多不错的创新。作为一个简单的例子,在 Unix 中,有多个系统调用会影响文件的元信息(所有者、模式等),例如 chownchmodutime。在 Plan 9 中,只有一个 wstat,它写入关于文件的 stat 信息。再举一个例子,系统将所有用户和组名作为字符串返回,程序员永远不必管理数字用户 ID 和字符串之间的转换。Plan 9 在 Unix 设计上还有许多其他非常优雅的改进。

Plan 9 也是最早使用 Unicode(一种 16 位字符集)的系统之一。下面讨论的 sam9term 程序也支持 Unicode,例如,可以输入真正的笑脸字符,而不是通常的三字符 ASCII 字形。

(题外话,恕我直言。在许多方面,Plan 9 在设计上比 Unix 优越得多。对于那些对 Plan 9 的免费版本感兴趣的人来说,从 Linux 代码库开始,使用设备驱动程序、内存管理等等,将是值得的。Linux 本身现在是并将继续是一个 Unix 克隆,而 Unix 不是 Plan 9。当 Linux 2.0 发布时,从 Linux 开始将特别容易,因为它将像 Plan 9 一样是多平台的,或者我被告知是这样的。)

这应该会引起您的兴趣。早期和当前的 Plan 9 论文都非常值得一读。手册也很有趣,可以浏览一下。

Plan 9(不幸的是)通常不可用。大学可以从 AT&T 获得许可,无需任何费用(律师审查许可所花费的时间除外)。签署许可后,AT&T 会发送一份手册的纸质副本和一个 CD-ROM。当前的(截至 1994 年 12 月)版本已经将近两年了,系统已经有所发展。一个新的版本正在准备中,使用基于 PC 的硬件作为移植基础,但发布日期尚不清楚。AT&T 研究人员正在努力寻找更广泛发布它的方法,但这仍然需要某种许可;它不会像 Linux、NetBSD 或 FreeBSD 那样免费提供。

在本文中,我们将了解 Plan 9 编辑器、窗口系统和 shell。它们很重要,因为编辑器是免费提供的,并且其他编辑器也有免费提供的克隆版本。

sam 编辑器

Plan 9 编辑器名为 sam。(这里有一些历史。最初的 Unix 编辑器是 ed。它是命令驱动的。Rob Pike 为 Blit 终端编写了一个鼠标驱动的编辑器,名为 jimjim 的继任者是 sam,也是由 Rob Pike 编写的。基本上,它们都是一些友好、朴实的程序...... :-) (我被告知 sam 是 “samantha” 的缩写,并且是女性。)

sam 是一款多文件、多窗口编辑器,它优雅地结合了扩展正则表达式 (egrep 风格) 和强大的 ed 命令集,以及鼠标驱动的文本选择、剪切和粘贴。特别是,所有操作都作用于选定的文本,其中可以包括 多行。替换文本也可以包括换行符。

sam 还提供了无限的“撤销”功能,因此您不必担心犯错。

sam 为您提供的窗口之一是命令窗口,您可以在其中键入命令。很好的是,就像任何其他窗口中的文本一样,您可以编辑命令窗口中的文本,然后使用鼠标选择编辑后的行,并再次将其作为输入发送。换句话说,您可以编辑以前的命令并再次提交以执行。如果替换不起作用或没有完全达到您想要的效果,请撤销更改,编辑命令,然后重试。您可以根据需要多次执行此操作。或者,如果您曾经在一块文本上使用过一系列命令,并且需要再次执行该系列命令,请选择所有命令行,然后一次性全部发送。(命令窗口类似于 Emacs 中的迷你缓冲区。)

As an example, when replying to email, I'll often include the original letter, preceded with > signs. Sometimes I end up with text that has only part of a line, like this

> So what
> is your opinion about the future life of
> systems like MVS, VMS, VM, and Solaris?

I can select these lines as a single group, and then reformat it with the following commands

s/^> //g
|fmt
s/^/> /g

This removes the > signs, runs the text through fmt to make it look nice, and then adds the > signs back in. The result might be

> So what is your opinion about the future life of systems
>like MVS, VMS, VM, and Solaris?

(In fact, I was able to snarf the commands out of my article text, paste them into the command window, edit them a bit, and then submit them to make the new text above.)

命令语言特别强大,使用一种称为“结构化正则表达式”的表示法。本质上,正则表达式可以级联在一起,以选择越来越具体的文本块进行操作。以下是 sam 论文中的一个示例。假设您希望将变量 n 的所有出现都更改为现在称为 num。您可以使用以下命令

 , x/[A-Za-z_][A-Za-z_0-9]*/ g/n/ v/../ c/num/

逗号选择所有行(0 到 $,最后一行的缩写)。x 命令提取要操作的文本。它是一个迭代器,意味着对于文本的每个匹配项,都会执行其后的命令。sam 论文解释了命令的其余部分:“模式 [A-Za-z_][A-Za-z_0-9]* 匹配 C 标识符。接下来,g/n/ 选择包含 n 的那些。然后 v/../ 拒绝那些包含两个(或更多)字符的,最后 c/num/ 将其余部分(标识符 n)更改为 num。” gv 命令是条件语句。g 表示仅当模式匹配时才执行命令;v 则相反——仅当模式不匹配时才执行命令。

简单的更改通常使用鼠标进行。但是对于复杂的、大范围的更改,像 sam 中的命令语言是必不可少的。事实上,这就是为什么 vied 命令集作为子集包含在内的原因。

如前所述,sam 是一款多文件编辑器。您可以同时在窗口中打开多个文件,并在同一文件上打开多个窗口。当从一个文件转到另一个文件时,这对于剪切和粘贴操作特别有用。命令语言还提供了对包含或不包含特定正则表达式的所有文件执行操作的命令。

总结一下我为什么觉得 sam 吸引人

  1. 它是多文件和多窗口的。

  2. 它有一个强大的命令语言,使许多编辑操作变得容易。

  3. 可以编辑您的命令。

最后这一点特别有用;它是那种一旦拥有就难以置信你曾经没有它的东西。

sam 是在两个库之上实现的。libframe 库提供文本窗口(框架)。该库又在 libg(一个图形库)之上实现。对于 Unix,Plan 9 的 samlibframe 代码基本上没有更改地在 libXg(libg 的 X 窗口实现,使用 Xt 工具包)之上使用。所有这些软件都支持 Unicode。例如,可以通过键入 ALT-1-2 来输入 1/2 符号。

有关 samftp 位置,请参阅侧边栏;AT&T 非常慷慨地免费提供它,无需任何许可方面的担忧。还有一个 sam 用户邮件列表。

邮件列表存档包括一个用于 Emacs 的 sam 模拟器,由 Rick Sladkey 编写 (jrs@world.std.com)。

9term 终端模拟器

Plan 9 窗口系统称为 81/2,因为它是 Rob Pike 编写的第八个半窗口系统。要创建一个新窗口,您可以从右键菜单中选择 New,然后扫出您想要的窗口。然后该窗口运行一个 shell (rc,在下面讨论)。

81/2 窗口的与众不同之处在于,您可以直接在窗口中编辑文本。因此,如果您在命令中输入错误,您可以修复错误,选择整行,然后重新提交。这使得不再需要像当前的 Unix shell(如 kshbashtcsh)中内置的命令历史记录。

此外,窗口还提供更复杂的文本编辑功能。通过按 ESCAPE 键,窗口进入“保持模式”。所有文本都保留在窗口中。在再次按下 ESCAPE 键离开保持模式之前,它不会发送到窗口中运行的程序。保持模式通过窗口内部的额外白色边框和鼠标光标的更大白色箭头来指示。

例如,您可以在给某人发送邮件时使用此功能。运行 Mail 命令,然后进入保持模式。尽情键入、编辑和重新排列您的信件。然后离开保持模式,您的邮件就会发送到 Mail 程序。

最后,默认情况下,81/2 窗口 滚动。相反,文本只是在它们内部缓冲,直到您准备好查看它。键盘上的向下箭头键允许您快速浏览缓冲的文本。您可以使用按钮 2 菜单来更改窗口的行为,使其滚动。非滚动模式是一个功能;它消除了对 morepgless 等分页程序的需求。

模拟 81/2 窗口的 Unix 程序称为 9term9term 由澳大利亚悉尼大学的 Matty Farrow 编写。它在 libframelibXg 之上添加了一个额外的库 libtext9term 既小又快。在 Sun SPARCstation LX 上,9term 几乎立即启动,而 xterm 可能需要几秒钟才能启动,明显更长。

除了上面描述的保持模式之外,9term 还提供剪切和粘贴编辑以及在窗口中向后或向前搜索特定文本片段(无论当前选择什么)的功能。9term 还使用向上箭头键允许您在窗口中向后移动,这在 81/2 中必须使用鼠标完成。

9term 界面有意与 sam 相似。在两个程序中,按钮 1 选择文本,按钮 2 提供编辑菜单,按钮 3 提供控制菜单。在行尾双击按钮 1 选择整行,在单词中间双击选择单词。最后,在两个程序中,菜单都“记住”上次发出的命令。因此,下次您调出菜单时,默认操作是执行您上次所做的操作,这通常是您想要做的。

拥有相同的界面使使用您的系统变得更加容易;当从一个窗口移动到另一个窗口时,您不必在心理上“切换档位”:您的鼠标和键盘的工作方式相同,无论如何。

9term 速度很快,因为它很简单。与 xterm 不同,它没有模拟真实的终端(或两个或三个),试图解释和处理转义序列。这意味着,例如,您不能在 9term 窗口中运行 viemacs。另一方面,您为什么要这样做呢?samvi 功能强大得多,并且比 Emacs 更容易学习。我的目的不是发起又一场宗教编辑器战争。相反,理念是 9term 不必很复杂即可支持屏幕编辑器,因为已经有一个强大的编辑器 sam 可用。

9term 发行版的同一目录中,有一个 tar 文件,其中包含大量用于 X 的 Unicode 字体。我特别喜欢 pelm.latin1.9 字体。

侧边栏 描述了在哪里可以获取 9term 和 Unicode 字体。

在下个月的结论中,我们将讨论在 9term 中运行的 shell,以及完成 81/2 模拟的 9wm 窗口管理器。

Arnold Robbins (arnold@gnu.ai.mit.edu) 是一位专业程序员和半专业作家。自 1987 年以来,他一直在为 GNU 项目做志愿者工作,自 1981 年以来一直从事 Unix 和类 Unix 系统的工作。

加载 Disqus 评论