第10章 使用X的应用程式
本章将介绍一些包含在 core 版本内的公用程式, 它们的主要功能和视窗系统并无密切关系, 但使用它们却可提供一个相当不错的使用者介面 :
. Xedit - 一个以视窗为基础的 (window-based) 一般目的文字编辑器.
. Xman - 一个指南页 (manpage) 或系统文件的浏览工具.
. Xmh - 一个 mh 邮件处理程式的视窗前端 (front-end) .
10.1 文字编辑器 - Xedit
Xedit 是一个非常简单而具有视窗介面的文字编辑器. 藉著对 Xedit 所显示的选择盒碰触按钮, 你可以完成某些操作, 但透过使用键盘你可以执行的更多, 特别是控制字元. 在这个程式内大多数以键盘为基础的功能由一个标准软体片段提供 -- 假如你喜欢也可以视为一个建筑区块 "building block" -- 叫做一个文字小工具 (text widget). (有关小工具 (Widget) 在 "资源 (Resources)" 那一章 (第15章)中我们将谈得更多). 因为这是一个很普通的结构, 且你将在其他地方遇到相同的编辑功能, 我们在随後的几节将详细描述它的功能.
10.1.1 启动与结束程式
假如你想编辑一个名叫 foobar的 档案, 在 xterm 视窗键入命令 :
xedit foobar &
(假如你不想编辑已存在的档案, 只要键入 "xedit &")
xedit 启动与显示它的视窗, 如图 10 - 1 :
┌————————————————┐
│ p108 fig 10 - 1 │
│ │
│ │
│ 图 10 - 1 xedit 文字编辑器 │
└————————————————┘
视窗被分成三部分 :
. 上面是命令选单, 具有标著 Quit, Save 等的命令盒.
. 中间部分是讯息视窗, xedit 在里面显示错误讯息与状态, 你也能把它当作一个抓取区 (scratch area) 来使用, 可在里面键入一段你想剪贴到其他地方的文字.
. 下面较大的部分是编辑视窗, 它显示你正在编辑或建立的本文.
当你想结束程式时, 在 Quit 盒上碰触左按钮, 假如你做了一些改变但未储存, 则 xedit会在讯息视窗内印出警告讯息 :
Unsaved changes. Save them, or press Quit again.
10.1.2 插入文字
首先确定指标在编辑视窗内, 然後键入你要的文字 (键盘上任意的列印字元),在你键入时,被直接地插入. 当你键入时, 你将会注意到新插入的文字是不断地推送一个在它前面的一个小脱字符 (^) 游标 : 这个游标是插入点(insertion point) 或简称为点 (point). 任何你键入的或贴入(paste-in)的文字都将在这个点的位置被插入. 插入点总是位於两个字元间, 而不在一个
字元上面 (就像一个正常终端机游标的状况).
自动 "列卷绕" (Line-Wrapping) -- xedit 的 "段落" (paragraphs)
当你在接近一列的尾端插入文字, 假如你键入的字太长以致无法适合目前这一列时, xedit 将自动移至下一列. 假如接著剪短该字使得可以适合它原来的列,它将再跳回上一列.
这个作用与 xedit 的段落定义息息相关 : 一个段落是被新列字元(newline character)终结的本文. (实际上它意味著连续键入文字而无需插入新列字元) edit 列卷绕仅作用於一个段落内, 且能正确地处理特殊状况, 例如 : 在移动一个单字 (word)到这列时造成这列必须卷绕到下一列的状况等等.
注意 1 : 这个段落的定义实际上就是被各种其他 Unix 程式视为一列的定义, 若你使用 xedit 编辑一个正常的档案, xedit会将读入的每一列视为一个段落处理.
注意 2 : 显示器没有明显的标示出萤幕上的一列在尾端有一个新列字元 (无法凭肉眼直接辨识) , 亦即xedit 可能视它为一个列尾或一个段落.
注意 3 : 以 xedit 产生的档案, 若用其他程式查看内容时, 可能看到具有非常长的一列.
译注:这种方式类似於 PC 上的 Wordstar 文书编辑器。
特殊插入操作
下面有一些插入新列的特殊命令, 各种命令稍为有些不同:
插入一个新列, 且插入点移至新列 : 按 RETURN. 便可以插入一个新列, 事实上就像插入任何列印字元一样. 且假如你不靠 xedit 的列卷绕, 这是移至新列的正常方法.
插入新列, 且对齐 : 按 LINEFEED键插入一新列并移动插入点到下一列,但任何你键入的列印文字将与上一列的文字对齐. (对键入表格等很有用).
插入一新列, 但不移动插入点 : 按 ctl-O. 可以插入一个新列, 但点仍留在同一列. (当你想分开一列并加文字到被分成二列中的第一列尾端时使用)
10.1.3 剪 (cutting) 与贴 (pasting)
就像在 xterm 中一样的, 你可以选择并 "剪" 出一段文字, 但是有一个讨厌的差异 : 当选择字或列时, 你必须迅速碰触二次或三次按钮 - 你不能在按钮按下或松开时暂停.
在插入点的地方贴入文字时, 你可以像以前一样的碰触中间按钮, 或按meta-Y键.
10.1.4 移动插入点
移动插入点最简单的方法是使用滑鼠 : 移动视窗文字游标 (在图 5 - 2所看到的垂直棒)到任何你想要的地方, 并碰触滑鼠左按钮. 插入点的 ^ 标志即跳到新位置.
但通常使用键盘移动插入点也很简单 - 当你正在编辑时, 它会打断你的节奏, 因为必须拿起滑鼠, 移动它, 最後再次将你的手移回键盘. xedit 提供一次移动一个字元、单字、列或页的方式移动插入点 :
一次一字元移动插入点
这是移动点的最基本型式 :
向前一个字元 : 按 ctl-f 或 RIGHTARROW
向後一个字元 : 按 ctl-b 或 LEFTARROW
向上一个字元 : 按 ctl-p 或 UPARROW
向下一个字元 : 按 ctl-n 或 DOWNARROW
假如你接近一列的开头, 按几次 ctl-b 後,你将回到前一列. 按几次ctrl-f 後可回复至原位. 假如你是在一页的最上面 (最下面) 一列, 类似的效果会发生 : 移至前 (或下)一列, 将引起文字卷动使你移至的列能被看得见.
一次移动一个单字、一列或一个段落
这些是编辑文字时所须的自然移动功能.
向前一个单字 : 按 meta-F 或 meta-f
向後一个单字 : 按 meta-B 或 meta-b
移至列尾 : 按 ctl-E
移到列的开头 : 按 ctl-A
向前一个段落 : 按 meta-]
向後一个段落 : 按 meta-[
你可以看到一个规律开始浮现 : ctl-char 对单一字元操作. 而 meta-char对单字作相同的事. e.g. ctl-F 向前一个字元, meta-F 向前一个字.
大量移动 - 以页与档案为单位
假如你想获得较大的跳越, 就像在 xterm 里面一样, 你可以使用卷动棒. 然而, 卷动文字并不会移动插入点 : 当你键入或清除任何内容时, 文字将自动地卷回插入点, 让你可以看到你作了甚麽.
如果你想卷动显示内容且移动插入点, 使用 :
往前一页 : 按 ctl-V
往後一页 : 按 meta-V
到档案的开头 : 按 meta->
到档案的尾端 : 按 meta-<
10.1.5 移除不想要的文字 - 删除 (Deleting) 或 杀掉 (Killing)
有两种移除文字的技巧 - 删除只将文字移除, 杀掉则除了移除文字外,并将文字储存至 "剪缓冲区" (cut buffer), 以便稍後你可以取回. 杀掉命令仅对较大单位的文字作用 (最小单位为单字) - 因为假如你删除一个字元, 它就像没有杀掉它一样很容易再打入.
在下面的叙述, "下一个" (next) 意思是正好在插入点之後, "前一个"(previous) 意思是正好在插入点之前.
删除文字
删除前一个字元 : 按 DELETE 或 BACKSPACE 或 CTL-H.
删除下一个字元 : 按 CTL-D.
删除下一个单字 : 按 meta-d.
删除前一个单字 : 按 meta-h, 或 meta-DELETE 或 meta-BACKSPACE,不用 SHIFT 键.
注意 : meta-h 与 meta-H 不同.
假如你在一列的开头按下 DELETE 键, 它将删除前一列的尾端的新列字元, 而将两列合并成一列.
杀掉文字
杀掉下一个单字 : 按 meta-D
杀掉前一个单字 : 按 meta-H 或 shift-meta-DELETE shift-meta-BACKSPACE.
从游标位置杀到列尾 : 按 ctl-K
从游标位置杀到段尾 : 按 meta-k
杀掉目前选定的文字区块 : 按 ctl-W
救回杀掉的文字; 拷贝与移动文字
只要你曾经 kill 某些文字, 你就能按 ctl-Y 救回它, 最近被杀掉的文字在插入点的地方被插入. 但有几点须注意 :
. 只有最近被杀掉的文字可以被救回 - 你无法将一连串被杀掉的文字取回.
. 救回的文字是被插入到目前插入点的位置 - 不是该段文字原先被移除的地方.
. 若是需要的话你可以救回相同的文字许多次, 亦即按 ctrl-Y 并不影响缓冲区之内容.
基於"杀掉"动作的原理, 你可以用它来移动或拷贝文字区域.
移动文字 : 先 kill 它, 再将点移动到你想重新放置的地方, 最後un-kill.
拷贝文字 : 先 kill 它并 un-kill 它, 使拷贝的来源不变; 再将点移动到你想拷贝的地方, 最後 un-kill.
10.1.6 取消改变 (Undoing Changes)
假如你作了某些改变 - 杀掉或删除或键入或贴入文字 - 但稍後发现并不是想要的, 你可以复旧 (undo) 它. 在 undo 盒里碰触左键 : 取消最近的改变. undo本身也是一个改变, 所以假如你再次碰触 undo, 它将取消前一个 undo的作用; 你可以永远地像这样一直切换下去.
undo 仅对最近的改变有作用. 假如你想更往回追溯, 你可以利用 more 盒连续地 undo 更前面的改变.
10.1.7 使用档案
前面曾提到在启动程式时你可以指定欲编辑的档案,事实上当程式执行时, 你也能抓取档案. 为达到这个目的你将会使用介於 load 与 undo间的文字盒,我们称为"档名盒".
储存文字到一个档案 : 在 save 盒上碰触左按钮; xedit 会将编辑视窗内的文字存到档名为档名盒内档名的档案; 若没有名称, xedit会在讯息窗内发出
save : no filename specified -- noting saved
因此在你再次在 save 上碰触左按钮之前你必须将指标移到档名盒并键入档名. 当它已经储存好档案 xedit 会发出确认讯息.
编辑一个不同档案 : 在档名盒键入档名, 并在 load 上碰触左按钮. 若它无法取用档案, xedit 会发出错误讯息.
插入一个档案到目前的本文 : 按下 meta-I : xedit 突现一个小视窗(图 10 - 2). 在上端的文字盒, 键入你想插入的档名, 并在 DoIt上碰触左按钮. 该档案的内容即插入目前的插入点位置.
┌——————————————————┐
│ p113 fig 10 - 2 │
│ │
│ │
│ 图 10 - 2 xedit 的插入档案选择视窗 │
└——————————————————┘
注 : 当你在档名盒内键入文字时, 且文字盒在 "插入档案" (INSERT FILE)视窗, 你可以使用我们曾经描述过的所有键盘基础命令. 事实上, 你不仅能打字, 也可以剪贴它们.
注意 : 当你键入档名时, 不须用 RETURN 结尾 - xedit 会将 RETURN 视为档名的一部分, 而造成混淆.
10.1.8 搜寻指定的文字字串
假如你想找出一个指定字串在你编辑本文中出现的地方 :
1. 在我们称为搜寻字串盒 (searchstring box)的里面, 键入字串於Search >> 的右方.
2. 在 Search >> 上碰触左按钮 : 插入点便会移至本文中下一个出现该字串的地方.
搜寻是由插入点开始,并且 xedit 预设的搜寻方向是向前, 而不往後搜寻. 假如你要从插入点往回搜寻, 你可以在 << 上碰触左按钮.
注意 : 当搜寻字串盒内没有文字时, 假如你在 Search >> 或 << 上碰触按钮,xedit 会将最近在你机器上被任何应用程式所选择的文字区块的片段拷贝到盒内, 并搜寻它. 假如你不预期会如此, 你可能会感到非常惊讶.
10.1.9 取代一个字串为另一个
假如你想将出现许多次的一个字串 (旧) 置换成为另一个字串 (新) :
1. 先搜寻出本文中第一次出现欲取代字串的地方, 如前一小节所诉述.
2. 在 all 盒右方的取代字串盒内键入新字串.
3. 在 replace 上碰触左按钮 : 旧字串即被取代成新字串, 且插入点移到下一个出现旧字串的地方.
4. 假如你也要取代它, 再次在 replace 上碰触, 否则 ...
5. ... 假如你不想取代这个, 但想改变它後面的, 在 search >> 上碰触按钮直到你要改变的地方, 即可以再次取代它.
在你往回移动档案时你无法执行取代, 换言之你无法用简单的方法取代在插入点之前的字串.
注意 : 假如你目前不在旧字串出现的位置而你试图取代, xedit 会发出下列
讯息 :
ReplaceOne : nothing replaced
但是 replace 本身会完成一个搜寻, 所以你可以继续在 replace 上碰触按钮, 再次执行代换.
取代每个出现的字串
假如你想将出现的每个旧字串取代成新字串, 在 all 上碰触按钮.
注意 : 使用 all 时所有出现的旧字串均会被取代, 不只是从点往前而已, 而是整个档案.
10.1.10 杂项功能
重绘本文显示 : 使用时机例如当视窗内变得混杂扭曲, 按 ctrl-L
向前卷动一列 : 按 ctrl-Z
往回卷动一列 : 按 meta-Z
跳至指定的行数 : 在讯息视窗内, 键入你要跳往的行数, 用滑鼠选择你正在打的本文, 并在 jump 上碰触左按钮, 插入点便会跳至指定列的开头. (假如在萤幕上有应用程式的文字片段含有你要指定的列数数字, 你可以利用它 - 而不必依赖 xedit 编辑讯息视窗)
到此我们已经完成对 xedit 的描述, 下一节将转移到另一个应用程式,我们将会看到类似的使用者操作介面.
10.2 读取指南页 (Manual Pages) - xman
xman 让你浏览系统上的 Unix 指南页, 从一系列选单中选出你要的项目.
欲启动程式时,在一个 xterm 视窗中键入命令 "xman &" : xman 启动并显示它的主功能选择项视窗, 如图 10 - 3. 下面的小节将详细描述这些选择项.
┌—————————————————┐
│ p115 fig 10 - 3 │
│ │
│ │
│ 图 10 - 3 xman 的主选择项视窗 │
└—————————————————┘
10.2.1 xman 本身的线上求助 (on-line help) 功能
xman 有它自己的内建求助选择项. 欲使用它, 在选择视窗内的 help 上碰触按钮.xman 产生一个 "Xman Help" 视窗, 如图 10 - 4. 你可以使用卷动棒与滑鼠卷动求助本文. 在求助本文视窗内操作方式如下:
向前移动本文 : 按 f, 或碰触左按钮, 即向前移动一页.
往回移动本文 : 按 b, 或碰触右按钮, 即往回移动一页.
┌—————————————————┐
│ p116 fig 10 - 4 │
│ │
│ │
│ 图 10 - 4 xman 求助视窗 │
└—————————————————┘
注意 : 按 b, 或碰触右按钮, 可能无法正确地往回移动一页.
求助视窗内的其他选择项
移动指标到求助视窗上端的边缘时. 图 10 - 5 的选单突现出来. 其中可使用的选项有 :
Remove Help (移开求助) : 移开这个求助视窗, 但保持其他 xman 视窗的原样. (在我们的情况是仍得到主选择视窗)
Open New Manpage (开启新指南页) : 与主选择视窗的 Manual Page 盒相同, 描述於後.
Quit : 结束整个程式 (停止).
欲选择某一选项须移动指标到该选单区并碰触左按钮; 假如你甚麽都不想选, 只要将指标移出选单即可.
┌——————————————————┐
│ p117 fig 10 - 5 │
│ │
│ │
│ 图 10 - 5 xman 求助与指南页视窗选单│
└——————————————————┘
注意 : 在任何时刻, 只要指标进入顶端边缘区, xman 就会突现它的选单. 假如你不是为了这个目的而意外地横过边缘, 这可能会造成困扰.
10.2.2 如何阅读一个指南页
在主选择视窗的 Manual Page 碰触按钮 : xman 产生一个指南页视窗,视窗开始时会显示与前面求助视窗相同的文字.
由此出发, 依照下列三步骤阅读指南页 :
1. 选择你要看的指南页的特定章节 (section). (section 是参考 unix指南页的标准分法. 亦即, section no. 1 包含使用者命令, section no. 2 包含系统呼叫)
2. 视窗会显示你所选择章节的目录, 从目录中选择进入点.
3. 阅读显示的指南页.
选择指南书 (Manual) 的章节
当 man启动时, 它预先设定为选择指南书的 section 1. 假如这是你所要的, 你可以省略下列步骤的程序. 否则需指定一个 section :
1. 在指南页视窗内, 移动指标到顶端边缘. 我们将得到一个与在指南页里相同的突现选单,不过现在所有的选项都可使用.
2. 在 Change Section 项目上碰触按钮 : 选单被一系列的指南书章节名称的列表取代. (如图 10 - 6)
┌—————————————————┐
│ p117 fig 10 - 6 │
│ │
│ │
│ 图 10 - 6 xman 的指南书章节选单 │
└—————————————————┘
3. 在你要的章节上碰触按钮 : xman 在指南页视窗内显示进入点的目录 (如图 10 - 7).
┌—————————————————┐
│ p118 fig 10 - 7 │
│ │
│ │
│ 图 10 - 7 xman 的指南页进入点目录│
└—————————————————┘
显示目录和选择指南页
假如你依照上面的描述明白地指定一个指南页章节, xman便会显示一个指南页目录.否则, 从顶端边缘突现出选单, 并在 Display Directory 上碰触按钮, 你会得到像上面一样的指南页目录.
从目录中选择一个指南页 : 只要在你要的名称上碰触按钮, xman 即在视窗内显示指南页 (图 10 - 8). (假如目录列表太长以致视窗无法一次显示, 它旁边会有卷动棒. 假如你要的名称看不到, 则必须先将它卷动出现後才可以选择你要的名称)
┌———————————————————┐
│ p119 fig 10 - 8 │
│ │
│ │
│ 图 10 - 8 显示一个指南页的 xman 视窗 │
└———————————————————┘
察看一个指南页
只要指南页在视窗内, 你有许多选择 :
卷动指南页本文 : 卷动指南页本文就像卷动求助本文一样, 亦即,按 f, 或碰触左按钮, 即可向前移动, 按 b, 或碰触右按钮, 则可往回移动.
本文/目录间之切换 : 在指南页视窗碰触中间按钮, 本文即被切换成目录列表. (在目录内碰触按钮, 则回到上一个指南页本文显示).
搜寻一个指定的指南页 :
1. 从顶端边缘突现出选单并选择 Search. xman 突现出一个搜寻视窗(图 10 - 9).
2. 在顶端的本文盒内, 键入你想要的指南页名称 (不用任何 section接尾词, 例如你只要键入 diff, 不用键入 diff(1) 或 diff.1)
3. 在 Manual Page 上碰触按钮,xman 便会显示你所要的指南页. (假如它找不到, 它会在指南页的视窗顶端边印出一个讯息)
注意 : 你键入的名称必须完全 (di 不能代表 diff), 名称的大小写也必须配合 (xaddhost 不等於 XAddHost).
┌—————————————————┐
│ p120 fig 10 - 9 │
│ │
│ │
│ 图 10 - 9 xman 搜寻视窗 │
└—————————————————┘
许多项目一起显示
在任何时刻, 你都可以视需要开启额外的 xman 视窗, 只需从顶端边缘突现出选单并选择 Open New Manpage 开启一个指南页视窗, 然後选择 Help 开启一个求助视窗.
只要你喜欢你可以开启许多不同的 xman 视窗, 且对视窗管理器来说每一个都可以被独立地管理, 例如 : 你可以将某些重定大小, 其它的表徵图化等等.为了清楚起见, 主选择视窗、求助视窗及指南页视窗的表徵图均不同 (图 10 - 10 a, b, c). (表徵图内的 "U.P.M." 代表 "Unix Programmer's Manual")
┌—————————————————┐
│ p120 fig 10 - 10 │
│ │
│ │
│ 图 10 - 10 xman 的三个不同表徵图 │
└—————————————————┘
在任何一个 xman 视窗, 选择 Show Both Screen, 你可以同时显示目录及指南页,视窗分成上下两部分, 上面显示目录, 下面显示指南页 (图 10 - 11)
. (当你如此做时, 顶端的边缘变薄 : Display Directory 与 Display Manual Page 选择项变成灰色 -- 表示它们目前不可选用, 且选单项目 Show Both Screen 变成 Show One Screen).
┌——————————————————————┐
│ p121 fig 10 - 11 │
│ │
│ │
│ 图 10 - 11 同时显示目录与指南页的 xman 视窗│
└——————————————————————┘
如有需要, 你可以改变视窗中两个分框 (panes) 的相对大小, 注意接近分隔框线的右手边有一个小的黑方形叫做把手 (柄) (grip)
1. 将指标指向把手.
2. 按下任一滑鼠按钮, 并保持按著.
3. .. 拖拽分隔线至你要的地方.
4. 放开按钮,两个方框即被适当地重划.
注意 : 我们会在不同的X应用看到许多这种把手, 但大部份的情况均无法让你拉动它以重调与相邻视窗的比例. 例如 : 假如你试图拉 xman 顶端边缘与本文或目录视窗分隔线上的把手, 它不会有任何反应.
10.3 邮件/讯息处理系统 - xmh
xmh 是一个架在 mh 邮件/讯息处理系统之上的X介面. 当你启动它时, xmh会建立一个像图 10 - 12 的视窗. 程式的视窗相关画面如编辑本文, 与管理视窗方框,均与 xedit 及 xman十分类似, 事实上是由相同的内部结构所提供的.
正因为如此, 且由於大多数描述是与程式的邮件功能有关而较少与X有关, 我们不进一步讨论. 假如你想知道如何使用程式, 指南页拥有一个简单但内容丰富的描述.
┌—————————————————┐
│ p123 fig 10 - 12 │
│ │
│ │
│ 图 10 - 12 xmh 邮件处理视窗 │
└—————————————————┘
10.4 结论/摘要
在本章中你已经开始看到某些X应用程式在使用者介面上一致性的面貌,例如:卷动棒的操作, 和一般的本文编辑功能. 这里只归结出包含在 core 发行版本中的一般使用者程式,下一章探讨一些示范程式, 然後我们便进入本书第三部分,探讨如何订制一个系统.
但是在许多方面你现在所需的是去获得系统的真正优点. 你目前要的是更多的应用程式,使你在 X的工作架构下做更广泛的应用, 这就是 MIT 发行版 contrib 部分重要的地方. 它包含了所有阶层的广泛应用程式, 从详细的程式函数到方便的程式, 一直到完整的应用, 像事先看排版文件的 xdvi 或绘图程式 xfig.
制造商与第三集团支持X的程式及套装软体数量不断地增加, 这些软体不是具有一个完整的X使用者介面, 就是至少可使你输出图形到一个X视窗. 当然也有其他的软体来源,举例而言, 自由软体基金提供高度弹性与扩展性的GNU Emacs编辑器, 它曾经被整合到X里面, (事实上, 许多 Xedit 订定编辑的功能键的确与 Emacs 相同) 如何得到 GNU Emacs 的细节包含在附录E "如何 获得X" 中.