初入Emacs,還是要入鄉(xiāng)隨俗的,基于Unix的程序還是在鍵盤(pán)命令上下了很大的功夫,但這樣的通用性也得到了極大的提高。下面是拷貝Emacs的快速指南的中譯版本,只是記錄一下,沒(méi)有別的意思。呵呵
提供一下Windows平臺(tái)Emacs的安裝方式:
1、下載Emacs基于Windows的安裝包,我是從ftp://ftp.keystealth.org/pub/gnu/gnu/emacs/windows/emacs-22.2-bin-i386.zip這個(gè)地址下載而來(lái)的。如果該地址失效或者有更新版本的話,請(qǐng)直接上其官方網(wǎng)站獲取最新版本。
官方FTP列表地址:http://www.gnu.org/prep/ftp.html
2、下載后將其解壓到任意文件夾(建議路徑均為英文),在其bin目錄下點(diǎn)擊addpm.exe可以安裝emacs至“開(kāi)始”菜單。您也可以打開(kāi)runemacs.exe或者emacs.exe文件直接打開(kāi)。
在網(wǎng)上找到這么一篇級(jí)別很高的博客,《在Windows下使用Emacs》http://learn.tsinghua.edu.cn:8080/2004211031/publish/GNU/ntemacs.html
相關(guān)資源:
1、《GNU Emacs FAQ For MS Windows》 http://www.gnu.org/software/emacs/windows/index.html
快速指南:
Emacs 快速指南.(查看版權(quán)聲明請(qǐng)至本文末尾)
【注意:位于【】之間的內(nèi)容是譯注,比如本行,下同。】
Emacs 鍵盤(pán)命令通常包含 CONTROL 鍵(有時(shí)候以 CTRL 或 CTL 來(lái)標(biāo)示)和
META 鍵(有時(shí)候用 EDIT 或 ALT 來(lái)標(biāo)示)。為了避免每次都要寫(xiě)出全名,我們
約定使用下述縮寫(xiě):
C-<chr> 表示當(dāng)輸入字符 <chr> 時(shí)按住 CONTROL 鍵。
因此 C-f 就表示:按住 CONTROL 鍵再輸入 f。
M-<chr> 表示當(dāng)輸入字符 <chr> 時(shí)按住 META(或 EDIT 或 ALT)鍵。
如果你的鍵盤(pán)上沒(méi)有 META 、EDIT 或 ALT 鍵,用下述方法也等效:
先按一下 ESC 鍵然后放開(kāi),再輸入 <chr>。我們用 <ESC> 來(lái)表示
ESC 鍵。
重要提示:要退出 Emacs,請(qǐng)用 C-x C-c(兩個(gè)連續(xù)的組合鍵)。下文中左邊頂
行的“>>”字樣用來(lái)提示你嘗試鍵盤(pán)命令。比如:
[本頁(yè)當(dāng)中特意留出一些空白是出于教學(xué)目的,請(qǐng)繼續(xù)往后閱讀]
>> 現(xiàn)在輸入 C-v (查看下一屏文字)移動(dòng)到下一屏。
(別緊張,在輸入字符 v 的同時(shí)注意要按住 CONTROL 鍵)
從現(xiàn)在開(kāi)始,每讀完當(dāng)前一屏你都需要這樣做一次。
值得注意的是,當(dāng)你從上一屏滾到下一屏?xí)r,中間會(huì)有兩行的重復(fù);這樣做是為
了維持滾屏的連續(xù)性,方便你順暢、連續(xù)地閱讀。
用編輯器,開(kāi)門(mén)第一件事就是學(xué)會(huì)在文字中移動(dòng)。你已經(jīng)知道了 C-v 可以向下移
動(dòng)一屏,要往上移,請(qǐng)用 M-v (也就是按住 META 鍵,然后輸入v,如果你沒(méi)有
META、EDIT 或 ALT 鍵那么就先按 <ESC> 再按 v)。
>> 試試 M-v,然后再試試 C-v,來(lái)回遛幾次。
* 小結(jié)(SUMMARY)
-----------------
以下命令在翻頁(yè)瀏覽時(shí)相當(dāng)有用:
C-v 向前移動(dòng)一屏
M-v 向后移動(dòng)一屏
C-l 重繪屏幕,并將光標(biāo)所在行置于屏幕的中央
(注意是 CONTROL-L,不是 CONTROL-1)
>> 找到光標(biāo),留意其附近的文字,然后輸入 C-l。
找找光標(biāo)在哪里,你會(huì)發(fā)現(xiàn)其附近的文字并沒(méi)有變化。
如果你的鍵盤(pán)上有 PageUp 和 PageDn,也可以用這兩個(gè)鍵來(lái)滾屏。不過(guò)使用
C-v 和 M-v 的效率要更高一些。
* 基本的光標(biāo)控制(BASIC CURSOR CONTROL)
----------------------------------------
整屏的移動(dòng)很有用,但是如何在文字中精確定位呢?
有幾種方式可以選擇。用方向鍵當(dāng)然可以,不過(guò)更有效率的方法是保持雙手位于
主鍵盤(pán)區(qū),然后使用 C-p 、 C-b 、 C-f 和 C-n 這四個(gè)命令。它們的功能和方
向鍵是一樣的,如下圖所示:
上一行 C-p
:
:
向左移 C-b
. 目前光標(biāo)位置
. 向右移 C-f
:
:
下一行 C-n
>> 用 C-n 或 C-p 將光標(biāo)移到上圖的中央。
按 C-l,整幅圖會(huì)被顯示在屏幕的中央。
“P N B F”四個(gè)字母分別代表了四個(gè)詞,用這四個(gè)詞記憶這些組合鍵會(huì)更容易:
P 代表 previous(上一行),N 代表 next(下一行),B 代表 backward(回
退),而 F 則代表 forward(前進(jìn))。這些組合鍵今后將與你形影不離。
>> 按幾次 C-n 把光標(biāo)往下挪到這里。
>> 用 C-f 把光標(biāo)移動(dòng)到這一行,然后再用 C-p 往上挪。
注意觀察當(dāng)光標(biāo)在一行的中央時(shí) C-p 命令的行為。
每行文字都以一個(gè)“換行符”結(jié)束,“換行符”把行與行區(qū)分開(kāi)來(lái)。文件的最后
一行也應(yīng)該也有一個(gè)換行符(不過(guò) Emacs 并不強(qiáng)制要求這一點(diǎn))。
>> 在一行的行頭輸入 C-b。
光標(biāo)應(yīng)該會(huì)移動(dòng)到前一行的行尾,因?yàn)楣鈽?biāo)在回退過(guò)程中越過(guò)了換行符。
同樣 C-f 也可以像 C-b 一樣越過(guò)換行符。
>> 連按幾次 C-b,感受一下光標(biāo)的移動(dòng)。
然后按幾次 C-f 回到本行的行尾。
再按一次 C-f,光標(biāo)會(huì)移動(dòng)到下一行。
當(dāng)你移動(dòng)光標(biāo)穿越屏幕的上下邊界時(shí),在邊界外的文字會(huì)移動(dòng)到屏幕內(nèi),這稱(chēng)為
“滾動(dòng)”(scrolling)。滾動(dòng)使得光標(biāo)可以被移動(dòng)到文字中的任何位置,并且還
不會(huì)讓光標(biāo)跑到屏幕外邊去。
>> 用 C-n 將光標(biāo)下移,一直越過(guò)屏幕邊界,同時(shí)觀察發(fā)生了什么變化。
如果你嫌一個(gè)字符一個(gè)字符地挪光標(biāo)太慢,你還可以一個(gè)詞一個(gè)詞地跳。M-f
(META-f) 可以將光標(biāo)往前移動(dòng)一個(gè)詞,而 M-b 則是往后移。【這里的“詞”指
英文單詞,對(duì)中文來(lái)說(shuō),則是指移動(dòng)到下一個(gè)標(biāo)點(diǎn)符號(hào)。】
>> 試試 M-f 和 M-b。
如果光標(biāo)停在一個(gè)詞的中間,M-f 會(huì)移動(dòng)到這個(gè)詞的末尾。如果光標(biāo)處于詞與詞
之間的空白處,M-f 會(huì)移動(dòng)到下一個(gè)詞的末尾。M-b 的功能類(lèi)似,只是方向相反。
>> 按幾次 M-f 和 M-b,中間夾雜一些 C-f 和 C-b。
你可以觀察到 M-f 和 M-b 在不同位置上所表現(xiàn)出來(lái)的不同行為。
請(qǐng)注意 C-f 、C-b 和 M-f 、M-b 兩對(duì)之間的類(lèi)比關(guān)系。通常的慣例是:META 系
列組合鍵用來(lái)操作“由語(yǔ)言定義的單位(比如詞、句子、段落)”,而 CONTROL
系列組合鍵用來(lái)操作“與語(yǔ)言無(wú)關(guān)的基本單位(比如字符、行等等)”。
類(lèi)似的慣例在“行”與“句子”之間也同樣適用:C-a 和 C-e 可以將光標(biāo)移動(dòng)到
“一行”的頭部和尾部;而 M-a 和 M-e 則將光標(biāo)移動(dòng)到“一句”的頭部和尾部。
>> 按兩次 C-a,再按兩次 C-e。
按兩次 M-a,再按兩次 M-e。
想一想為什么重復(fù)的 C-a 命令會(huì)沒(méi)有作用,而重復(fù)的 M-a 命令則會(huì)讓光標(biāo)不斷
地回退到上一個(gè)句子。雖然這個(gè)類(lèi)比規(guī)律并不嚴(yán)格,但是很自然。
光標(biāo)停留的位置也可以稱(chēng)作“點(diǎn)位”(point)。或者干脆說(shuō),光標(biāo)指示出了屏幕
上“點(diǎn)位”在文本中的位置。
這里對(duì)簡(jiǎn)單的光標(biāo)移動(dòng)命令做一個(gè)總結(jié),其中也包括了整詞和整句的移動(dòng):
C-f 向右移動(dòng)一個(gè)字符
C-b 向左移動(dòng)一個(gè)字符
M-f 向右移動(dòng)一個(gè)詞【對(duì)中文是移動(dòng)到下一個(gè)標(biāo)點(diǎn)符號(hào)】
M-b 向左移動(dòng)一個(gè)詞【對(duì)中文是移動(dòng)到上一個(gè)標(biāo)點(diǎn)符號(hào)】
C-n 移動(dòng)到下一行
C-p 移動(dòng)到上一行
C-a 移動(dòng)到行首
C-e 移動(dòng)到行尾
M-a 移動(dòng)到句首
M-e 移動(dòng)到句尾
>> 把上面所有的命令都練習(xí)幾次,這些可都是最常用的命令。
這里還要介紹兩個(gè)重要的光標(biāo)移動(dòng)命令:M-< (META 小于號(hào))可以將光標(biāo)移動(dòng)到
所有文字的最開(kāi)頭;M-> (META 大于號(hào))可以將光標(biāo)移動(dòng)到所有文字的最末尾。
注意,在大部分鍵盤(pán)上,小于號(hào)(<)需要用上檔鍵(Shift)來(lái)輸入,所以在這
些鍵盤(pán)上你應(yīng)該用 Shift 鍵來(lái)輸入 M-<,如果不按 Shift 鍵,你輸入的會(huì)是
M-comma(META 逗號(hào))。
>> 試一試 M-< ,移到本快速指南的最開(kāi)始。
然后再按幾次 C-v 回到這里。
>> 試一試 M-> ,移到本快速指南的最末尾。
然后再按幾次 M-v 回到這里。
如果你的鍵盤(pán)上有方向鍵的話,也可以用它們來(lái)移動(dòng)光標(biāo)。不過(guò)我們有三個(gè)理由
推薦你學(xué)習(xí) C-b 、C-f 、C-n 、和 C-p:(1)它們?cè)谌魏捂I盤(pán)上都能用。(2)
當(dāng)你熟練使用 Emacs 之后,你會(huì)發(fā)現(xiàn)用這些組合鍵比用方向鍵要快得多,因?yàn)槟?br>的手不需要離開(kāi)打字區(qū)。(3)一旦你習(xí)慣了使用這些組合鍵,你也可以很容易地
適應(yīng)其它更高級(jí)的光標(biāo)移動(dòng)命令。
大部分的 Emacs 命令接受數(shù)字參數(shù),并且對(duì)于多數(shù)命令而言,這些數(shù)字參數(shù)的作
用是指定命令的重復(fù)次數(shù)。為一個(gè)命令指定數(shù)字參數(shù)(也就是重復(fù)次數(shù))的方法
是:先輸入 C-u,然后輸入數(shù)字作為參數(shù),最后再輸入命令。如果你有META (或
EDIT 或 ALT)鍵,那么還有另一種辦法:按住 META 鍵不放,然后輸入數(shù)字。不
過(guò)我們還是建議你用 C-u,因?yàn)樗谌魏谓K端機(jī)上都能用。這種數(shù)字參數(shù)也稱(chēng)為
“前綴參數(shù)”,意思是說(shuō)這個(gè)參數(shù)是先于使用它的命令而輸入的。
舉例來(lái)說(shuō), C-u 8 C-f 會(huì)向前移動(dòng) 8 個(gè)字符。
>> 為 C-n 或者 C-p 指定一個(gè)數(shù)字參數(shù),這樣你可以只用一個(gè)命令就把光標(biāo)移動(dòng)
到本行的附近。
雖然大部分命令把數(shù)字參數(shù)解釋為其重復(fù)次數(shù),但是也有些命令例外,它們將數(shù)
字參數(shù)另做它用。比如有些命令(我們目前還沒(méi)學(xué)到)僅僅將前綴參數(shù)作為一個(gè)
標(biāo)志――只要給出有一個(gè)前綴參數(shù),不管其值為何,它都會(huì)改變命令的功能。
而 C-v 和 M-v 則屬于另一種類(lèi)型的例外。當(dāng)給定一個(gè)參數(shù)時(shí),它們將滾動(dòng)你指
定的“行數(shù)”,而不是“屏數(shù)”。舉例來(lái)說(shuō),C-u 8 C-v 將屏幕向下滾動(dòng) 8 行,
而不是 8 屏。
>> 現(xiàn)在試試看,輸入 C-u 8 C-v。
這個(gè)命令應(yīng)該已經(jīng)將文字向上滾動(dòng)了 8 行。如果你想將它再次地向下滾動(dòng),你可
以給定一個(gè)參數(shù)然后執(zhí)行 M-v。
如果你正在使用一個(gè)窗口系統(tǒng),比如 X11 或者微軟的 Windows,那么在 Emacs
窗口的邊緣應(yīng)該有一個(gè)長(zhǎng)方形的區(qū)域叫“滾動(dòng)條”,你可以用鼠標(biāo)操縱滾動(dòng)條來(lái)
滾動(dòng)文字。
>> 試著在“滾動(dòng)條內(nèi)的反白區(qū)域”上按一下鼠標(biāo)中鍵。
文字應(yīng)該會(huì)滾動(dòng)到鼠標(biāo)所指示的位置。
>> 當(dāng)按住中鍵時(shí),試著將鼠標(biāo)上下移動(dòng)。
你會(huì)看到文字隨著鼠標(biāo)的移動(dòng)而上下滾動(dòng)。
【W(wǎng)indows 版本符合 Windows 程序的傳統(tǒng)操作習(xí)慣,上述操作不適用。】
* 在 EMACS 失去響應(yīng)的時(shí)候(WHEN EMACS IS HUNG)
-----------------------------------------------
如果 Emacs 對(duì)你的命令失去響應(yīng),你可以用 C-g 來(lái)安全地終止這條命令。C-g
也可以終止一條執(zhí)行過(guò)久的命令。
C-g 還可以取消數(shù)字參數(shù)和只輸入到一半的命令。
>> 輸入 C-u 100 設(shè)定一個(gè)值為 100 的數(shù)字參數(shù),然后按 C-g。
現(xiàn)在再按 C-f,光標(biāo)應(yīng)該只會(huì)移動(dòng)一個(gè)字符,因?yàn)槟阋呀?jīng)用 C-g 取消了參數(shù)。
如果你不小心按了一下 <ESC>,你也可以用 C-g 來(lái)取消它。
【這個(gè)說(shuō)法似乎有問(wèn)題,因?yàn)榘凑者@個(gè)按鍵順序輸入的應(yīng)該是 C-M-g。
取消 <ESC> 的正確做法是再連按兩次 <ESC>。】
* 被禁用的命令(DISABLED COMMANDS)
-----------------------------------
有一些 Emacs 命令被“禁用”了,以避免初學(xué)者在不了解其確切功能的情況下誤
用而造成麻煩。
如果你用到了一個(gè)被禁用的命令,Emacs 會(huì)顯示一個(gè)提示消息,告訴你這個(gè)命令
到底是干什么的,詢(xún)問(wèn)你是否要繼續(xù),并在得到你的肯定之后再執(zhí)行這命令。
如果你真的想用這條命令,在 Emacs 詢(xún)問(wèn)你的時(shí)候應(yīng)該按空格。一般來(lái)說(shuō),如果
你不想用,就按“n”。
>> 試試 C-x C-l (這是一個(gè)被禁用的命令)
然后用 n 來(lái)回答詢(xún)問(wèn)。
* 窗格(WINDOWS)
-----------------
Emacs 可以有多個(gè)窗格,每個(gè)窗格顯示不同的文字。后面會(huì)介紹怎么對(duì)付多個(gè)窗
格,現(xiàn)在我們先學(xué)會(huì)如何關(guān)掉多余的窗格。其實(shí)也很簡(jiǎn)單:
C-x 1 只保留一個(gè)窗格(也就是關(guān)掉其它所有窗格)。
也就是先按 CONTROL-x 然后再按 1。C-x 1 會(huì)保留光標(biāo)所在的窗格,并將其擴(kuò)大
到整個(gè)屏幕,同時(shí)關(guān)掉所有其它的窗格。
>> 把光標(biāo)移到本行然后輸入 C-u 0 C-l。
>> 輸入 CONTROL-h k CONTROL-f。觀察當(dāng)一個(gè)新窗格出現(xiàn)時(shí)當(dāng)前窗格(用來(lái)顯示
CONTROL-f 命令的文檔)是如何縮小的。
>> 輸入 C-x 1 關(guān)掉文檔窗格。
這個(gè)命令跟先前學(xué)過(guò)的命令不太一樣,因?yàn)樗藘蓚€(gè)字符,以 CONTROL-x 開(kāi)
始。有一系列命令都是以 CONTROL-x 開(kāi)始的,這些命令許多都跟“窗格、文件、
緩沖區(qū)【緩沖區(qū)(buffer)會(huì)在后文詳細(xì)介紹】”等等諸如此類(lèi)的東西有關(guān),其
中有些命令可能包含了 2 個(gè)、3 個(gè)或者 4 個(gè)字符。
* 插入與刪除(INSERTING AND DELETING)
--------------------------------------
插入文字很簡(jiǎn)單,直接敲鍵盤(pán)就可以了。你能看到的字符,比如 A、7、* 等等,
都被 Emacs 視為文字并且可以直接插入。敲 <Return>(回車(chē)鍵)會(huì)插入一個(gè)換
行符。
你可以用 <Delback> 來(lái)刪除最后輸入的一個(gè)字符,這個(gè)跟你在 Emacs 之外的用
法應(yīng)該一樣。一般來(lái)說(shuō) <Delback> 就是位于 <Return> 鍵上方某處的一個(gè)大塊頭
的鍵,通常被標(biāo)示為“Delete”、“Del”或者“Backspace”。
如果你找到了“Backspace”鍵,那么它應(yīng)該就是 <Delback>;這時(shí)哪怕你又在別
的地方找到了一個(gè)“Del”鍵,那么它也應(yīng)該不是 <Delback>。
一種更通用的說(shuō)法是,<Delback> 將刪除位于光標(biāo)前的一個(gè)字符。
>> 現(xiàn)在就來(lái)試試――敲點(diǎn)字,然后按幾下 <Delback> 刪除它們。
不用擔(dān)心文件被修改,你做什么都沒(méi)關(guān)系,這里就是專(zhuān)給你練習(xí)用的。
如果一行文字很長(zhǎng)、超出了窗格的寬度,顯示不下的部分會(huì)在緊鄰的下一行繼續(xù)
顯示。這時(shí)會(huì)有一個(gè)反斜線(在控制臺(tái)下是反斜線,如果你用圖形窗口系統(tǒng),則
應(yīng)該是一個(gè)小小的轉(zhuǎn)彎箭頭)顯示在右邊沿,表明這是某一行的接續(xù)顯示。
>> 輸入文字,一直到屏幕的右邊界,然后繼續(xù),你會(huì)看到一個(gè)接續(xù)行出現(xiàn)。
>> 用 <Delback> 刪掉一些文字,直到此行長(zhǎng)度小于窗格寬度,接續(xù)行就消失了。
換行符跟其它字符一樣可以被刪除。兩行中間的換行符被刪除后,這兩行將會(huì)合
并成一行。如果合并后的這一行太長(zhǎng),超出了窗格寬度,它就會(huì)以一個(gè)接續(xù)行來(lái)
顯示。
>> 移動(dòng)光標(biāo)到某行的開(kāi)頭并輸入 <Delback>。
這時(shí)該行將與其前一行一起被合并為一行。
>> 輸入 <Return> 重新插入你剛才刪除的換行符。
前面講過(guò),大部分的 Emacs 命令都可以指定重復(fù)次數(shù),這其中也包括輸入字符的
命令。重復(fù)執(zhí)行輸入字符的命令實(shí)際上就是輸入多個(gè)相同的字符。
>> 試試 C-u 8 *,這將會(huì)插入 ********。
好,現(xiàn)在你應(yīng)該已經(jīng)掌握了最基本的的文本插入和修改功能,其實(shí)刪除還可以
“以詞為單位”進(jìn)行,下面是一個(gè)關(guān)于“刪除”操作的小結(jié):
<Delback> 刪除光標(biāo)前的一個(gè)字符
C-d 刪除光標(biāo)后的一個(gè)字符
M-<Delback> 移除光標(biāo)前的一個(gè)詞
M-d 移除光標(biāo)后的一個(gè)詞
C-k 移除從光標(biāo)到“行尾”間的字符
M-k 移除從光標(biāo)到“句尾”間的字符
【可能你已經(jīng)注意到了“刪除(delete)”和“移除(kill)”的用詞區(qū)別,后
文會(huì)有詳細(xì)說(shuō)明。】
注意“<Delback> 和 C-d”還有“M-<Delback> 和 M-d”是根據(jù)前述慣例從 C-f
和 M-f 衍生出來(lái)的(其實(shí)<Delback>不是控制字符,我們先忽略這一點(diǎn))。C-k
和 M-k 的關(guān)系在某種程度上與 C-e 和 M-e 一樣――如果把“一行”和“一句”
作一個(gè)類(lèi)比的話。
你也可以用一種通用的辦法來(lái)移除緩沖區(qū)里的任何一部分:首先把光標(biāo)移動(dòng)到你
想要移除的區(qū)域的一端,然后按 C-@ 或 C-SPC(任一即可,SPC指空格)【注意,
C-SPC 往往被中文用戶(hù)設(shè)定成輸入法熱鍵,如果這樣,C-SPC 就被系統(tǒng)攔截而無(wú)
法傳遞給 Emacs 了,因此這里還是推薦使用C-@。】,然后將光標(biāo)移動(dòng)到另一端,
再按 C-w 就可以把位于這兩點(diǎn)之間的所有文字移除了。
>> 移動(dòng)光標(biāo)到上一段開(kāi)頭的“你”字。
>> 輸入 C-@ 。Emacs 應(yīng)該會(huì)在屏幕的下方顯示一個(gè)“Mark set”的消息。
>> 移動(dòng)光標(biāo)到第二行中的“端”字。
>> 輸入 C-w,從“你”開(kāi)始到“端”之前的文字被全部移除。
注意,“移除(kill)”和“刪除(delete)”的不同在于被移除的東西可以找回
來(lái),而被刪除的就不行了。【實(shí)際上,移除掉的東西雖然看起來(lái)“消失”了,但
實(shí)際上被 Emacs 記錄了下來(lái),因此還可以找回來(lái);而刪除掉的東西雖然也可能還
在內(nèi)存里,但是已經(jīng)被 Emacs“拋棄”了,所以就找不回來(lái)了。】重新插入被移
除的文字稱(chēng)為“召回(yank)”。一般而言,那些可能消除很多文字的命令會(huì)把
消除掉的文字記錄下來(lái)(它們被設(shè)定成了“可召回”),而那些只消除一個(gè)字符
或者只消除空白的命令就不會(huì)記錄被消除的內(nèi)容(自然你也就無(wú)法召回了)。
>> 移動(dòng)光標(biāo)到一非空白行的行頭,然后輸入 C-k 移除那一行上的文字。
>> 再次 C-k,你可以看到它移除了跟在那一行后面的換行符。
注意,單獨(dú)的 C-k 會(huì)把一行的內(nèi)容移除,而第二個(gè) C-k 則會(huì)移除換行符,并使
其后所有的行都向上移動(dòng)。C-k 處理數(shù)字參數(shù)的方式很特別,它會(huì)把參數(shù)指定的
那么多行連同其后的換行符一起移除,而不僅僅是重復(fù) C-k 而已。比如 C-u 2
C-k 會(huì)把兩行以及它們的換行符移除;而如果只是輸入 C-k 兩次顯然不是這個(gè)結(jié)
果。
將被移除的文字恢復(fù)的動(dòng)作稱(chēng)為“召回(yanking)”。(就好像把別人從你身邊
移走的東西又猛力地拉回來(lái)。)你可以在你刪除文字的地方召回,也可以在別的
地方召回,還可以多次召回同樣的文字以得到它的多個(gè)拷貝。
召回的命令是 C-y。它會(huì)在光標(biāo)所在處插入你最后移除的文字。
>> 試試看,輸入 C-y 將文字召回。
如果你一次連按了好幾下 C-k,那么所有被移除的行會(huì)被存儲(chǔ)在一起,只要一個(gè)
C-y 就可以把它們都召回。
>> 在這里試試,連續(xù)按幾次 C-k。
現(xiàn)在再來(lái)恢復(fù)剛剛被我們移除的文字:
>> 按 C-y。然后把光標(biāo)往下移動(dòng)幾行,再按一次 C-y。
現(xiàn)在你應(yīng)該知道怎么復(fù)制文字了。
C-y 可以召回最近一次移除的內(nèi)容,那如何召回前幾次移除的內(nèi)容呢?它們當(dāng)然
沒(méi)有丟,你可以用 M-y 來(lái)召回它們。在用 C-y 召回最近移除的文字之后,緊接
著再按 M-y 就可以召回再前一次被移除的內(nèi)容,再按一次 M-y 又可以召回再上
一次的……連續(xù)使用 M-y 直到找到你想要召回的東西,然后什么也不用做,繼續(xù)
編輯就行了。
如果連續(xù)按 M-y 很多次,你可能會(huì)回到起始點(diǎn),也就是最近移除的文字。
【看得出這實(shí)際上是一個(gè)環(huán)。】
>> 移除一行,移動(dòng)一下光標(biāo),然后再移除另外一行。
按 C-y 將第二次移除的那行召回來(lái)。
緊接著再按 M-y,它將會(huì)被第一次移除的那行取代。
試著再按幾下 M-y 看看會(huì)發(fā)生什么。
再繼續(xù),直到第二行被召回來(lái),然后再做個(gè)幾次。
如果感興趣,你可以試著給 M-y 指定一個(gè)正的或負(fù)的參數(shù)。
* 撤銷(xiāo)(UNDO)
--------------
如果你修改了一段文字,又覺(jué)得改得不好,可以用 undo 命令進(jìn)行撤銷(xiāo):
C-x u。
通常 C-x u 會(huì)消除一個(gè)命令所造成的所有改變;如果你在一行中連續(xù)多次地使用
C-x u,你會(huì)把以前的命令也依次撤銷(xiāo)。
但是有兩個(gè)例外:
1) 沒(méi)有改變文字的命令不算(包括光標(biāo)移動(dòng)命令和滾動(dòng)命令)
2) 從鍵盤(pán)輸入的字符以組為單位――每組 20 個(gè)字符――來(lái)進(jìn)行處理。
(這是為了減少你在撤銷(xiāo)“插入文字”動(dòng)作時(shí)需要輸入 C-x u 的次數(shù))
>> 用 C-k 將這一行移除,然后輸入 C-x u ,它會(huì)再次出現(xiàn)。
C-_ 也是撤銷(xiāo)命令;它的作用跟 C-x u 一樣,但是它比較容易多次輸入。C-_ 的
缺點(diǎn)是在某些鍵盤(pán)上可能不太容易按,這也正是我們同時(shí)提供 C-x u 的原因。在
某些終端上,你可以按住 CONTROL 再按“/”來(lái)輸入 C-_。
數(shù)字參數(shù)對(duì)于 C-_ 和 C-x u 的意義是執(zhí)行撤銷(xiāo)的重復(fù)次數(shù)。
* 文件(FILE)
--------------
想保存工作成果就要記得存盤(pán),否則一旦退出 Emacs 你編輯的文字就會(huì)丟失。要
存盤(pán),就要在編輯前“尋找”到一個(gè)存盤(pán)文件。(這個(gè)過(guò)程通常也被稱(chēng)為“訪問(wèn)”
文件。)
尋找到一個(gè)文件意味著你可以在 Emacs 里查看這個(gè)文件的內(nèi)容。從許多角度看,
這就等于你在直接編輯這個(gè)文件,只是你所做的修改只有在“存盤(pán)”的時(shí)候才會(huì)
被寫(xiě)入文件。也正因?yàn)槿绱耍憧梢詠G棄一個(gè)寫(xiě)到一半的文件而不必把這個(gè)殘缺
文件也保存到計(jì)算機(jī)上。在存盤(pán)的時(shí)候,Emacs 會(huì)把存盤(pán)前的文件重命名保存,
以防你改完之后又想反悔。
在屏幕的下方,你應(yīng)該能夠看到頭尾都是短線“-”的一行,行首通常是一些諸如
“--:-- TUTORIAL.cn”的文字,這些文字代表了你當(dāng)前正在訪問(wèn)的文件。比如你
現(xiàn)在正在訪問(wèn)的文件叫“TUTORIAL.cn”,它只是一個(gè)給你臨時(shí)使用的拷貝。每當(dāng)
Emacs 尋找到一個(gè)文件,文件名就會(huì)出現(xiàn)在這個(gè)位置。
尋找文件的命令有一個(gè)特點(diǎn),那就是你必須給出文件名。我們稱(chēng)這個(gè)命令“從終
端讀入了一個(gè)參數(shù)”(在這里,這個(gè)參數(shù)顯然就是文件名)。在你輸入這條命令
之后:
C-x C-f 尋找一個(gè)文件
Emacs 會(huì)提示你輸入文件名。你輸入的文件名會(huì)出現(xiàn)在屏幕最底端的一行,這一
行被稱(chēng)為小緩沖(minibuffer),在小緩沖里你可以使用通常的 Emacs 編輯命令
來(lái)編輯文件名。
在小緩沖里輸入文件名(其實(shí)輸入其它東西也一樣)時(shí)可以用 C-g 取消。
>> 輸入 C-x C-f,然后輸入 C-g
這會(huì)關(guān)掉小緩沖,同時(shí)也會(huì)取消使用小緩沖的 C-x C-f 命令。
當(dāng)然了,你也沒(méi)有找任何文件。
用 <Return> 結(jié)束文件名的輸入。這之后 C-x C-f 命令開(kāi)始工作并找到你指定的
文件。小緩沖在 C-x C-f 命令結(jié)束之后也會(huì)消失。
眨眼間文件就被顯示在屏幕上,你可以開(kāi)始編輯了。存盤(pán)用這條命令:
C-x C-s 儲(chǔ)存這個(gè)文件
這條命令把 Emacs 中的文字存儲(chǔ)到文件中。第一次存盤(pán)的時(shí)候 Emacs 會(huì)將原文
件重命名以備份。重命名的規(guī)則通常是在原文件名之后添加一個(gè)“~”字符。
【對(duì)許多人來(lái)說(shuō),這是一個(gè)煩人的特性,關(guān)掉文件備份可以用如下命令:
M-x customize-variable <Return> make-backup-files <Return>】
存盤(pán)結(jié)束后,Emacs 會(huì)顯示寫(xiě)入文件的文件名。你最好養(yǎng)成經(jīng)常存盤(pán)的習(xí)慣,這
可以減少系統(tǒng)崩潰和死機(jī)給你帶來(lái)的損失。
>> 輸入 C-x C-s 把本快速指南存下來(lái)。
你會(huì)在屏幕的下方看到一條消息:“Wrote
TUTORIAL.cn”。
你不但可以尋找一個(gè)已有的文件來(lái)查看或編輯,還可以尋找一個(gè)不存在的文件。
實(shí)際上這正是 Emacs 創(chuàng)建新文件的方法:找到不存在的新文件。只有在存盤(pán)的時(shí)
候,Emacs 才會(huì)真正創(chuàng)建這個(gè)文件。而在這之后的一切就跟編輯一個(gè)已有文件沒(méi)
有區(qū)別了。
* 緩沖區(qū)(BUFFER)
------------------
你可以用 C-x C-f 找到并打開(kāi)第二個(gè)文件,但第一個(gè)文件仍然在 Emacs 中。要
切回第一個(gè)文件,一種辦法是再用一次 C-x C-f。這樣,你就可以在 Emacs 中同
時(shí)打開(kāi)多個(gè)文件。
>> 用 C-x C-f foo <Return> 的方式建立一個(gè)名為“foo”的文件。
輸入一些文字,再用 C-x C-s 保存文件“foo”。
最后,輸入 C-x C-f TUTORIAL.cn <Return> 回到這里。
Emacs 把每個(gè)編輯中的文件都放在一個(gè)稱(chēng)為“緩沖區(qū)(buffer)”的地方。每尋
找到一個(gè)文件,Emacs 就在其內(nèi)部開(kāi)辟一個(gè)緩沖區(qū)。用下面的命令可以列出當(dāng)前
所有的緩沖區(qū):
C-x C-b 列出緩沖區(qū)
>> 現(xiàn)在就試一下 C-x C-b
觀察一下緩沖區(qū)是如何被命名的,它很可能跟與其對(duì)應(yīng)的文件同名。實(shí)際上,一
個(gè) Emacs 窗格里的任何文字都是某個(gè)緩沖區(qū)的一部分。
>> 輸入 C-x 1 離開(kāi)緩沖區(qū)列表
不管存在多少緩沖區(qū),任何時(shí)候都只能有一個(gè)“當(dāng)前”緩沖區(qū),也就是你正在編
輯的這個(gè)。如果你想編輯其它的緩沖區(qū),就必須“切換”過(guò)去。上面講過(guò),用
C-x C-f 是一種辦法。不過(guò)還有一個(gè)更簡(jiǎn)單的辦法,那就是用 C-x b。用這條命
令,你必須輸入緩沖區(qū)的名稱(chēng)。
>> 輸入 C-x b foo <Return> 以回到文件“foo”的緩沖區(qū)。
然后輸入 C-x b TUTORIAL.cn <Return> 回到這里。
大多數(shù)情況下,緩沖區(qū)與跟其對(duì)應(yīng)的文件是同名的(不包括目錄名),不過(guò)這也
不是絕對(duì)的。用 C-x C-b 得到的緩沖區(qū)列表總是顯示緩沖區(qū)名。
你在 Emacs 窗格里看到的“任何”文字都一定屬于某個(gè)緩沖區(qū)。然而,緩沖區(qū)未
必有對(duì)應(yīng)文件:比如顯示緩沖區(qū)列表的緩沖區(qū)就是這樣。再比如“*Messages*”
緩沖區(qū)也沒(méi)有對(duì)應(yīng)文件,這個(gè)緩沖區(qū)里存放的都是在 Emacs 底部出現(xiàn)的消息。
>> 輸入 C-x b *Messages* <Return> 瞅瞅消息緩沖區(qū)里都有什么東西。
然后再輸入 C-x b TUTORIAL.cn <Return> 回到這里。
如果你對(duì)某個(gè)文件做了些修改,然后切換到另一個(gè)文件,這個(gè)動(dòng)作并不會(huì)幫你把
前一個(gè)文件存盤(pán)。對(duì)第一個(gè)文件的修改仍然僅存在于 Emacs 中,也就是在它對(duì)應(yīng)
的緩沖區(qū)里。并且,對(duì)第二個(gè)文件的修改也不會(huì)影響到第一個(gè)文件。這很有用,
但是也挺麻煩:因?yàn)槿绻阆胍鎯?chǔ)第一個(gè)文件,還需要先 C-x C-f 切換回去再
用 C-x C-s 存盤(pán)。你需要一個(gè)更簡(jiǎn)便的方法,而 Emacs 已經(jīng)為你準(zhǔn)備好了:
C-x s 保存多個(gè)緩沖區(qū)
C-x s 會(huì)找出所有已被修改但尚未存盤(pán)的緩沖區(qū),然后向你逐個(gè)詢(xún)問(wèn):是否需要
存盤(pán)?
>> 插入一行文字,然后輸入 C-x s。
它應(yīng)該會(huì)問(wèn)你,是否要儲(chǔ)存名為 TUTORIAL.cn 的緩沖區(qū)?
按“y”告訴它你想存盤(pán)。
* 命令集擴(kuò)展(EXTENDING THE COMMAND SET)
-----------------------------------------
Emacs 的命令就像天上的星星,數(shù)也數(shù)不清。把它們都對(duì)應(yīng)到 CONTROL 和 META
組合鍵上顯然是不可能的。Emacs 用擴(kuò)展(eXtend)命令來(lái)解決這個(gè)問(wèn)題,擴(kuò)展
命令有兩種風(fēng)格:
C-x 字符擴(kuò)展。 C-x 之后輸入另一個(gè)字符或者組合鍵。
M-x 命令名擴(kuò)展。M-x 之后輸入一個(gè)命令名。
很多擴(kuò)展命令都相當(dāng)有用,雖然與你已經(jīng)學(xué)過(guò)的命令比起來(lái),他們可能不那么常
用。我們?cè)缫呀?jīng)見(jiàn)過(guò)一些擴(kuò)展命令了,比如用 C-x C-f 尋找文件和用 C-x C-s
保存文件;退出 Emacs 用的 C-x C-c 也是擴(kuò)展命令。(不用擔(dān)心退出 Emacs 會(huì)
給你帶來(lái)什么損失,Emacs 會(huì)在退出之前提醒你存盤(pán)的)
在控制臺(tái)下,C-z 可以暫時(shí)離開(kāi) Emacs――當(dāng)然,你還可以再回來(lái)。
在允許 C-z 的系統(tǒng)中,C-z 會(huì)把 Emacs“掛起”,也就是說(shuō),它會(huì)回到 shell
但不退出 Emacs。在常用的 shell 中,通常可以用“fg”或者“%emacs”命令再
次回到 Emacs 中。
在沒(méi)有提供掛起功能的系統(tǒng)中,C-z 會(huì)在 Emacs 之下創(chuàng)建一個(gè)子 shell 來(lái)讓你
運(yùn)行其它程序,并且再次“回到”Emacs 中――雖然我們并沒(méi)有真正離開(kāi)過(guò)。這
種情況下,通常用 shell 命令“exit”從子 shell 回到 Emacs。
你最好在打算退出登陸的時(shí)候再用 C-x C-c。在 Emacs 被諸如郵件處理程序之類(lèi)
的外部程序調(diào)用之后,也可以用 C-x C-c 退出。不過(guò)一般來(lái)講,如果你不想退出
登錄,最好還是把 Emacs 掛起而不是退出。
C-x 的擴(kuò)展命令有很多,下面列出的是你已經(jīng)學(xué)過(guò)的:
C-x C-f 尋找文件。
C-x C-s 保存文件。
C-x C-b 列出緩沖區(qū)。
C-x C-c 離開(kāi) Emacs。
C-x 1 關(guān)掉其它所有窗格,只保留一個(gè)。
C-x u 撤銷(xiāo)。
用命令名擴(kuò)展的命令通常并不常用,或只用在部分模式下。比如 replace-string
(字符串替換)這個(gè)命令,它會(huì)在全文范圍內(nèi)把一個(gè)字符串替換成另一個(gè)。在輸
入 M-x 之后,Emacs 會(huì)在屏幕底端向你詢(xún)問(wèn)并等待你輸入命令名。如果你想輸入
“replace-string”,其實(shí)只需要敲“repl s<TAB>”就行了,Emacs 會(huì)幫你自動(dòng)
補(bǔ)齊。輸入完之后按 <Return> 。
字符串替換命令需要兩個(gè)參數(shù)――被替換的字符串和用來(lái)替換它的字符串。每個(gè)
參數(shù)的輸入都以換行符來(lái)結(jié)束。
>> 將光標(biāo)移到本行下面第二行的空白處,然后輸入
M-x repl s<Return>changed<Return>altered<Return>。
【以下保留一行原文,以應(yīng)練習(xí)之需:】
Notice how this line has changed: you've replaced
請(qǐng)注意這一行的變化:在光標(biāo)之后的范圍內(nèi),你已經(jīng)將“changed”這個(gè)詞――不
論它在哪里出現(xiàn)――全部用“altered”替換掉了。
* 自動(dòng)保存(AUTO SAVE)
-----------------------
如果你已經(jīng)修改了一個(gè)文件,但是還沒(méi)來(lái)得及存盤(pán)你的計(jì)算機(jī)就罷工了,那么你
所做的修改就很可能會(huì)丟失。為了避免這樣的不幸發(fā)生,Emacs 會(huì)定期將正在編
輯的文件寫(xiě)入一個(gè)“自動(dòng)保存”文件中。自動(dòng)保存文件的文件名的頭尾各有一個(gè)
“#”字符,比如你正在編輯的文件叫“hello.c”,那么它的自動(dòng)保存文件就叫
“#hello.c#”。這個(gè)文件會(huì)在正常存盤(pán)之后被 Emacs 刪除。
所以,假如不幸真的發(fā)生了,你大可以從容地打開(kāi)原來(lái)的文件(注意不是自動(dòng)保
存文件)然后輸入 M-x recover file<Return> 來(lái)恢復(fù)你的自動(dòng)保存文件。在提
示確認(rèn)的時(shí)候,輸入 yes<Return>。
* 回顯區(qū)(ECHO AREA)
---------------------
如果 Emacs 發(fā)現(xiàn)你輸入多字符命令的節(jié)奏很慢,它會(huì)在窗格的下方稱(chēng)為“回顯區(qū)”
的地方給你提示。回顯區(qū)位于屏幕的最下面一行。
* 狀態(tài)欄(MODE LINE)
---------------------
位于回顯區(qū)正上方的一行被稱(chēng)為“狀態(tài)欄”。狀態(tài)欄上會(huì)顯示一些信息,比如:
--:** TUTORIAL.cn (Fundamental)--L670--54%----------------
狀態(tài)欄顯示了 Emacs 的狀態(tài)和你正在編輯的文字的一些信息。
你應(yīng)該知道文件名的意思吧?就是你找到的那個(gè)文件嘛。-NN%-- 顯示的是光標(biāo)在
全文中的位置。如果位于文件的開(kāi)頭,那么就顯示 --Top-- 而不是 --00%--;如
果位于文件的末尾,就顯示 --Bot--。如果文件很小,一屏就足以顯示全部?jī)?nèi)容,
那么狀態(tài)欄會(huì)顯示 --All--。
“L” 和其后的數(shù)字給出了光標(biāo)所在行的行號(hào)。
最開(kāi)頭的星號(hào)(*)表示你已經(jīng)對(duì)文字做過(guò)改動(dòng)。剛剛打開(kāi)的文件肯定沒(méi)有被改動(dòng)
過(guò),所以狀態(tài)欄上顯示的不是星號(hào)而是短線(-)。
狀態(tài)欄上小括號(hào)里的內(nèi)容告訴你當(dāng)前正在使用的編輯模式。缺省的模式是
Fundamental,就是你現(xiàn)在正在使用的這個(gè)。它是一種“主模式”。
Emacs 的主模式林林總總。有用來(lái)編輯程序代碼的――比如 Lisp 模式;也有用
來(lái)編輯各種自然語(yǔ)言文本的――比如 Text 模式。任何情況下只能應(yīng)用一個(gè)主模
式,其名稱(chēng)會(huì)顯示在狀態(tài)欄上,也就是現(xiàn)在顯示“Fundamental”的地方。
主模式通常會(huì)改變一些命令的行為。比方說(shuō),不管編輯什么語(yǔ)言的程序代碼,你
都可以用一個(gè)相同的命令來(lái)添加注釋。但是在不同的語(yǔ)言中注釋的語(yǔ)法往往是不
同的,這時(shí)不同的主模式就會(huì)用各自不同的語(yǔ)法規(guī)則來(lái)添加注釋。主模式都是可
以用 M-x 啟動(dòng)的擴(kuò)展命令,M-x fundamental-mode 就可以切換到 Fundamental
模式。
編輯自然語(yǔ)言文本――比如現(xiàn)在――應(yīng)該用 Text 模式。
>> 輸入 M-x text mode<Return>。
別擔(dān)心,什么都沒(méi)變。不過(guò)細(xì)心一些可以發(fā)現(xiàn),M-f 和 M-b 現(xiàn)在把單引號(hào)(')
視為詞的一部分了。而在先前的 Fundamental 模式中,M-f 和 M-b 都將單引號(hào)
視為分隔單詞的符號(hào)。
主模式通常都會(huì)搞一些類(lèi)似的小動(dòng)作,因?yàn)楹芏嗝钇鋵?shí)完成的是“相同的工
作”,只是在不同環(huán)境下會(huì)有不同的工作方式而已。【所謂“求同存異”,在
Emacs 里得到了很好的體現(xiàn)】
用 C-h m 可以查看當(dāng)前主模式的文檔。
>> 用 C-u C-v 將本行帶到屏幕的最上方。
>> 輸入 C-h m,看看 Text 模式與 Fundamental 模式有哪些不同。
>> 輸入 C-x 1 關(guān)掉文檔窗格。
主模式之所以稱(chēng)之為“主(major)”模式,是因?yàn)橥瑫r(shí)還有“輔模式”(minor
mode)存在。輔模式并不能替代主模式,而是提供一些輔助的功能。每個(gè)輔模式
都可以獨(dú)立地開(kāi)啟和關(guān)閉,跟其它輔模式無(wú)關(guān),跟主模式也無(wú)關(guān)。所以你可以不
使用輔模式,也可以只使用一個(gè)或同時(shí)使用多個(gè)輔模式。
有一個(gè)叫做自動(dòng)折行(Auto Fill)的輔模式很有用,特別是在編輯自然語(yǔ)言文本
的時(shí)候。啟用自動(dòng)折行后,Emacs 會(huì)在你打字超出一行邊界時(shí)自動(dòng)替你換行。
用 M-x auto fill mode<Return> 啟動(dòng)自動(dòng)折行模式。再用一次這條命令,自動(dòng)
折行模式會(huì)被關(guān)閉。也就是說(shuō),如果自動(dòng)折行模式?jīng)]有被開(kāi)啟,這個(gè)命令會(huì)開(kāi)啟
它;如果已經(jīng)開(kāi)啟了,這個(gè)命令會(huì)關(guān)閉它。所以我們說(shuō),這個(gè)命令可以用來(lái)“開(kāi)
關(guān)(toggle)”模式。
>> 現(xiàn)在輸入 M-x auto fill mode<Return>。然后隨便敲點(diǎn)什么,直到你看到它
分成兩行。你必須敲一些空格,因?yàn)?nbsp;Auto Fill 只在空白處進(jìn)行斷行。
【輸入空格對(duì)英文來(lái)說(shuō)是必須的,而對(duì)中文則不必。】
行邊界通常被設(shè)定為 70 個(gè)字符【這里指英文字符】,你可以用 C-x f 命令配合
數(shù)字參數(shù)來(lái)重新設(shè)定它。
>> 輸入 C-x f 并傳遞參數(shù) 20: C-u 2 0 C-x f。
然后輸入一些文字,觀察 Emacs 的自動(dòng)折行動(dòng)作
最后再用 C-x f 將邊界設(shè)回 70。
如果你在段落的中間做了一些修改,那么自動(dòng)折行模式不會(huì)替你把整個(gè)段落重新
折行,你需要用 M-q 手動(dòng)折行。注意,光標(biāo)必須位于你需要折行的那一段里。
>> 移動(dòng)光標(biāo)到前一段中,然后輸入 M-q。
* 搜索(SEARCHING)
-------------------
Emacs 可以向前或向后搜索字符串。搜索命令是一個(gè)移動(dòng)光標(biāo)的命令:搜索成功
后,光標(biāo)會(huì)停留在搜索目標(biāo)出現(xiàn)的地方。
Emacs 的搜索命令的獨(dú)特之處在于,它是“漸進(jìn)的(incremental)”。意思是搜
索與輸入同時(shí)進(jìn)行:你在鍵盤(pán)上一字一句地輸入搜索詞的過(guò)程中,Emacs 就已經(jīng)
開(kāi)始替你搜索了。
C-s 是向前搜索,C-r 是向后搜索。不過(guò)手別這么快!別著急試。
在按下 C-s 之后,回顯區(qū)里會(huì)有“I-search”字樣出現(xiàn),表明目前 Emacs 正處
于“漸進(jìn)搜索”狀態(tài),并等待你輸入搜索字串。按 <Return> 可以結(jié)束搜索。
>> 輸入 C-s 開(kāi)始一個(gè)搜索。注意敲慢一點(diǎn),一次輸入一個(gè)字符。
慢慢輸入“cursor”這個(gè)詞,每敲一個(gè)字都停頓一下并觀察光標(biāo)。
現(xiàn)在你應(yīng)該已曾經(jīng)找到“cursor”這個(gè)詞了。
>> 再按一次 C-s,搜索下一個(gè)“cursor”出現(xiàn)的位置。
>> 現(xiàn)在按四次退格鍵,看看光標(biāo)是如何移動(dòng)的。
>> 敲 <Return> 結(jié)束搜索。
看仔細(xì)了么?在一次漸進(jìn)式搜索中,Emacs 會(huì)嘗試跳到搜索目標(biāo)出現(xiàn)的位置。要
跳到下一個(gè)命中位置,就再按一次 C-s。如果找不到目標(biāo),Emacs 會(huì)發(fā)出“嗶”
的一聲,告訴你搜索失敗。在整個(gè)過(guò)程中,都可以用 C-g 來(lái)終止搜索。【你會(huì)發(fā)
現(xiàn) C-g 會(huì)讓光標(biāo)回到搜索開(kāi)始的位置,而 <Return> 則讓光標(biāo)留在搜索結(jié)果上,
這是很有用的功能。】
注意:在某些終端下,輸入 C-x C-s 會(huì)凍結(jié)屏幕【屏幕沒(méi)有任何輸出】,使你看
不到 Emacs 的任何變化。其原因是操作系統(tǒng)的“流量控制”功能攔截了 C-s 并
凍結(jié)了屏幕。用 C-q 可以解除屏幕凍結(jié)。要解決這個(gè)問(wèn)題,請(qǐng)參考 Emacs 手冊(cè)
里的“Spontaneous Entry to Incremental Search”一節(jié)【Emacs 手冊(cè)可能還沒(méi)
有中文翻譯】,那里提供了一些有用的建議。
在漸進(jìn)式搜索中,按退格鍵會(huì)刪除目標(biāo)字符串的最后一個(gè)字符,并且光標(biāo)會(huì)回到
最近一次搜索的命中位置。比如你已經(jīng)輸入了“c”,光標(biāo)就停在“c”第一次出
現(xiàn)的位置,再輸入“u”,光標(biāo)停在“cu”第一次出現(xiàn)的位置,這時(shí)再按退格鍵,
“u”就從搜索字串中消失了,然后光標(biāo)會(huì)回到“c”第一次出現(xiàn)的位置。
另外,如果你在搜索的時(shí)候輸入了 CONTROL 或者 META 組合鍵的話,搜索可能會(huì)
結(jié)束。(也有例外,比如 C-s 和 M-r 這些用于搜索的命令。)
前面說(shuō)的都是“向下”搜索,如果想“向上”搜索,可以用 C-r。C-r 與 C-s
相比除了搜索方向相反之外,其余的操作都一樣。
* 多窗格(MULTIPLE WINDOWS)
----------------------------
Emacs 的迷人之處很多,能夠在屏幕上同時(shí)顯示多個(gè)窗格就是其中之一。
>> 移動(dòng)光標(biāo)到這一行,然后輸入 C-u 0 C-l。
>> 現(xiàn)在輸入 C-x 2,它會(huì)將屏幕劃分成兩個(gè)窗格。
這兩個(gè)窗格里顯示的都是本篇快速指南,而光標(biāo)則停留在上方的窗格里。
>> 試試用 C-M-v 滾動(dòng)下方的窗格。
(如果你并沒(méi)有 META 鍵,用 ESC C-v 也可以。)
【向上滾動(dòng)是 C-M-S-v,也就是同時(shí)按住 CONTROL、META 和 SHIFT 再按 v】
>> 輸入 C-x o(“o”指的是“其它(other)”),
將光標(biāo)轉(zhuǎn)移到下方的窗格。
>> 在下方的窗格中,用 C-v 和 M-v 來(lái)滾動(dòng)。
同時(shí)繼續(xù)在上方的窗格里閱讀這些指導(dǎo)。
>> 再輸入 C-x o 將光標(biāo)移回到上方的窗格里。
光標(biāo)會(huì)回到它在上方窗格中原本所在的位置。
連續(xù)使用 C-x o 可以遍歷所有窗格。每一個(gè)窗格都有它自己的光標(biāo)位置,但是只
有一個(gè)窗格會(huì)真正顯示這個(gè)光標(biāo)。【其它窗格在控制臺(tái)下不會(huì)顯示光標(biāo),在圖形
窗口下缺省顯示為鏤空光標(biāo)。】一般所有的編輯命令都作用于這個(gè)光標(biāo)所在的窗
格,我們稱(chēng)這個(gè)窗格為“被選中的窗格”。
當(dāng)你在一個(gè)窗格中編輯,但用另一個(gè)窗格作為參考的時(shí)候,C-M-v 是很有用的命
令。你可以始終處于編輯窗格中,然后用 C-M-v 命令滾動(dòng)另外一個(gè)窗格。【比如
翻譯和校對(duì)就很適合用這種方式進(jìn)行。】
C-M-v 是一個(gè) CONTROL-META 組合鍵。如果你有 META 鍵的話,可以同時(shí)按住
CONTROL 和 META 鍵并輸入 v。CONTROL 和 META 鍵先按哪個(gè)都可以,因?yàn)樗鼈?br>只是用來(lái)“修飾(modify)”你輸入的字符的。
如果你并沒(méi)有 META 鍵,你也可以用 ESC 來(lái)代替,不過(guò)這樣的話就要注意按鍵順
序了:你必須先輸入 ESC ,然后再輸入 CONTROL-v。CONTROL-ESC v 是沒(méi)用的,
因?yàn)?nbsp;ESC 本身是一個(gè)字符鍵,而不是一個(gè)修飾鍵(modifier key)。
>> (在上方窗格里)輸入 C-x 1 關(guān)掉下方窗格。
(如果你在下方的窗格里輸入 C-x 1,那么就會(huì)關(guān)掉上方的窗格。你可以把這個(gè)
命令看成是“只保留一個(gè)窗格”――就是我們正在編輯的這個(gè)。)
不同的窗格可以顯示不同的緩沖區(qū)。如果你在一個(gè)窗格里用 C-x C-f 打開(kāi)了一個(gè)
文件,另一個(gè)窗格并不會(huì)發(fā)生什么變化。任何一個(gè)窗格里都可以用來(lái)打開(kāi)文件。
用下面的方法可以在一個(gè)新開(kāi)窗格里打開(kāi)文件:
>> 輸入 C-x 4 C-f,緊跟著輸入一個(gè)文件名,再用 <Return> 結(jié)束。
可以看到你指定的文件出現(xiàn)在下方的窗格中,同時(shí)光標(biāo)也跳到了那里。
>> 輸入 C-x o 回到上方的窗格,然后再用 C-x 1 關(guān)掉下方窗格。
* 遞歸編輯(RECURSIVE EDITING LEVELS)
--------------------------------------
有時(shí)候你會(huì)進(jìn)入所謂的“遞歸編輯”。遞歸編輯狀態(tài)由位于狀態(tài)欄的方括號(hào)所指
示,其中包含了用小括號(hào)來(lái)指明的模式名稱(chēng)。比如說(shuō),你有時(shí)可能會(huì)看到
[(Fundamental)],而不是 (Fundamental)。【比如在用 M-% 進(jìn)行交互式替換的
時(shí)候你又用了 C-s 進(jìn)行搜索,這時(shí)替換模式并沒(méi)有結(jié)束,但你又進(jìn)入了搜索模式,
這就是所謂的遞歸編輯。】
離開(kāi)遞歸編輯可以用 ESC ESC ESC。這是一個(gè)最通用的“離開(kāi)”命令,你甚至可
以使用它來(lái)關(guān)掉多余的窗格,或者離開(kāi)小緩沖。
>> 輸入 M-x 進(jìn)入小緩沖;然后輸入 ESC ESC ESC 離開(kāi)。
你不能用 C-g 退出遞歸編輯,因?yàn)?nbsp;C-g 的作用是取消“本層遞歸編輯之內(nèi)”的
命令和其參數(shù)(arguments)。
* 獲得更多幫助(GETTING MORE HELP)
-----------------------------------
本快速指南的目的僅僅是幫助你在 Emacs 的海洋里下水,不至于束手無(wú)策望洋興
嘆。有關(guān) Emacs 的話題可謂汗牛充棟,這里自然是難盡萬(wàn)一。不過(guò) Emacs 很理
解你求知若渴的心情,因?yàn)樗峁┑膹?qiáng)大功能實(shí)在是太多了。為此,Emacs 提供
了一些命令來(lái)查看 Emacs 的命令文檔,這些命令都以 CONTROL-h 開(kāi)頭,這個(gè)字
符也因此被稱(chēng)為“幫助(Help)字符”。
要使用幫助(Help)功能,請(qǐng)先輸入 C-h,然后再輸入一個(gè)字符以說(shuō)明你需要什
么幫助。如果你連自己到底需要什么幫助都不知道,那么就輸入 C-h ?,Emacs
會(huì)告訴你它能提供了哪些幫助。如果你按了 C-h 又想反悔,可以用 C-g 取消。
(有些主機(jī)改變了 C-h 的意義,這種以己度人外加一刀切的做法確實(shí)不太好,不
過(guò)倒是讓你可以義正辭嚴(yán)地抱怨他們的系統(tǒng)管理員。話說(shuō)回來(lái),如果你按 C-h 之
后沒(méi)有任何幫助信息顯示出來(lái),那么試試 F1 鍵或者 M-x help <Return> 。)
最基本的幫助功能是 C-h c。輸入 C-h c 之后再輸入一個(gè)組合鍵,Emacs 會(huì)給出
這個(gè)命令的簡(jiǎn)要說(shuō)明。
>> 輸入 C-h c C-p。
顯示的消息應(yīng)該會(huì)是這樣:
C-p runs the command previous-line
這條消息顯示了 C-p 命令對(duì)應(yīng)的函數(shù)名,函數(shù)名主要用來(lái)定制和擴(kuò)展 Emacs。命
令的功能由函數(shù)完成,所以函數(shù)名本身也可以被看成是最簡(jiǎn)單的文檔――至少對(duì)
于你已經(jīng)學(xué)過(guò)的命令來(lái)說(shuō),它們的函數(shù)名足以解釋它們的功能了。
多字符命令一樣可以用 C-h c 來(lái)查看。
想得到更多的信息,請(qǐng)把 C-h c 換成 C-h k 試試看。
>> 輸入 C-h k C-p。
上面的命令會(huì)新打開(kāi)一個(gè) Emacs 窗格以顯示函數(shù)的名稱(chēng)及其文檔。你讀完之后可
以用 C-x 1 關(guān)掉這個(gè)幫助窗格。當(dāng)然你并不需要立即這樣做,你完全可以先在編
輯窗格里做點(diǎn)別的事情,然后再關(guān)掉幫助窗格。
還有一些其它有用的 C-h 命令:
C-h f 解釋一個(gè)函數(shù)。需要輸入函數(shù)名。
>> 試試看,輸入 C-h f previous-line<Return>。
Emacs 會(huì)給出它所知道的所有有關(guān)“實(shí)現(xiàn) C-p 命令功能的函數(shù)”的信息。
C-h v 用來(lái)顯示 Emacs 變量的文檔。Emacs 變量可以被用來(lái)“定制 Emacs 的行
為”。同樣,你需要輸入變量的名稱(chēng)。
C-h a 相關(guān)命令搜索(Command Apropos)。
輸入一個(gè)關(guān)鍵詞然后 Emacs 會(huì)列出所有命令名中包含此關(guān)鍵詞
的命令。這些命令全都可以用 M-x 來(lái)啟動(dòng)。對(duì)于某些命令來(lái)說(shuō),
相關(guān)命令搜索還會(huì)列出一兩個(gè)組合鍵。
>> 輸入 C-h a file<Return>。
Emacs 會(huì)在另一個(gè)窗格里顯示一個(gè) M-x 命令列表,這個(gè)列表包含了所有名稱(chēng)中含
有“file”的命令。你可以看到像“C-x C-f”這樣的組合鍵顯示在“find-file”
這樣的命令名的旁邊。
>> 用 C-M-v 來(lái)回滾動(dòng) help 窗格,多試幾次。
>> 輸入 C-x 1 來(lái)刪除 help 窗格。
C-h i 閱讀聯(lián)機(jī)手冊(cè)(也就是通常講的 Info)。
這個(gè)命令會(huì)打開(kāi)一個(gè)稱(chēng)為“*info*”的特殊緩沖區(qū),在那里,
你可以閱讀安裝在系統(tǒng)里的軟件包使用手冊(cè)。要讀 Emacs 的使
用手冊(cè),按 m emacs <Return> 就可以了。如果你之前從沒(méi)用
過(guò) Info 系統(tǒng),那么請(qǐng)按“?”,Emacs 會(huì)帶你進(jìn)入 Info 的使
用指南。在看完本快速指南之后,Emacs Info 會(huì)成為你的主要
參考文檔。
* 更多精彩(MORE FEATURES)
---------------------------
想學(xué)習(xí)更多的使用技巧,Emacs 使用手冊(cè)(manual)值得一讀。你可以讀紙版的
書(shū),也可以看電子版的聯(lián)機(jī)手冊(cè)(可以從 Help 菜單進(jìn)入或者按 F10 h r)。提
兩個(gè)你可能會(huì)很感興趣的功能吧,一個(gè)是可以幫你少敲鍵盤(pán)的 completion(自動(dòng)
補(bǔ)全),另一個(gè)是方便文件處理的 dired(目錄編輯)。
Completion 可以替你節(jié)省不必要的鍵盤(pán)輸入。比如說(shuō)你想切換到 *Message* 緩
沖區(qū),你就可以用 C-x b *M<Tab> 來(lái)完成。只要 Emacs 能夠根據(jù)你已經(jīng)輸入的
文字確定你想要輸入的內(nèi)容,它就會(huì)自動(dòng)幫你補(bǔ)齊。有關(guān) Completion 的詳細(xì)說(shuō)
明可以在 Emacs Info 中的“Completion”一節(jié)里找到。
Dired 能夠在一個(gè)緩沖區(qū)里列出一個(gè)目錄下的所有文件(可以選擇是否也列出子
目錄),然后你可以在這個(gè)文件列表上完成對(duì)文件的移動(dòng)、訪問(wèn)、重命名或刪除
等等操作。Dired 也在 Emacs Info 中有詳細(xì)介紹,參見(jiàn)“Dired”一節(jié)。
Emacs 使用手冊(cè)里還有許許多多的精彩功能等著你來(lái)了解。
* 總結(jié)(CONCLUSION)
--------------------
記住,要退出 Emacs 請(qǐng)用 C-x C-c。要暫時(shí)切換到 shell 并且稍后再回到
Emacs 里來(lái),請(qǐng)用 C-z。【切換到 shell 僅對(duì)控制臺(tái)下的 Emacs 有效】
本文完全是為零起點(diǎn)新手所寫(xiě)的起步教程。如果你覺(jué)得哪里還看不明白,千萬(wàn)不
要懷疑自己,那一定是我們沒(méi)有寫(xiě)好。我們永遠(yuǎn)歡迎你的不滿和抱怨。
* 翻譯(TRANSLATION)
---------------------
翻譯:孫一江 <sunyijiang@gmail.com>
校對(duì):水木社區(qū)(www.newsmth.net)Emacs 板眾多網(wǎng)友及眾多 Emacs 中文用戶(hù)
Emacs 快速指南(Tutorial)早有兩個(gè)劉昭宏的中文譯本,繁簡(jiǎn)各一。其簡(jiǎn)體版本
(TUTORIAL.cn)基本由繁體版本(TUTORIAL.zh)經(jīng)詞語(yǔ)替換而得。然而繁簡(jiǎn)中文
不僅在用詞習(xí)慣上有所不同,更有諸多表達(dá)方式與句法方面的差異,因此一直以來(lái)
用戶(hù)使用 TUTORIAL.cn 都會(huì)略覺(jué)生硬和晦澀。這次重新翻譯 TUTORIAL.cn 的動(dòng)機(jī)
正是源于這種體驗(yàn),希望我們的工作能夠讓本文更好地發(fā)揮其作用。TUTORIAL.zh
的譯文質(zhì)量很高,在翻譯過(guò)程中給予過(guò)我們?cè)S多借鑒和參考,在此對(duì)劉昭宏的工作
表示感謝。
翻譯過(guò)程中最大的挑戰(zhàn)莫過(guò)于術(shù)語(yǔ)譯詞的選擇了。經(jīng)過(guò)水木社區(qū) Emacs 板熱心網(wǎng)
友小范圍內(nèi)的討論,我們選擇了現(xiàn)在的譯法。用戶(hù)的廣泛參與是自由軟件生命力
的源泉,所以如果你有任何建議、勘誤或想法,請(qǐng)用你喜歡的方式向我們提出。
你可以通過(guò)電子郵件直接聯(lián)系譯者,也可以放到 GNU Emacs 的開(kāi)發(fā)郵件列表或者
水木社區(qū)的 Emacs 板上進(jìn)行討論。
下面列出主要術(shù)語(yǔ)的譯詞對(duì)照,并給出注釋說(shuō)明:
command 命令
cursor 光標(biāo)
scrolling 滾動(dòng)
numeric argument 數(shù)字參數(shù)
window 窗格 [1]
insert 插入
delete 刪除 [2]
kill 移除 [2]
yank 召回 [2]
undo 撤銷(xiāo)
file 文件
buffer 緩沖區(qū)
minibuffer 小緩沖
echo area 回顯區(qū)
mode line 狀態(tài)欄
search 搜索
incremental search 漸進(jìn)式搜索 [3]
[1] “window”一詞在計(jì)算機(jī)相關(guān)的領(lǐng)域一般都被譯為“窗口”。但是在 Emacs
中,還有一個(gè)“frame”的概念。在被廣泛使用的 X 窗口系統(tǒng)和微軟的視窗
(Windows)系列操作系統(tǒng)中,Emacs 的一個(gè)“frame”就是一個(gè)“窗口”,因
此把 Emacs 中的“frame”譯成“窗口”更加符合通常的習(xí)慣。這樣,Emacs
中的“window”就只能譯成“窗格”了。我們認(rèn)為 Emacs 中 window 和
frame 的關(guān)系用窗格和窗口來(lái)類(lèi)比是十分形象的。
《學(xué)習(xí)GNU Emacs》(第二版)一書(shū)對(duì)“window”和“frame”的翻譯與本教程
剛好相反(分別譯作“窗口”和“窗格”)。在此特別注明,以消除可能產(chǎn)生
的疑惑。(感謝李旭章 <lixuzhang@gmail.com> 指出)
[2] 對(duì)于“delete”和“kill”的區(qū)別,正文已經(jīng)給出了詳細(xì)的說(shuō)明。“刪除”和
“移除”相比較起來(lái),前者更多地隱含著“破壞”和“不可恢復(fù)”的意思,而
后者更多地隱含著“被轉(zhuǎn)移”和“可恢復(fù)”的意思。因此分別選擇它們作為上
述兩詞的譯詞,希望能夠體現(xiàn)出區(qū)別。“yank”在中文文檔中鮮有對(duì)應(yīng)譯詞出
現(xiàn),翻譯的困難較大。究其本意是:“a strong sudden pull”(參見(jiàn)韋氏詞
典),即“猛然拉回”。在原文檔中 yank 被引申為“將先前移除的東西再移
回來(lái)”這個(gè)意思,所以我們選擇了“召回”一詞與其對(duì)應(yīng)。
[3] “incremental”一詞在計(jì)算機(jī)著作中廣泛出現(xiàn),被廣泛接受的中文譯詞有兩
個(gè):“增量的”和“漸進(jìn)的”。“incremental search”翻譯成“增量式搜索
”或者“漸進(jìn)式搜索”都講得通,且都有各自的形象之處。還是參考原文對(duì)其
的解釋?zhuān)?#8220;
means that the search happens while you type in the
string to search for”。意思是之所以稱(chēng)其為“incremental search”,是
因?yàn)?#8220;在你輸入搜索字符串的過(guò)程中,搜索就已經(jīng)在進(jìn)行了”。我們認(rèn)為“增
量的”更加強(qiáng)調(diào)在現(xiàn)有基礎(chǔ)上的變化(比如“增量備份”,“增量編譯”);
而“漸進(jìn)的”更加強(qiáng)調(diào)過(guò)程的逐漸發(fā)展,也更加符合原文的意思。因此我們選
擇將“incremental search”譯作“漸進(jìn)式搜索”。
* 版權(quán)聲明(COPYING)
---------------------
This tutorial descends from a long line of Emacs tutorials
starting with the one written by Stuart Cracraft for the original Emacs.
This version of the tutorial, like GNU Emacs, is copyrighted, and
comes with permission to distribute copies on certain conditions:
Copyright (C) 1985, 1996, 1998, 2001, 2002, 2003, 2004,
2005, 2006, 2007, 2008 Free Software Foundation, Inc.
Permission is granted to anyone to make or distribute verbatim copies
of this document as received, in any medium, provided that the
copyright notice and permission notice are preserved,
and that the distributor grants the recipient permission
for further redistribution as permitted by this notice.
Permission is granted to distribute modified versions
of this document, or of portions of it,
under the above conditions, provided also that they
carry prominent notices stating who last altered them.
The conditions for copying Emacs itself are more complex, but in the
same spirit. Please read the file COPYING and then do give copies of
GNU Emacs to your friends. Help stamp out software obstructionism
("ownership") by using, writing, and sharing free software!
【下面為版權(quán)聲明的譯文,僅供參考。實(shí)際法律效力以英文原文為準(zhǔn)。】
本快速指南沿襲自歷史悠久的 Emacs 快速指南,可上溯至 Stuart Cracraft 為最
初的 Emacs 所作的版本。
本篇文檔與 GNU Emacs 一樣擁有版權(quán),并允許在下列條件的約束下發(fā)行其拷貝:
Copyright (C) 1985, 1996, 1998, 2001, 2002, 2003, 2004, 2005, 2006,
2007, 2008 Free Software Foundation, Inc.
本文檔允許在不變更文檔內(nèi)容的情況下由任何人發(fā)布在任何媒體上,同時(shí)必須
完整保留版權(quán)和許可聲明,且需給予受眾與發(fā)行者完全相同的、如本聲明所允
許的再次發(fā)行本文檔的權(quán)利。
本聲明允許在與上述條件相同的情況下發(fā)布經(jīng)過(guò)修改的全部或部分文檔,同時(shí)
必須附帶顯要的文字以申明文檔的最后修改者。
Emacs 自身的版權(quán)問(wèn)題雖比本文檔要復(fù)雜一些,但也基于相同的精神。敬請(qǐng)閱讀文
件“COPYING”,然后向你的朋友們分發(fā) GNU Emacs 拷貝。讓我們以使用、編寫(xiě)和
分享自由軟件的實(shí)際行動(dòng)來(lái)共同祛除軟件障礙主義(所謂的“所有權(quán)”)!
;;; Local Variables:
;;; coding: chinese-iso-8bit
;;; End:
;;; arch-tag: 46a53d82-a85a-46b6-bdc7-583aca063578