Emacs 的基本編輯指令
前面的四個章節已經把 EMACS 的環境與架構做了扼要的介紹,現在開始討論 EMACS 做為編輯器(editor)所能提供的服務。
如何載入檔案與儲存檔案
使用編輯器最基本的需求,就是要能載入檔案以便編輯。現在就先來看看 EMACS 是如何處理檔案的載入。
EMACS 載入檔案的方法很簡單,只要在鍵入 "Ctrl-x Ctrl-f" 之後,再利用 minibuffer 輸入所要編輯的檔名即可。檔名的輸入可以與 completion 相互搭配。
鍵入 ``Ctrl-x Ctrl-f'' 命令之後,在 mininbuffer 處輸入已存在硬碟的檔案, EMACS 會執行如下的過程:
1. 產生一個新的緩衝區。
2. 將所欲編輯檔案的內容,拷貝至緩衝區內。
3. 將緩衝區的內容顯示出來,以便編輯。
這整個事件的過程,在 EMACS 的編輯系統中稱為「訪問檔案」( visiting file )。雖然載入檔案的方法很簡單,但仍有幾件事情值得討論的,現說明如下:
* 鍵入 ``Ctrl-x Ctrl-f'' 後, echo area 會顯示目前緩衝區的目錄,此時若編輯檔案的目錄與 echo area 所顯示的目錄相同,可逕在其後輸入檔名即可。
* 若檔案所在的目錄與目前緩衝區的目錄不同,輸入檔名的方法有如下幾種:
o 檔案在同一個機器上的做法:
+ 無視 echo area 所顯示的目錄,由使用者重新輸入檔名。
+ 鍵入新檔名的方法,是在 echo area 顯示目錄的最後方鍵入 ``/'' ,``/'' 代表, 忽略``/'' 之前面的路徑,新的路徑從 ``的路徑必須鍵入絕對路徑(absolute file name)。現舉一實例說明。 Find file: ~/work/emacs/emacs.tex 所要編輯的檔案在 ~/work/doc/text.tex 此時輸入正確檔名的做法如下所示: Find file:~/work/emacs/emacs.tex//~/work/doc/text.tex 以 EMACS 提供的刪除功能,將不必要的字刪除之後,
再輸入正確的資料. 除非顯示的目錄與所欲編輯的目錄相差無幾,使用刪除的方法才有意義,否則不如放棄所顯示目錄,重新開始新的生涯才是正途。至於如何刪字,會在 5.2.5 一節中說明,此處就不贅言。 所欲編輯的檔案,不在目前所在的機器上的做法,如下所示:前已述及 EMACS 可以 FTP 的方式來編輯遠方的檔案,但 EMACS 是如何以 FTP 的方法來編輯遠方旳檔案呢?想要編輯遠方的檔案,只要給予正確的語法, EMACS 就會根據其語法來決定是否要使用 FTP 來編輯此檔案了。其語法很簡單,只有 /host:filename 而已。如何來使用其語法呢?由其語法可知,其語法是由四組元素所組成的字串,包括二組子字串(host 和 filename)以及二個符號(/ 和 :)。在 minibuffer 處輸入 / 後,緊接給予檔案所在的機器名稱(host),在其後立即給予 ``:'' ,在 ``:'' 後則輸入所欲編輯檔案,整個訪問檔案的過程就完成。注意此四組資料間,不可以留有任何的的空白。現舉一實例子來說明之。 Find file:~/work/emacs.tex//hsko@gate.sinica.edu.tw:~/work/text.tex 鍵入 ``Ctrl-x Ctrl-f'' 當 echo area 顯示出目前緩衝區
o o 的目錄後,只給予 RET 而別無它物時, EMACS 以目前緩衝區所使用的檔案為預設檔案。 鍵入 ``Ctrl-x Ctrl-f'' 後,突然改變心意,想知此目錄以外其它目錄的檔名,除了使用 ``Ctrl-x d''(使用目錄的編輯指令-dired)指令外,還可以利用現有的目錄名稱來得到想要的訊息。其作法是直接修改 echo area 所顯示的目錄,直到所要的目錄出現後,鍵入 RET,此時會另開啟一個視窗來顯示出此目錄下的所有檔名。若想操作這些檔案,其操作方式與運作 Dired 的方式相同。若對 Dired 的印象已經模楜的人,請參閱 3.2 節 。
以上是介紹檔名的輸入方式。在編輯資料的同時,是否可以輕易查得目前所在的目錄?" Meta-x pwd" 指令可以滿足這種需求。鍵入 " Meta-x pwd" 後, EMACS 會假借 echo area將目前所在的目錄顯示出來。
以上談的都是 EMACS 輸入檔案的方式,但 EMACS 又是如何為其緩衝區命名的呢?其實使用者並不需要為緩衝區命名,因為 EMACS 會自動給予緩衝區合適的名稱。EMACS 為緩衝區的命名,可以從 mode line上得知。
EMACS 命名緩衝區的方式是根據所鍵入的檔案名稱而來,它捨棄了所有的目錄名稱只保留編輯檔案的檔名。所以若全名為 ``/user/work/emacs.tex'' 的檔案,其緩衝區的名稱則為 ``emacs.tex'' 。 除了將檔案從硬碟直接載入緩衝區外,在編輯檔案的同時,有時需要參考其它的檔案,甚至需要引進其它的檔案到目前所使用的緩衝區內。 EMACS 的 `` Ctrl-x i'' 指令,就是讓使用者能隨時引進其它的檔案到目前的緩衝區內。 ``Ctrl-x i'' 的 `` i'' 是 insert 的意思,相信瞭解意思後,對於該指令應有較深刻的印象,否則怎有知已知彼,百戰百勝之說呢? 以下是 EMACS 有關檔案載入指令的整理:
o Ctrl-x Ctrl-f(find-file)
o Ctrl-x i(insert-file)
o Meta-x pwd
文件編輯完後,最重要的事情就是要能將其保留下來。以下就來談談文件儲存的方法。檔案儲存不外乎將緩衝區的內容以原名或易名存回磁碟;此儲存方式可以選擇一次存一個檔案或一次存數個檔案;最後的考量是存完檔案後是否要直接離開 EMACS。 下面就來看看EMACS 所提供的相關指令。
o 存檔但不離開 EMACS
+ Ctrl-x Ctrl-s(save-buffer
+ 將目前緩衝區的內容,存回磁碟中。存回的檔案名稱與緩衝區 的名稱相同 。此指令只對目前所使用的緩衝區做存檔的動作。若緩衝區 的內容未有任何的變動則 echo area 會顯示如下的文字: (No changes need to be saved) Ctrl-x Ctrl-w(write-file)
此指令與上一個指令相似,不同之處在於可以使用與緩衝區 不同的檔案名稱存檔。。換言之,可另行指定存回磁碟的檔名。 鍵入 ``Ctrl-x Ctrl-w'' 後, echo area 會顯示出目前 緩衝區所在的目錄, 此時,使用者可根據需要輸入檔名。若不輸入任何檔名只鍵入 RET , 系統仍會將緩衝區內的資料存回原先訪問的檔案中。此指令 也只對目前所使用的緩衝區做存檔的動作。
+ Ctrl-x s(save-some-buffers)
此指令可用來儲存所有被修改過的緩衝區。使用此指令時, echo area 除了顯示 檔案名稱外,還會在檔名之後出現 (y, n, !, ., q, C-r or C-h) 這些訊息是提供給使用者做參考的。現在就告訴使用者這些 訊息所代表的意義。
1. y
2. 同意對 echo area 所顯示的緩衝區存檔,進一步 徵詢其它檔案是否存檔的意見。 n
3. 放棄對 echo area 所顯示的緩衝區存檔,但徵詢 其它檔案是否 存檔的意見。 !
4. 同意對 echo area 所顯示的緩衝區存檔且一併 對其它的緩衝區存檔,此時不再一一徵詢其它檔案是否 存檔的意見。 .
5. 同意對 echo area 所顯示的緩衝區存檔,但放棄 對其它未存檔的緩衝區存檔,且直接離開此存檔的狀態。 q
6. 離開存檔的狀態而不執行任何存檔的動作。 C-r
7. 可以此指令流灠目前所要儲存的檔案內容,當離開此流灠 狀態即回復存檔的模式,系統會再度詢問與存檔有關的訊息。 C-h
對於以上的選項若有不明白的地方,可以此功能查閱其意思。 存檔後直接離開 EMACS
o Ctrl-x Ctrl-c(save-buffers-kill-emacs) 此指令容許用者在決定是否將緩衝區的內容存檔後,立即 離開 EMACS。此指令實際上是先執行 ``save-some-buufers'' 的動作再離開 EMACS。 討論完了載入與儲存檔案的功能之後,相信已經迫不急待想要知道如何編輯一份心目中想要的文件。現在就是介紹如何編輯檔案的時候了。
Emacs 的基礎編輯指令
編輯器做些什麼事呢?現在先談談編輯器的基本功能,至於編輯器的進階功能則在下一章討論。此處所談的基本或進階的功能,所指的都是 EMACS 可以提供的功能,所區分的基本和進階也只是為了討論上的方便而已。
所謂的編輯器就是用來編輯文件的器具。一張紙與一支筆,就可以滿足文件的編輯,這也是最簡單且最原始的編輯器。將紙筆產生文件的動作以電腦來代步,就是電子編輯器(以下簡稱編輯器)主要的功能,也是本文所要討論的編輯器。
文件的編輯不外乎文件的鍵入、游標的移動、文件的搬移與刪除以及文件資料的找尋與取代等等。現將 EMACS 可提供的基本編輯功能簡列如下,其詳細的用法會在以下的各節中一一敘及。 EMACS 所能提供的基本編輯功能如下:
* 字元輸入與顯示在螢幕上的方式
o 字元的顯示方式,可使用插入法(insert)或覆蓋(overwrite)的方法。
o 除了一般的字元(ASCII Character)外,還可以顯示特殊字元
o (Special Character)以及任何八進位超過 200 的字元。 文件在螢幕上所能顯示的範圍。
* point(cursor) 的移動方式(move point)
o point 能左右移動一個或數個字元(character)
o point 能左右移動一個或數個字(word)
o point 能移至一列的開頭或結尾
o point 能上下移動一列或數列(line)
o point 的設定,使游標能上下移動至指定的欄位
o point 的移動能以頁為單位(page)
o point 能至螢幕的前端或尾端
o point 能移至緩衝區的前端或尾端
* 顯示緩衝區大小與 point 所在的位置
* 刪除螢幕上所顯示的文件
o 向左或向右刪除一個字元(character)
o 向左或向右刪除一個字(word)
o 刪除游標所在位置以後的所有文件
o 刪除一個區塊的文件(region)
o 刪除的文件可以再使用(yank)
* 文件的搬移與拷貝(move and copy)
編輯器具備以上的功能,就可以編輯出想要的文件。現在就來看看如何在EMACS 所提供的編輯環境,來編輯出想要的文件。
在 Emacs 中如何加入與顯示文件
EMACS 允許輸入文件時,將資料直接輸入在 point 所在位置的正前方,此方法稱為 insert mode;或將輸入的資料以覆蓋的方式取代 point 所在位置的字元,此方法則稱為 overwrite mode。現舉一實例來說明 insert mode 與 overwrite mode 的異同。
* 字串 food, point 所在位置為 d 處,此時的狀態為 insert mode。
* 在 point 所在的 d 處鍵入 t ,原字串變為 footd。 字串 food, point 所在位置為 d 處,此時的狀態為 overwrite mode。 在 point 所在的 d 處鍵入 t ,原字串變為 foot。
EMACS 對輸入模式的預設值是 insert mode,若想將模式轉換成 overwrite mode,指令 `` Meta-x overwrite-mode RET'' 可滿足此一需求。若想恢復 insert mode,只需再使用一次 `` Meta-x overwrite-mode RET''就可以了 。當輸入模式轉為 overwrite mode 時,螢幕下方的 mode line 會顯示 ``Ovwrt'' 的訊息,用以提示目前是使用 overwrite 的模式。指令 `` Meta-x overwrite-mode''是用來轉換 insert mode 與 overwrite mode
。在此前提下,原為 insert mode ,經轉換則為 overwrite mode。反之,若原為 overwrite mode 則轉換成 insert mode。
EMACS 的 overwrite mode 只針對從鍵盤輸入的文件有效,若文件不是從鍵盤輸入,而是以別的方式產生的,則一律失去 overwrite的效用。例如,拷貝而來的文件或以 `` Ctrl-x i'' 得來的文件, EMACS 一律使用insert mode。
除了 insert 與 overwrite 的顯示方法外, EMACS 還允許使用者輸入一些從鍵盤上無法輸入的字,那就是一些控制碼和八進位超過 200 的字元。要輸入這些特殊的文字時,只要在這些字的前方加上 `` Ctrl-q''即可。例如,要輸入分頁碼(formfeed ,ASCII Ctrl-L, octal code 014),則輸入 ``Ctrl-q Ctrl-l'' 即可。此時螢幕會出現 C此時螢幕會出現 ^L 的符號。當輸入文件的長度,超過 EMACS 視窗寬度所能顯示的範圍,EMACS 對此情形的處理如下所示:
* 若文件太長需要換列時,在換列處鍵入 RET ,其後的文字會自動轉到下一列且以第一個欄位為新列的起始點。若其後沒有文件而鍵入 RET ,游標會會停在下一列的第一個欄位。
* 不理會文件是否會超過視窗的寬度,也就是不鍵入 RET 而繼續輸入文字。 EMACS 會自動在視窗的最後加上 ``\'' ,而將其餘的文字移至下一列;若下一列還是無法顯示出所有的文字,會在此列的最後再加上一個 ``~續將多餘的文字移至下一列。 EMACS 就是不斷重複如此的動作,直到所有的文字都能完全顯示出來為止。所代表的意思與鍵入RET 並不相同。鍵入 RET 表示重新使用一個新列;不鍵入 RET 而令 EMACS 自動加入所產生的文件,仍代表著同一列,只是這一列太長, EMACS 無法以其視窗的寬度來一次窮盡,必須分為數次來表示。
* 不鍵入 RET ,也不使 EMACS 自動產生 ,而使超過螢幕寬度的部份暫時隱藏起來。EMACS 處理這種情形,是在視窗的最後加上一個 ``$'' 。 ``$'' 表示其後的內容在視窗上暫時看不到,但仍安在緩衝區內。EMACS 的基本預設是自動加入 ``\''。要使多餘的文字隱藏起來,必須設定 ``truncate-lines'' 變數的值為正值。變數設定的方法請參考 4.4 節。 4.4 節曾談過一個視窗可以分成左右二個小視窗,此視窗可以做水平的捲動,此情形下的視窗在處理太長的列時,就是將 truncate-line 變數的值設成正值,使超過寬度的文件隱藏起來。
前面所談的都是「文字」的插入方式,但如何插入一個「非文字」的空白列呢?在編輯的過程中,若想在某列之前加入一個新列,只需將游標移至此列的最前端,隨後再按下 RET 即可。此時 EMACS 會在游標所在處的前一列,加入一空白列。 EMACS 為何要將空白列加在游標之前而不是游標之後呢?因為將空白列加在游標之前,有一個最大好處,就是可以很輕易的在緩衝區的最前端加入一個空白列。此時所鍵入的 ``RET'' ,代表著 newline 。若不鍵入 RET, 也可以使用 EMACS 所提供的 Hotkey ,也就是 Ctrl-j (tex-terminate-paragraph) 來獲得新的一列。
point的移動
文字的鍵入及顯示是編輯過程不可或缺的。除此之外,移動游標到適當的位置,也是編輯過程不可缺的功能。現在就來看看在 EMACS 下如何移動 point 或可稱為如何移動游標。移動 point 也就是移動游標,因為 point 是透過游標來顯示的。所以在本文會將游標與 point 交互使用。 游標移動不外乎以固定的單位,將其做上下左右的移動。此固定的單位可能是字元(character)、字(word)、列(line)或頁(page)。現在就來看看如何將游標以這些單位來移動。
* 左右移動一或數個「字元」(character)
o Ctrl-f(forward-char)
游標往前(右)移動一個字元。
o Ctrl-u n Ctrl-f
(Ctrl-u n Meta-x forward-char) 游標往前(右)移動 n 個字元。
o Ctrl-b(backward-char)
游標往回(左)移動一個字元。
o Ctrl-u n Ctrl-b (Ctrl-u n Meta-x backward-char)
游標往回(左)移動 n 個字元。
* 游標左右移動一或數個「字」(word)
o Meta-f(forward-word)
游標往前(右)移動一個字。
o Ctrl-u n Meta-f (Ctrl-u n Meta-x forward-word)
游標往前(右)移動 n 個字。
o Meta-b (backward-word)
游標往回(左)移動一個字。
o Ctrl-u n Meta-b (Ctrl-u n Meta-x backward-word)
游標往回(左)移動 n 個字。
* 游標移至一列的「最前端」或「最尾端」
o Ctrl-a (beginning-of-line)
游標移至一列的最前端。
o Ctrl-e (end-of-line)
游標移至一列的最尾端。
* 游標上下移動「一列」或「數列」(line)
o Ctrl-n (next-line)游標向下移動一列。
o 下移一列的游標其所在的水平位置,與移動前的水平位置 相同。若游標在文件的最後一列時, Ctrl-n 會自創新列再 移到此新列的第一個欄位。 Ctrl-u n Ctrl-n(Ctrl-u n Meta-x next-line)游標向下移動 n 列。
o Ctrl-p (previous-line)游標向上移動一列。
上移一列的游標其所在的水平位置,與移動前的水平位置相同。 若游標已在文件的第一列時,再使用 `` Ctrl-p'' 時 echo area 會顯示如下的訊息: Beginning of buffer
o Ctrl-u n Ctrl-p (Ctrl-u n Meta-x previous-line) 游標向上移動 n 列。
* 上下捲動緩衝區
o Ctrl-v(scroll-up)
向上捲動緩衝區,且將目前視窗所顯示的最後二列,做為 捲動後的前二列, point 出現在視窗上的第一列。 EMACS 如此做只是讓使用者 有一個承先啟後的感覺罷了。
o Ctrl-u n Ctrl-v
緩衝區向上捲動 n 列。 數字 n 若小於目前 point 在此視窗所在位置的列數,捲動後的 point 位置,仍留在捲動前的同一列上;否則 point 移至視窗 的第一列。
o Meta-v(scroll-down)
向下捲動緩衝區,且將目前視窗上的前二列做為捲動後的後 二列,此時的 point 出現在螢幕的最後一列。
o Ctrl-u n Ctrl-v
緩衝區向下捲動 n 列, 若數字 n 小於point 在此視窗以下的列 數,捲動後的 point 位置,仍留在捲動前的同一列處。否則 point 移至視窗的最後一列。
* 左右捲動緩衝區
o Ctrl-x <(scroll-left) 緩衝區向左捲動。
o Ctrl-x >(scroll-right) 緩衝區向右捲動。
* 游標移至緩衝區的前端尾端
o Meta <(beginning-of-buffer)
o 將游標移至緩衝區的最前端, point 也移至視窗的第一列。 Meta >(end-of-buffer)
將游標移至緩衝區的最尾端, point 也移至視窗的最後一列。 頁數的移動
* 還記得討論 `` Ctrl-q'' (quoted-insert) 時,提過分頁的控制碼。有了分頁的設定,自然會有以頁數做為移動游標的單位了。
o Ctrl-x [ (backward-page)
o 將 point 移至上一頁分頁指標(^L)之後且緊鄰 ^L。 若point 已緊鄰在 ^L 之後了,則會略過此 F在 ^L 之後了, 則會略過此 ^L 到上一個 ^L 之後。 Ctrl-x ] (forward-page)
o 將 point 移至下一頁分頁指標(^L)之後且緊鄰 ^L。若point 已緊鄰在 ^L 之後了,則會略過此 F在 ^L 之後了, 則會略過此 ^L 到下一個 ^L 之後。 Ctrl-x Ctrl-p (mark-page)
以頁為單位做上記號之後,再配合其它的指令對此頁做處理。 此指令類似mark region(5.4 節會討論其意思)。例如 Ctrl-x Ctrl-p Ctrl-w 是將游標所在的那一頁刪掉。此指令可以配合 numeric arguments(5.3 節會討論其意思)使用。
除了以移動游標的方法來游走緩衝區外, EMACS 還提供一個可以直接將游標移到指定的行列。所要到達的目的地,不論是以字元數或列數為移動的單位,其起算點都是以緩衝區的第一列第一個欄位為起算的標準。以下就是此方法的介紹。
* Meta-x goto-char RET
* 鍵入此指令後再按下 RET ,echo area 會出現 ``游標移動的總字元數即可。再一次的提醒各位,字元的 計算是以緩衝區的第一列的第一個字元為起算點。例如, 在 ``Goto char:'' 給予 100 的數字,則游標會從緩衝區的 第一字元移動到第 100 個字元。 Meta-x goto-line RET 鍵入此指令再按下 RET 後,echo area 會出現 ``, 在其後輸入想要游標移動的列數即可。再一次的提醒各位, 列數的計算是以緩衝區的第一列為起算列。例如,在 ``Goto line:'' 給予 100 的數字,則游標會從緩衝區的第一列開始往下移動 10 列。
何謂數值引數
在上一小節 point 移動一文中不斷的看到 Ctrl-u n ,它是什麼呢?它是 EMACS 的數值引數(numeric argument),但數值引數又是什麼的呢?
數值引數適用於所有 EMACS 的指令。它的用途可分成 以下數類:
* 對某一指令做重複執行的動作
o 用法: Ctrl-u n command 或
o Meta- n command 說明:
+ n 代表重複的次數; command 代表要重複執行的指令。
+ 若鍵盤提供 Meta 鍵(個人電腦可以使用 ESC 鍵),則 Meta 鍵是使用數值引數最方便的方法。
+ n 若為負值的數字,則表示以反方向運行指令。
o 例子:
+ n 為正值
+ Ctrl-u 5 Ctrl-f 或 Meta-5 Ctrl-f 表示游標往前(右)移動 5 個字元。 n 負值
Ctrl-u -5 Ctrl-f 或 Meta-5 Ctrl-f 表示游標往回(左)移動 5 個字元。 重複動作四次
o o 用法:
o 說明:
+ Ctrl-u 後面所接的不是數字而是字元,它代表著一個 Ctrl-u 重複指令的動作為一個四的倍數。換言之,一個 Ctrl-u 執行 四次,二個 Ctrl-u 則執行 16 次,以此類推。
o 例子:
+ Ctrl-u Ctrl-f
+ 表示游標往前移動 4 個字元。 Ctrl-u Ctrl-u Ctrl-f
表示游標往前移動 16 個字元。 利用引數變數自動鍵入相同的「字元」
*
o 用法: Ctrl-u n char 或
o Meta- n char 說明:省略 n 與否,代表不同的意義
+ Ctrl-u 後緊接著數字與字元,表示重複字元 n 次。
+ Ctrl-u 後面不接數字而緊接字元,表示重複字元四次。
o 例子:
+ Ctrl-u 10 r 或 Meta-10 r 則螢幕上出現 10 個 r。
+ Ctrl-u r 或 Meta-4 r 則螢幕上出現 4 個 r。
* 使用引數變數自動產生相同的「數字」的方法
o 用法: Ctrl-u n Ctrl-u n 或 Meta- n Ctrl-u n
o 說明: Ctrl-u 後面有二個 n ,第一個 n 表重複的次數, 第二個 n 表重複的數字。第二個 n 之前一定要再給予一次 Ctrl-u,若不給第二個 Ctrl-u ,系統會以為重複 nn 次。
o 例子: Ctrl-u 5 Ctrl-u 4 或 Meta-5 Ctrl-u 4 螢幕上出現 5 個 4。 Ctrl-u 5 4 ,則系統以為重複 54 次。
數值引數的用途很廣,且適用任何一個 EMACS 的指令,當需要重複執行某一指令的動作時別忘了它。有人說電腦最強大的功能之一,就是能不厭其煩的執行重複的事情。以下有關 EMACS 指令的介紹,不再特別強調 numeric arguments,但並不表示它就此而消失了,因為數值引數適合所有的指令,所以沒有必要每次都重複強調。只需記得,需要時可隨時使用 numeric arguments。
如何得到與 point 有關的訊息
前面談過 EMACS 移動 point 的方法,現在介紹探知 point 位置的方法。point 所在的欄位、列數與頁數等訊息,可從整個或部份的緩衝區而得知。現在就開始討論 point 位置。
* Meta-x what-page
* 告知 point 所在的頁數與列數。若緩衝區沒有以分頁(^L)符號分頁,則 point 所在的頁數永遠為第一頁。 若 point 在第一頁的第 200 列,其顯示的訊息如下: Page 1, line 200 Ctrl-x l (count-lines-page)
* `` Meta-x what-page'' 用來告知 point 所在位置的頁數與列數,但無法從中得知此頁的總列數。若想知道某一頁的總列數,必需靠 Ctrl-x l 來得知。此指令除了得知某頁的總列數外,同時還知道 point 所在位置之前與之後的尚有的列數。使用此指令時, echo area 會出現如下的訊息: Page has 23 lines(20 + 4) echo area 出現的第一個數字為總列數,括號內的二個數字分別代表point 所在處之前與之後的列數。括號內的兩個數是以point 為分界點而得來的。所以當 point 不出現在某一列的第一個欄位時,括號內二個列數的總和會比總列數多出一列,因為 point 所在的列被重複計算了兩次. 此指令在決定如何分頁時可以幫上大忙,因為可以輕易得知 point 前後的列數。 Meta-x what-line
* 告知 point 在緩衝區的列數。若此時 point 在第 200 列, 則 echo area 會出現如下的訊息: Ctrl-x =
* 指出游標所在欄位的字元資料。這些資料包括字元的八進位碼、字元所在的位置佔整個緩衝區的比例(此比例以字元為基本單位)以及字元所在的欄位。例如以此指令來得知此 ``a'' 字元的資料, echo area 會出現如下的資訊: Char: a (0141) point=23905 of 38784 (62) column 19 臨時想知某一字元的八進位,也不妨試試此法。 Meta-=
* 用來得知某特定區域( region)的總列數與總字元數。至於如何設定區域會在 5.3 節討論。以此指令得知的結果如下所示: Region has 200 lines, 2000 characters Meta-x line-number-mode
以上所討論的指令,只在使用指令時才會顯示想要的訊息, 訊息的出現是無法長存的。 基於此,EMACS 提供了一個可使 訊息永久存在 line 的方法,那就是使用 `` Meta-x line-number-mode''。 此指令可以在 mode line 上顯示 point 所在的列數,直到離開 此狀態或離開此視窗才會消失。若想使每次進入EMACS 都能 顯示列數,最好的方法是在 ``.emacs'' 檔加上如下的敘述: (setq line-number-mode t) 如此一來,只要進入 EMACS , mode line 會自動將列數顯現出來。 至於自動顯示欄位的方法,目前的 EMACS 尚未提供此服務。
文件的刪減
修改文件不外乎將原有的文件刪除後,再加入新的內容;或將現有的資料做重新的排列組合。現先討論文件的刪除部份,文件的重組就留待 5.4 節再進行討論。
EMACS 中的刪除有兩種形式,一種是指文件的 killing,另一種則指文件的deletion。在 EMACS 中所謂的 killing 是指將文件從目前的緩衝區移到一個稱為kill-ring kill-ring 為一個變數的地方去。文件在緩衝區中是消失了,但卻儲存在 kill-ring ,variable這一個變數中。 EMACS 可以有許多的緩衝區,但卻只有一個 kill-ring 的儲存變數。也就是說,多個緩衝區彼此共享一個 kill-ring,而且也只有一個 kill-ring。 EMACS 所設計共享的 killing-ring 的用意是讓被遺棄的文件可以找回,而且各緩衝區彼此也可借由 killing-ring 來建立一個互通的管道。所謂的互通就是把甲緩衝區的東西給乙,反之,也可把乙緩衝區的東西給甲。此模式在 EMACS 中就是透過 killing-ring 來完成。因此,想從甲緩衝區中得到某些文件給乙緩衝區,只要將甲緩衝區的文件放入 kill-ring 中,乙緩衝區就可以至此共享的 kill-ring 中將文件取出。如此一來,就可以共享資源了。
另一種模式的刪除,在 EMACS 中稱為 deletion。此種刪除,並不將刪除後的資料放入 kill-ring 中,而是將刪除的文件遺棄。此種情形的刪除是無法失物復得的。以 deletion 刪除的資料,可以鍵入
Ctrl-x u(undo) 來找回。使用一次 `` Ctrl-x u,恢復前一個指令的景象;使用二次 Ctrl-x u,則恢復前二個指令的容貌,如此周而復始的使用 Ctrl-x u ,可恢復更改前的全貌。至於 `` Ctrl-x u'' 更詳細的說明會在 5.5 節進一步討論。
前已說過,不放入 kill-ring 的指令稱為 deletion 的指令。 EMACS 刪除字元、空白字元以及空白列的指令都不放入 kill-ring 中的。具體說來就是, Ctrl-d、 DEL、 Meta-\、 Meta-SPC 與 Ctrl-x Ctrl-o 等指令。 現就為各位說明這些指令。
文件的修改不是重組資料就是刪減與新增資料,新增資料已論述過了,而重組資料即將在 5.4 節登埸,現在就開始談文件的刪減。刪除文件也不外乎刪除一個字元、一個字、一行或一個區塊;刪除的方向可以選擇左右刪除的方式。現在就來看看如何以 EMACS 所提供的指令,來做刪除的工作。此處將刪減的指令分成 deletion 和 killing而大類。
* 屬於 deletion 的指令集
o 刪除「字元」(character)的方法
+ Ctrl-d(delete-char)
+ 刪除 point 所在位置的字元。 DEL(delete-backward-char)
刪除 point 之前的字元。 此指令與 Ctrl-d 為最基本的刪除指令,只要耐心夠,任何 的刪除都可以此二個指令完成。 刪除 spaces 和 tabs 的方法
o
+ Meta-\(delete-horizontal-space)
+ 輸入資料時,常會不自覺的輸入無意的空白(space)和 tab 。 當合併上下列而為一列時,也常會出現 space 或 tab 從中作梗。 為此 EMACS 提供了 Meta-\ 的指令,讓使用者可以很容易 將不必要的 space 和 tab 刪除。當然其它的刪除指令,也可以 將不需要的 space 和 tab 刪除,此指令只是更方便刪除 space 和 tab 而已。 Meta-\ 可刪除 point 前後所有的 space 和 tab 。 例如:abc def g,此時的游標在 f 與 g 之間。 鍵入了 Meta-\ 其結果如下所示: abc defg Meta-SPC(just-one-space)
刪除 point 前後的 space 和 tab 時,若希望留下一個 space 或 tab 做為彼此的分隔,就必須使用 `` Meta-SPC'' 來完成了。 例如:abc def g,此時的游標在 f 與 g 之間。 鍵入了 `` Meta-SPC 其結果如下所示: abc def g 屬於 killing的指令
*
o 刪除「字」(word)的方法
+ Meta-d(kill-word)
+ 此指令往前(右)刪除 point 所在位置的字。 其所刪除字的範圍端賴 point 所在的位置而有不同。 若point 在一個字的第一個字元,則會刪除此字;若 point 在此字的 其它位置,則刪除 point 所在位置及其之後的所有字元,包括 point 所在位 置的字元。 例(一): This is a test. 游標若在 test 這個字的 t 處,使用此指令的結果如下: This is a . 例(二): This is a test. 游標若在 test 這個字的 e 處,使用此指令的結果如下: This is a t. 若想刪除一個以上的字,可以使用 numeric argument 。 Meta-DEL(backward-kill-word)
此指令往回刪除 point 所在位置的字。 其所刪除字的範圍端賴 point 所在的位置而有不同。 若 point 在一個字的第一個字元,則會刪除此字之前的字; 若 point 在此字的其它位置,則刪除 point 之前的所有字元,但不包括 point 所在 位置的字元。 例(一): This is a test. 游標若在 test 這個字的 t 處,使用此指令的結果如下: This is test. 例(二): This is a test. 游標若在 test 這個字的 e 處,使用此指令的結果如下: This is a est. 同樣的,回想一下 numeric argument 吧。
o 刪除列的方法
+ Ctrl-k(kill-line)
+ 刪除列的指令。所刪除列的範圍,以 point 所在的位置為 準則, 以 point 所在位置為起始點,以此列的結束為終點。 被刪除掉的文件會在視窗上留下一空白,若想將空白列也一併刪除, 必需再使用一次 Ctrl-k。此時的 Ctrl-k 是用來刪除換列指令 的控制碼。 Ctrl-x Ctrl-o(delete-blank-lines)
編輯的過程中會不經意的加入許多空白列,此種情形常發生在 緩衝區的最尾端。每按下一個 RET ,就輸入了一個新列,但在緩衝區 的尾端按下 RET ,此時所加入的新列並不易為人查覺。此指令可以 將point所在位置「前後」的空白列刪除只留下一列。當然並非 一定要以此指令來刪除空白, Ctrl-k 自然也可以用來刪除空白列, 也可以將空白列以刪除區塊的方式刪除之,提供此指令只是方便滿足 使用者的需求而已。 刪除區塊的方法
o
*Ctrl-w (Kill-region) EMACS 允許刪除某一特定的區塊。要刪除區塊,必需先標示區塊, 此標示的動作稱為 mark\。如何標示區塊,就是下一節的主題。
EMACS 對於被 killing而刪除的資料,都是放在 kill-ring 中。 kill-ring 其實只是一個變數而已,所有 killing刪除掉的文件,就是此變數的值。其已述及查閱變數值的方法,現不厭其煩的再論述一次:
1. 鍵入 ``Ctrl-h v'' 後, echo area 處會出現:
2. 在 Describe variable:後輸入變數的名稱, EMACS 會另開一個 視窗來顯示此變數的值。此時所要鍵入的變數名為 ``kill-ring''
此節討論 EMACS 編輯的基本指令,有了這些指令之後,編輯的工作就不是難事了。接下來各節則討論其它的編輯功能。
何謂 Yanking
將 kill ring 的內容取出的動作,稱為 yank。 yank 除了可 yank 最新 killing 的資料,也可 yank 早先 killing的內容。現在就以二種不同的 yank 做為討論的對象。 將最新 killing的文件從 kill-ring中取出的方法很簡單,只要使用 `` Ctrl-y'' 即可。 但在 yank 時,一定要確保在 killing-ring 中存有被刪除的資料。 想要 yank 最新 killing之前的文件,就較為複雜了。所謂的較為複雜,只是多了一個移動指向 kill-ring 變數值的程序而已。因為 yank 指令所要yank 的內容,全視指標指向 kill-ring 的位置而定。此指標一般都是指向最新放入的文件。若想 yank 其它的內容,就必需先移動指標了。
移動 kill-ring 指標的方法是使用 `` Meta-y'' (yank-pop),但在使用 `` Meta-y'' 之前,一定要先使用 `` Ctrl-y''。 換言之, `` Meta-y'' 的使用,一定要緊跟在 `` Ctrl-y'' 之後。
`` Meta-y'' 的運作是將指向 kill-ring 入口的指標,向前移動,再將`` Ctrl-y'' yank 出來的資料 ,以此時指標指向的文件取而代之。這就是為何使用 `` Meta-y'' 指令之前,一定要先執行 `` Ctrl-y''。 以 `` Meta-y'' 來移動指標,並不會影響 kill-ring 變數值的內容次序。
如何在文件中做上標記
前面有些指令是專門運作區塊的,如 `` Ctrl-x Ctrl-p'' 與 `` Ctrl-w'' 等等。但什麼是區塊呢? EMACS 所言的區塊,是指從標記( mark)處到 point 所在位置間的範圍,此範圍就是區塊( region)了。換言之,區塊的範圍是指,標記所在位置之後(包括標記所在位置本身)到 point之前(不包括 point 所在的位置)的所有文件。知道區塊的定義後,接下來就介紹如何定義區塊了。
既然區塊是指從標記處到 point的範圍,自然設定區塊也意味著設定標記和 point。設定 point的方法很簡單,只要移動 point至目的地即可。此時的 point代表著區塊範圍的終點。至於設定標記的方法也不難,只要在想要設定標記的地方,輸入以下的任一個指令即可。
* Ctrl-@ (set-mark-command)
* Ctrl-SPC (set-mark-command)
所以設定區塊的步驟如下所示:
1. 設定區塊的始位置,也就是所謂的標記( mark)。
2. 可使用 `` Ctrl-@'' 或 `` Ctrl-SPC'' 任一個指令來設定標記。 設定區塊的終結位置,也就是移動游標至區塊的尾端。
在標記與 point之間的範圍就是所謂的區塊。
為何會提供二個設定標記的 Hotkey 呢? Hotkey 是用來連結 EMACS 的命令, EMACS 會將常用的命令給予一個 Hotkey 與之連結。此連結的Hotkey,常會受所使用的終端機而不同。因此有的終端機可以使用 `` Ctrl-@'',但有的終端機則必需使用 `` Ctrl-SPC''。更甚者,有的終端機卻二者都無法使用,例如筆者以個人電腦模擬成的終端機,卻必需鍵入 `` Ctrl-2'' 才能達到設定標記的效果。 EMACS 可以允許使用者重新設定所使用的 Hotkey ,但這已經超過本文討論的範圍。如果無法使用以上任何一個 Hotkey ,就使用命令
`` ESC-x set-mark-command''。
使用 EMACS 的指令( command)永遠可以達到目的的。
EMACS 的 point,是透過視窗上的游標來顯示的。 text-only 視窗只有一個游標,所無法同時表示標記及 point。若想觀測區塊的來龍去脈,可以 `` Ctrl-x Ctrl-x''
(exchange-point-and-mark)
將標記與point做交換,從交換的過程可以觀察標記與 point的位置。 `` Ctrl-x Ctrl-x'' 所能做的事,只互換標記與 point而已。
那些指令是使用在區塊上呢?以下指令就是適用在區塊上的。有些是曾經提過的,有些是將要談及的,有些可只能只是列舉出來並不會在本文中被討論。
* Ctrl-w(kill-region)
* Ctrl-x r s(copy-to-register)
* Ctrl-x Ctrl-p(mark-page)
* Ctrl-x Ctrl-l(downcase-region)
* Ctrl-x Ctrl-u(upcase-region)
* Meta-x fill-region
* Meta-x print-region
接下來討論與編輯有切身關係的搬移與拷貝。
文件的移動與拷貝
變換文件在緩衝區出現的位置稱為搬移(在緩衝區的其它地方重複出現稱為拷貝( Copy)。
前已論及放於 kill-ring 的文件,可在需要時拿出來使用,此動作稱為 yank\indexyank 。使用 yank 的方法很簡單,只要鍵入 ``Ctrl-x y''即可。使用此方法可將某特定區塊的文件做「搬移」的動作,只是所需的步驟比較煩瑣而已。首先將要搬移的文件重複以 `` Ctrl-x k'' 的指令,將其放入 kill-ring 中,再將 point 移至文件欲搬移的位置,以 `` Ctrl-y'' 將其 yank 出來。
「拷貝」一個區塊的方法與「搬移」一個區塊的方法累同,唯一不同是要執行二次 yank 。第一次使用 yank,是將刪除的原文件再放回被刪除的位置,第二次使用 yank 是做拷貝的動作,也就是將 kill-ring 的文件放入要拷貝的地方。
以上的方法當然可以用來做搬移和拷貝之用,但如要搬移和拷貝的文件有數十甚至數百數千列,豈不要重複 `` Ctrl-k'' 的動作數十甚至數百數千次。因為 `` Ctrl-k'' 基本上是刪除列的指令,當然刪除列的指令,可以配合 numeric argument。但在使用數值引數之前還必需確定所欲搬移或拷貝的確實列數,如此一來豈不使事情愈來愈複雜呢?所以,要搬移與拷貝文件最好的方法,就是使用標記與區塊。下面所談的是針對區塊的搬移與拷貝的方法。
不論搬移或拷貝,只要觸及區塊的使用,首要之事就是先把區塊標示出。區塊定好之後,要搬移就以 `` Ctrl-w'', 將整個區塊刪除之後,再以 `` Ctrl-y'' 將其 yank 出來。要拷貝則以 `` Meta-w'' 將區塊的內容拷貝一份放在 kill-ring 中,爾後再以 `` Ctrl-y'' 將其 yank 出來。現說明搬移與拷貝的實際操作過程。
* 不設定區塊,以刪列的方式,將文件一列列先刪除後,再 yank 出來。 此法可搬移與拷貝 kill-ring 內的文件。
1. 重複執行 `` Ctrl-k''(刪除文件,可使用 numeric argument)
2. Ctrl-y(將放置在 kill ring 中的文件,yank 至緩衝區內。)
o 若做搬移的動作,只需使用一次 yank。
o 若做拷貝的動作,則要使用二次的 yank。
* 以設定區塊的方式,「搬移」區塊的文字。
1. Ctrl-@(設標記,也就是設定區塊的起始值)
2. 移動游標以便設定 point的位置(設定區塊的終點)
3. Ctrl-w(刪除所標示的區塊)
4. 移動游標至要搬移的位置(確定文件搬移處)
5. Ctrl-y(將放置在 kill ring 中的文件,yank 至緩衝區內。)
* 以設定區塊的方式,「拷貝」區塊的文字。
1. Ctrl-@(設標記 (mark))
2. 移動游標以設定 point的位置(設定區塊的終點)
3. Meta-w(不刪除標示區塊的內容,將此內容拷貝至 kill-ring 中)
4. 移動游標至要拷貝的位置(確定文件拷貝處)
5. Ctrl-y(將放置在 kill-ring 中的文件,
yank 至緩衝區內。)
為了更清楚搬移與拷貝後的真實結果,現舉實例來說明。
實例:現有二段文件,第一段文字是做搬移與拷貝用的,第二段文字是用來接收搬移後的文字。 第一段:標記設在第一列的 A 處,而 point設在 B 的地方。 1111111111A22222222222 3333333333333333333333 4444444444444444444444 55555B5555555555555555 第二段: point在 Y 處 00000Y0000000000000000 0000000000000000000000 0000000000000000000000 結果一、將第一段的文件搬移至第二段,搬移後的游標仍在 Y 處。 1111111111B5555555555555555 00000A22222222222 3333333333333333333333 4444444444444444444444 55555Y0000000000000000 0000000000000000000000 0000000000000000000000 結果二、將第一段的文件拷貝至第二段,搬移後的游標仍在 Y 處。 1111111111A22222222222 3333333333333333333333 4444444444444444444444 55555B5555555555555555 00000A22222222222 3333333333333333333333 4444444444444444444444 55555Y0000000000000000 0000000000000000000000 0000000000000000000000 執行搬移與拷貝的動作時, EMACS 所採取的一律是 insert-mode。此時,即使設定為覆蓋( overwrite-mode),覆蓋的效果也會暫時失效。
區塊的範圍以標記(mark)為起始值,以 point所在位置之前的字元做結束。所以,從以上的實例可以很清礎的看到,搬移或拷貝之後的文件會包括標記所在的字元,但不會包含 point所在的字元。搬移或拷貝的文件會出現在 point之前,原先所有的文件會向後移動,此時的 point仍在移動前的字元處。
區塊是以標記為開始而以 point為終點所構成的。標記與 point所在的列,可能包含所在列的一部分,其它區塊所包含的列都是完整的一列。若搬移或拷貝的範圍,為文件中某一個長方形的區域,那該如何來設定其範圍呢?設定好的範圍又該如何來操作呢? EMACS 對於這種形狀的區域有其它的處理方式,稱為長方形的區塊 ( rectangle region)。
設定長方形( Rectangle)的方法與設定區塊( Region)的方法是一樣的,只是在理解上有所不同。長方形設定的方法,也是設定二個標記,此兩個標記位於長方形相對的兩個直角上。所以,設定了左上角,另一個標記一定要設在右下角;反之,如果設定了右上角,另一個標記就一定要在左下角了。。此所設好的長方形, EMACS 稱為 rectangle 。 長方形與區塊的設定方法是一樣,所以單從設定標記與 point的方式,是無法辨識二者的差別的。要知是使用區塊或長方形,只有等到使用運作於此範圍的指令時才會知道。 若是以刪除長方形的指令將長方形的區塊刪除時,此時刪除掉的長方形文件並不放在 一般的 kill-ring 中,而是放於別的地方。因為刪除長方形的運作方式與刪除區塊的方式不同,所以將長方形刪除後的內容,與放置區塊刪除後的內容分隔,以便管理。 長方形運作的種類與區塊運作的種類累同,可分為二大類,一類為刪除與插入,另一類則專門用來處理空白。 刪除長方形可以採取摒棄的方式( Ctrl-x r d)或將其儲存於某處( Ctrl-x r k),以利事後的 yank ( Ctrl-x r y) (yank-rectangle)。刪除掉的長方形資料的保存,只能保留最新刪除的資料,所以只有最新刪除掉的長方形資料,才可以被 yank 出來。
長方形區塊的運作種類,除了能將資料做刪除與搬移外,還可以在文件的某處加入固定區域的空白。因為從事編輯時,常需要在某一區域加入一些空白( Ctrl-x r o)(open-rectangle)。例如在文件加上空白做為邊緣(margin);製作圖表時留些空白;或將某一區域的文件以空白取代( Meta-x clear-rectangle)等等。長方形的運作與區塊的運作最大不同處在於,無法直接做拷貝的動作,若要拷貝必需先刪除後再執行二次的 yank。現在就說明長方形區域的用法。
* 長方形區域的 yank 方法
1. Ctrl-@(設定長方形區域的第一個對角)
2. 移動 point至第二個對角處(設定長方區域的第二個對角)
3. Ctrl-x r k(kill-rectangle)
4. 刪除設定好的長方形,以便 yank 使用。 移動 point到要 yank 的地方。
5. Ctrl-x r y(yank-rectangle)
將刪除的長方形,從儲存處取出。
* 永遠刪除長方形的內容
1. Ctrl-@(設定長方形區域的第一個對角)
2. 移動 point至第二個對角處(設定長方區域的第二個對角)
3. Ctrl-x r d(delete-rectangle)
刪除設定好的長方形區域。此刪除不會儲存在某一定地方。換言之, 一旦摒棄此區域,就無法將其喚回,除非使用 undo 的指令。 在長方形區域內插入空白,原文件向前(右)移動。
*
1. Ctrl-@(設定長方形區域的第一個對角)
2. 移動 point(設定長方區域第二個對角)
3. Ctrl-x r o(open-rectangle)
填入空白在設定好的長方形區域內。此時區塊內的文字會自動往右 移動。使用 overwrite mode,原有的文件也不會被加入的空白覆蓋。 將設定的長方形區域以空白覆蓋
*
1. Ctrl-@(設定長方形區域的第一個對角)
2. 移動 point至第二個對角處(設定長方區域第二個對角)
3. Meta-x clear-rectangle
將此長方形區塊內的文件以空白取代。 在設定的長方形區域內填充某一類型的字串。
* 此方法常可用在程式的撰寫或測試上。例如,測試 ``.emacs'' 程式時,常因測試的過程中,需要將設定做增減的工夫, 使用此方法可以隨時將測試條件做增減。
1. Ctrl-@(設定要填充字串的起點)
2. 移動 point至第二個對角處(設定要填充字串的終點)
3. 鍵入 Meta-x string-rectangle RET ,此時 echo area 會出現
String rectangle: 利用 minibuffer 鍵入要填充的字串,即可將字串填入長方形區內。 值得注意的是,此時長方形的寬度由字串的寬度來決定, Ctrl-@ 與 point只用來決定長方形的長度。
何謂 Undo
在 EMACS 中想要將已經做過的動作放棄,以恢復舊觀。 EMACS 將其稱為 undo,以下就介紹如何 undo:
* Ctrl-x u(undo)
* Ctrl-\_ (undo)
以上兩個 Hotkey 都是用來執行 undo 的指令。 提供二個 Hotkey,是因為有些鍵盤並無明顯使用 `` Ctrl-\_'' 的方法,為了瀰補無法以一個字元達到 undo 效果的鍵盤,故另行提供 `` Ctrl-x u'' 給無法使用 `` Ctrl-\_'' 的使用者。
EMACS 所提供的 undo,可以連續恢復最近使用過的指令。 undo 的順序是最新使用過的指令最先被 undo ,第二次使用 undo 則恢復第二新的指令,任何指令的輸入(除了 undo 本身之外)都會使指令輸入的順序 重整, 這也同時影響 undo 的順序。
使用 undo 有一個限制,就是 undo 只能 undo 對緩衝區內容造成改變的指令。對於只是改變游標動作的指令,是無法以 undo 來恢復舊觀。若所有修改過內容的指令,都以 undo 恢復原狀後,再一次使用 undo 的指令,echo area 會出現如下的訊息: no furter undo information 當使用了 undo 之後,還想要在 redo 這個已被 undo 的動作時,有一個技巧可以達成如此的效果。
1. 首先鍵入一個不會改變緩衝區內容的指令(如游標移動的指令),使原來
2. 存放指令的順序因新指令的加入而改變。 再使用一次 undo 的指令,就可以達到 redo 的效果了。
# 現舉一實例來說明此 > 視窗上現有的資料為: This is a test. 如下為所執行的一連串指令,括號內表示所用過的指令:
1. 執行四次 DEL ,視窗顯示如下的訊息:
2. This is a 所使用的指令集如下: DEL DEL DEL DEL 將游標至字元 ``i'' 處,視窗顯示的訊息並無改變:
3. This is a 所使用的指令集如下: DEL DEL DEL DEL 鍵入 Meta-d,視窗顯示如下的訊息:
4. This a 所使用的指令集如下: DEL DEL DEL DEL Meta-d 鍵入 Ctrl-x u,視窗顯示如下的訊:
5. This is a 此時恢復最新被使用過指令 ``Meta-d'' 前的狀況 (Ctrl-x u 不為恢復的對象),也就是步驟二的情形。 此時使用的過指令集如下: DEL DEL DEL DEL Meta-d Ctrl-x u 鍵入 Ctrl-f,視窗仍出現與先前相同的訊息:
6. This is a 所使用的指令集則增加如下: DEL DEL DEL DEL Meta-d Ctrl-x u Ctrl-f 此時可以 Ctrl-x u 恢復第一次 undo 前的狀況, 即步驟三的狀況。視窗出現:
This a 因為記錄指令歷史的指標,此時己在第二個 Ctrl-x u 處,但 Ctrl-x u Ctrl-f 均不在 undo 的行列中,所以此時可以再恢 復一次 Meta-d 前的狀況。 所使用的指令集如下: DEL DEL DEL DEL Meta-d Ctrl-x u Ctrl-f Ctrl-x u
一般而言,每一個使用過的編輯指令都有一個與之相對應的 undo 記錄。每一個 undo 的記錄,都只對目前的緩衝區有效。有的指令需要一個以上的 undo 記錄來完成 undo 的動作;有的指令會先匯集一群 undo 的記錄,當使用 undo 時,會將此匯集的結果一次展現出來。例如,單一字元運作的指令,若每次使用 undo ,只恢復一個字元則非常的不經濟,所以遇到此種情形,以集合體的方式處理是比較合理的作法。
回主選單
沒有留言:
張貼留言