第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 的列卷绕, 这是移至新列的正常方法.
[1] [2] [3] 下一页
插入新列, 且对齐 : 按 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 救回它, 最近被杀掉的文字在插入点的地方被插入. 但有几点须注意 :
. 只有最近被杀掉的文字可以被救回 - 你无法将一连串被杀掉的文字取回.
上一页 [1] [2] [3] 下一页
. 救回的文字是被插入到目前插入点的位置 - 不是该段文字原先被移除的地方.
. 若是需要的话你可以救回相同的文字许多次, 亦即按 ctrl-Y 并不影响缓冲区之内容.
基於"杀掉"动作的原理, 你可以用它来移动或拷贝文字区域.
移动文字 : 先 kill 它, 再将点移动到你想重新放置的地方, 最後un-kill.
拷贝文字 : 先 kill 它并 un-kill 它, 使拷贝的来源不变; 再将点移动到你想拷贝的地方, 最後 un-kill.
基於"杀掉"动作的原理, 你可以用它来移动或拷贝文字区域.
移动文字 : 先 kill 它, 再将点移动到你想重新放置的地方, 最後un-kill.
拷贝文字 : 先 kill 它并 un-kill 它, 使拷贝的来源不变; 再将点移动到你想拷贝的地方, 最後 un-kill.