充分利用 Andrew
在之前的文章中,我主要关注了 ez 编辑器和多媒体用户邮件代理 messages,但这仅仅是丰富应用程序集中的两个。这里还有一些您会觉得有用的应用程序
bush(见图 1)为文件系统提供了一个图形界面。它显示目录层次结构、文件名及其属性。它还提供一个窗口,ez 编辑器将在其中运行,以及一种在文件上调用任意命令的方法。使用 bush,您还可以对列表进行排序、重命名和删除文件。
chart 允许您从数字数据创建简单的图表。数据可以以直方图、饼图或折线图的形式呈现。
ezdiff 实际上不是一个应用程序,而是一个您可以从所有 ez 窗口调用的过程。它用于在两个窗口中的数据上运行 diff 命令,然后交互式地查看文件之间的差异。
要尝试 ezdiff,请编辑两个文件(例如,ez/etc/hosts .deny/etc/hosts.equiv)。在每个窗口中,选择 Ezdiff 菜单卡上的 Start 项。当您选择 Ezdiff 菜单卡上的 Next 项时,每个文件中的差异将以高亮显示的数据形式显示。这使得在一个窗口中选择行并将它们粘贴到另一个窗口中变得非常容易。是的,当您更改任一文档时,ez 会正确记住所有其他差异的位置。这在查看文件的不同版本时是一个救命稻草。
figure(见图 2)是一个相当传统的绘图编辑器。文件通常具有 .fi 扩展名。Figure 可以创建包含线条、圆形、框和其他插入对象(例如,光栅或文本)的文档,然后移动它们、调整形状等。由于 figure 创建 ATK 数据流,您可以轻松地将图形插入到其他 AUIS 文档中。

图 2. 示例 AUIS 图形
pipescript(见图 3)从 stdin 读取数据并在窗口中显示。这对于管道非常方便,因为输出数据不会干扰您的 xterm 窗口,并且又不在您需要删除的文件中。可以方便地滚动、搜索或保存数据。我一直将其用于诸如 tar tzvf auis63L1-wp.tgz | pipescript 之类的命令。
raster 提供了一种编辑数字化图片(称为光栅)的简单方法。数据必须是 AUIS 数据流格式。pbmplus 包(在 sunsite 上可用)提供了一组广泛的过滤器,用于在各种形式的数字化数据之间进行转换。例如,要从 TIFF 转换为 AUIS 光栅,我将使用此命令
tifftopnm test.tif | ppmquant 256 | ppmtopgm\ | pgmtopbm | pbmtocmuwm > test.ras
typescript(见图 4)提供了一种 xterm 的替代方案。您在输入窗口中输入 shell 命令,结果会显示在同一窗口中,您可以在其中滚动、搜索或保存结果。Typescript 不支持像 xterm 那样的 curses,因此您无法在 typescript 中运行 vi 或 bash 等。但是,您可以使用 tcsh 或 pdksh (ksh) shell。
Typescript 还有其他几个我发现非常有用的功能。文字处理包的 README 描述了如何使当前工作目录保存在 typescript 窗口的标题中。Typescript 对这些路径也很“智能”。请注意图 4 中窗口标题中显示的路径是“~”,我的主目录,而不是完全限定的路径。
Typescript 支持使用多个 PC 键来简化命令输入。Cursor-Left 和 Cursor-Right 键可用于编辑当前命令(无论我的 shell 是否支持此功能)。Home 和 End 键会将光标移动到行(或选定区域)的开头或结尾。光标键也被映射为允许我在命令历史记录中上下移动。Cursor-Up 获取上一个输入的命令,Cursor-Down 获取下一个命令。
在我看来,更实用的功能是命令完成。如果我输入 ls 然后按 Cursor-Up,我会得到以上一个以“ls”开头的命令。Tab 键支持文件完成。如果我输入 ls src/tp 然后按 Tab 键,typescript 将把路径“src/tp”补全为 “src/tpg-config”(在我的情况下)。这使得输入文件路径变得容易十倍。我喜欢它!
如果我输入诸如 ls /etc 之类的命令,窗口很可能会自动填充和滚动。如果我想查看滚动数据的开头,我必须使用鼠标(或 Page-Up/Down 键)滚动。但是,如果我输入 ls /etc control-J(我使用 control-J 组合键而不是普通的 Enter 键输入命令),则命令将被执行,但输出将被推送到当前窗口的顶部,这样我就不需要滚动。
Typescript 还允许我在文件 ~/.shmenu 中创建自己的菜单。在图 4 中,您可以看到我在菜单栏上有一个 Internet 菜单卡。这来自我自己的 .shmenu 文件,该文件如下所示
# User's .shmenu file # Do help .shmenu for more information. # Establish the pop up menus for the # typescript window. Internet~20,FTP<->Sunsite export~15:ftp sunsite.unc.edu Internet~20,FTP<->CMU~16:ftp.andrew.cmu.edu Internet~20,FTP_Anonymous~20:anonymous Internet~20,FTP_Ident~21:tpg@mr.net Internet~20,FTP_bin~22:bin Internet~20,FTP_submissions~23:cd pub/next/submissions Internet~20,Telnet->CMU~31:telnet ftp.andrew.cmu.edu Internet~20,Bring Slip Up~40:/usr/local/bin/slipup Internet~20,Take Slip Down~41:/usr/local/bin/slipdown
所有 AUIS 应用程序都提供一种使用过滤器来修改选定区域的方法。Misc 菜单卡提供了将数据折叠为小写、大写或将数据“流”在一起的项目。要使用过滤器,只需选择一个区域(使其突出显示)并选择正确的项目。还有一个项目(Filter Prompt),允许您指定自己的过滤器。例如,指定过滤器 sort 将导致选定的文本被排序——就像您在传统的 Unix 管道中一样。
您可以使用自己的 ~/preferences 文件来定制 AUIS 应用程序的行为和外观。每次应用程序启动时,它都会检查您在 preferences 文件中指定的一组资源。preferences 文件中的资源与其他 X 资源类似。/usr/andrew/sample.preference 中提供了一个示例 preferences 文件。如果您编辑此文件,您会发现如下行
Messages.Geometry: 750x600 Figure.BackgroundColor: White *.BackgroundColor: LightSkyBlue4
第一个字段(例如,Messages、Figure 或“*”)是应用程序名称。星号表示它适用于所有 AUIS 应用程序。AUIS 资源名称不区分大小写,因此“Messages”与“messages”相同。第二个字段特定于应用程序。其中大多数,如“Geometry”或“BackgroundColor”,将非常明显。其他的,如“XStyleSelections”,除非您阅读首选项帮助文件(auishelp preferences),否则将是一个谜。其中一些资源特定于单个应用程序,而另一些资源适用于所有 AUIS 应用程序。
第三个字段(在冒号之后)是资源的值,并且直接与第二个字段相关联。这些资源可能相当令人困惑。为了更容易理解可以为哪些应用程序设置哪些资源,编写了一个专门的首选项编辑器 prefed。正如您在图 5 中看到的那样,prefed 窗口分为四个区域。您在左上角的窗口中选择应用程序名称(在本例中为“EZ”)。右上角的窗口具有资源名称列表(“OverwriteFiles”)。中间的窗口显示您当前的设置,并允许您更改它。最后,底部的窗口提供了对资源控制内容的描述。当您选择 Save 项时,您的 preferences 文件将被修改,就像您对任何编辑器所期望的那样。prefed 的添加使得弄清楚这个令人眼花缭乱的资源名称阵列变得容易得多。当应用程序初始化时,它会搜索适用于该应用程序的所有资源。资源按照读取顺序应用。搜索顺序首先是 ~/preferences,然后在机器范围的“preferences”文件 /usr/andrew/lib/global.prf 中。因此,如果您指定任何适用于所有应用程序的资源(例如,*.BackgroundColor),则这些资源应位于您的 preferences 文件的底部。这与传统 X 应用程序的资源略有不同。
需要记住的一件事是,preferences 仅在应用程序初始化时读取。例如,如果您更改 ez BackgroundColor,则这将不会生效,直到您从命令行(从 xterm 或 typescript)启动新的 ez。
Messages,多媒体邮件用户代理,在首选项处理方面是独一无二的。由于 messages 有大量的首选项资源,因此很久以前,messages 的作者添加了自己的专门方式来设置 messages 的首选项,方法是在 Other 菜单卡上选择 Set Options 项。
打印是一个似乎每个人都需要“有自己的方式”的领域。AUIS 打印涉及两个步骤。应用程序生成 groff 数据,第一步是格式化此数据以生成特定于打印机的数据流。第二步只是将数据流传递到打印机。这两个步骤可以使用您的 preferences 覆盖。默认首选项设置是
*.FormatCommand: /usr/andrew/etc/atkprint /tmp/%s.n | *.PrintCommand: lpr -P$PRINTER
这两个命令在管道中连接(因此在 FormatCommand 的末尾有管道字符“|”)。构建此命令时,%s 将更改为 groff 输入文件的名称。
许多 AUIS 应用程序实际上生成 PostScript 数据,只是在 PostScript 周围有一个简单的 groff “包装器”。在下一个主要版本中,AUIS 将直接生成 PostScript,并且将不再需要 FormatCommand。但就目前而言,如果您遇到困难,您可能需要复制 /usr/andrew/etc/atkprint 并制作您自己的版本,您可以修改该版本以满足您的需求。然后,您可以指定自己的 FormatCommand 资源来调用您自己的 atkprint 版本。
有时我想捕获 groff 输入,所以我只需快速更改 preferences
*.FormatCommand: cat /tmp/%s.n > /tmp/test.n
将输入文件复制到 /tmp/test.n。然后我可以手动执行打印序列
/tmp/atkprint /tmp/test.n | pipescript
这样我就可以准确地看到 shell 脚本中发生了什么。另一方面,如果我只想捕获 PostScript,我可以将 preferences 更改为
*.PrintCommand: cat > /tmp/test.ps
显然有很多方法可以完成这两个步骤中的任何一个。要记住的关键是,AUIS 打印是完全外部化的。您可以根据需要对其进行任意程度的控制。
在启动时,AUIS 应用程序会查找几个初始化文件。这些文件分为两类,全局或机器范围的文件位于 /usr/andrew/lib 中,个人文件位于您的主目录中。每个应用程序都可以有自己的初始化文件。例如,ez 将按以下顺序检查文件
~/.ezinit /usr/andrew/lib/global.ezinit ~/.atkinit /usr/andrew/lib/global.atkinit
如果找到 .ezinit 文件,则不会读取 global.ezinit。同样,如果找到 .atkinit,则不会读取 global.atkinit 文件。这种排序意味着当您创建初始化文件时,您应该通过使用“include”语句使其引用它所屏蔽的文件。因此,如果您要创建 .ezinit 文件,您将需要包含 global.ezinit,方法是
include /usr/andrew/lib/global.ezinit include $HOME/.atkinit
您的 ~/.atkinit 可能应该包含 /usr/andrew/lib/global.atkinit。
如果您不包含全局文件,您将不会获得重要的默认设置。但请注意,并非所有程序都有全局初始化文件。当定义多次时,最后一个定义保持有效。
虽然我在此示例中使用了 ez,但这对于 typescript 或任何其他 AUIS 应用程序都完全相同。Typescript 将读取 ~/.typescriptinit,或者如果该文件不存在,则它将读取 /usr/andrew/lib/global.typescriptinit。所有应用程序都会查找 ~/.atkinit 和 /usr/andrew/lib/global.atkinit。使用命令 auishelp initfiles 可以更详细地描述这些文件。
在 AUIS 应用程序中,菜单只是调用对象的过程(方法)的一种手段。AUIS 定义了数百个这样的过程,它们提供了巨大的功能。要定义菜单,请编辑先前描述的初始化文件之一(个人初始化文件可能是最佳选择),并添加如下行
addmenu filter-filter-region-thru-command "Misc,Flow~20" textview \ filter inherit "flowtogether" addmenu textview-lowercase-word "Misc,Lower~21" textview addmenu textview-uppercase-word "Misc,Upper~22" textview addmenu filter-filter-region "Misc,Filter Prompt~25" textview
显示的条目将诸如 Flow 和 Lower 之类的项目添加到 Misc 菜单卡。这些项目的顺序由数字(20、21 等)确定。当您选择诸如 Lower 之类的项目时,将调用过程 textview-lowercase-word,并且选定的区域将折叠为小写。
了解过程名称对于创建菜单卡非常重要。没有 AUIS 中所有过程的固定列表,因为 AUIS 对象是动态加载的。为了帮助您找到可用的内容,请在 Misc 菜单卡上选择 Describe Proc Table。Misc 菜单卡将打开一个窗口,其中显示所有过程的列表以及每个过程用途的简短描述。
当选择 Flow 项时,调用过程 filter-filter-region-thru-command 时,会显示一个更复杂的示例。在这种情况下,过程调用过滤器 flowtogether。Flowtogether 是一个简单的过滤器,它将行组合在一起以删除多余的空格并在段落中创建数据。当我想引用一些邮件的一部分并使其看起来更好时,我在 messages 中使用此过滤器。
您在 Linux 发行版中看到的大多数菜单都是使用各种初始化文件中的 addmenu 添加的。您可以通过在您的私有初始化文件中添加 addmenu 命令来添加您自己的菜单卡。有关添加菜单卡的更多详细信息,请使用命令 auishelp initfiles。
如果我发出命令 ez test.d,则此文件中的数据将是 AUIS 文本文档,但是如果我编辑文件 test.document,它将只是简单的 ASCII 数据。区别显然与文件的扩展名有关。像所有传统的 Unix 系统一样,Linux 实际上并没有“知道”文件中包含什么内容的内在“知识”,但是我们都对文件 test.c 中包含的内容有所期望。这只是一个约定问题。AUIS 有自己的约定,这些约定在文件 /usr/andrew/lib/global.filetypes 中控制,该文件具有如下条目
addfiletype .Xdefaults rawtext "template=rawtext" addfiletype .c ctext "template=c" addfiletype .h ctext "template=h" addfiletype .d text "template=default" addfiletype .doc text "template=default" addfiletype .help text "template=help"
Addfiletype 命令允许您将扩展名映射到插入对象类型,以便您使用特定扩展名创建的新文档将获得“template=”关键字指定的正确插入对象类型。
编辑 .Xdefaults 将具有模板 rawtext(这将确保复制 AUIS 数据流会产生一个简单的 ASCII 字符串,而不是一些粗体文本),而编辑 .Xdefaults.old 会导致 default 模板(允许您复制并保留 bold 文本),这可能不是您想要的。当前的 AUIS 发行版不允许您在 addfiletype 命令中使用通配符,因此您必须显式映射 .Xdefaults 和 .Xdefaults.old。有关文件类型的更多详细信息,请使用命令 auishelp initfiles。
在 AUIS 应用程序中,按键组合是另一种调用对象的过程的方法。与菜单项一样,相同的过程可用于键绑定。要定义一组键绑定,请编辑先前描述的初始化文件之一,并添加如下行
addkey compile-build ^X^E srctextview compile addkey compile-next-error ^X^N srctextview compile addkey compile-previous-error ^X^P srctextview compile addkey fcomp-complete-command-forward \eB typescript fcomp inherit addkey fcomp-complete-filename ^I typescript addkey fcomp-possible-completions \e^I typescript
示例的第一行表示,当您处于 srctextview 插入对象中(例如,编辑 C 源代码)时,当您按下组合键 <control>X,然后按下 <control>E 时,将调用过程名称 compile-build。(第四行中的 \eB 表示您应该按 Esc 键,然后按 <shift>b。)您可以通过在 Misc 菜单卡上选择 Describe Bound Keys 项来查看动态创建的绑定到过程的所有键的列表。您还可以通过在 Misc 菜单卡上选择 Describe Key 项来查询将为任何按键调用的过程。
Terry Gliedt (tpg@mr.net) 去年离开了 Big Blue,此前他在 IBM 工作了 20 多年。虽然他使用 Un*x 和 AUIS 已经六年多了,但他对 Linux 来说还是一个相对的新手。Terry 从事合同编程,教授 C/C++ 和 Unix 课程,并撰写一些技术文档。