第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.
基於"殺掉"動作的原理, 你可以用它來移動或拷貝文字區域.
移動文字 : 先 kill 它, 再將點移動到你想重新放置的地方, 最後un-kill.
拷貝文字 : 先 kill 它並 un-kill 它, 使拷貝的來源不變; 再將點移動到你想拷貝的地方, 最後 un-kill.