在這裡我們將會學會如何插入和刪除文本,在Emacs中進行移動,剪下和粘貼,裝入和儲存檔案.我們還會談到一些在我們要讀入一個新檔案時要用到的有用的函數功能.
插入和刪除文本:
在Emacs中插入和刪除文本就如我們在印表機上輸入文本一樣的簡單,我們只是簡單的輸入我們要輸入的文本.這樣的輸入方式是和我們在Vim中所見到的輸入方式是不一樣的,因為在Vim我們要插入模式下輸入文本,而在Emacs中不是這樣的.
在Emacs中我們可以有幾種不同的方式來刪除文本.最簡單的方法就是按下Backspace鍵或者是Delete鍵.在大多數的Emacs安裝中Backspace會刪除前一個字元而Delete會刪除後一個字元.如果這樣的方法不能刪除字元,我們可以使用C-d(delete-char)來刪除字元.
輸入時自動斷行:
當我們在Emacs中輸入文本直到一行的結束時,Emacs並不會為我們斷開這一行,相反他會表明會在下一行繼續並且在下一行中我們可以繼續來輸入.在這個標記繼續的符號會出現在一個文本的最後一列.而我們可以通過下面的方式來使得Emacs可以自動斷行.我們按下M-x然後輸入aotu-fill-mode
在Emacs中進行移動:
在Emacs中我們可以有幾種方式來進行移動.我們可以用小方向鍵來在Emacs中進行移動,我們也可以通過page-up,page-down來在頁間進行跳轉.
如果我們的小方鍵不可以進行了工作了,我們還可以用下面的方法來進行移動:
向前一個字元:C-f (forward-char)
向後一個字元:C-b (backward-char)
向上一行:C-p (previous-line)
向下一行:C-n (next-line)
向前滾動一頁:C-v (scroll-up)
向後滾動一頁:M-v (scroll-down)
在緩衝區的末尾新加一個空行:
當我們已經到了緩衝區的最後一行時我們希望Emacs如何來做呢?這裡兩個可能的方法:一是加入一個行並移動這一行;二是響鈴提示這樣是不可以的.我們可以根據我們的個人愛好來選擇一個解決方案:
如果我們要選擇加入一個新行,我們可以將下面的一行加入我們的.emacs檔案中:
(setq next-line-add-newlines t)
如果我們要選擇響鈴,我們可以將下面的一行加入我們的設定檔中:
(seq next-line-add-newlines nil)
Emacs為我們提供了許多的方法我們可以其中進行移動.我們並不需要馬上知道所有的這些方法,重要的我們要知道他們存在.當我們需要他時我們可以用到.
我們可以用C-a (beginning-of-line)移動到一行的開頭,用C-e (end-of-line)來移到一行的結尾.這些並不是太容易記住,但是當我們熟練了就不會覺得難了.
我們還可以以單詞為單位向前或是向後移動.這要比按字元的方式移動要快得多,我們可以很容易的記住這些按鍵:Ctrl+右鍵(forward-word)向右移動,Ctrl+左鍵(backward-word)向左移動.
我們還可以用下面的一些按鍵進行移動:
向前一句:M-e (forward-sentence)
向後一句:M-a (backward-sentence)
向前一段:M-} (forward-paragraph)
向後一段:M-{ (backward-paragraph)
向前一頁:C-x ] (forward-page)
向後一頁:C-x [ (backward-page)
要瞭解更多的這樣的功能以及句,段或是頁結束的描述,我們可以輸入C-h f (describe-function)然後輸入功能名.
我們還要兩個功能可以回到匹配的括弧處,這個分別叫做forward-sexp,backward-sexp.這在編程的時候顯得更為有用.我們可以將他們綁定到Meta-左鍵和Meta-右鍵.為了做到這一點我們可以將下面的兩句加入我們的.emacs檔案中:
(global-set-key [(meta left)] 'backward-sexp)
(global-set-key [(meta right)] 'forward-sexp)
有時我們可以通過指定的數字回到指定的行.這個可以使用goto-line命令,在XEmacs中我們可以通過M-g來做到,而在Emacs中我們也想要這樣的做就要將下面的一句加入到我們的.emacs檔案中:
(global-set-key [(meta g)] 'goto-line)
如果我們的視窗比較的亂或者是我們要將游標入在視窗的中央,我們可以按下C-l (recenter).這樣就會重繪我們的視窗並將游標放在視窗的中部而不改變他在緩衝區中的位置.
剪下,複製,粘貼:
為標記我們要剪下或是複製的地區,我們可以使用滑鼠或是鍵盤.
通過下面的例子我們可以學會如何使用用滑鼠標記地區並將這個地區複製到剪粘板(在Emacs中稱為kill-ring):
1將滑鼠放在我們要標記的文本的開頭
2按下滑鼠左鍵同時拉動滑鼠直到我們要複製的文本的結尾
3鬆開滑鼠
4如果我們要將這些文本複製到剪刀粘板,也就是說並不從緩衝區中刪除,選擇編輯菜單並選擇複製.如果我們要將這些剪下到剪下板中,也就是從緩衝區中刪除,可以到編輯菜單中選擇剪下.
當然如果我們在Emacs中操作,Linux中的複製方式也是同樣適用的.
下面的例子可以使我們學會如何標記並複製地區文本:
1 將游標放在我們要選擇的文本的開頭.
2 按下Ctrl+Spacebar,在緩衝下部就會顯示出文本標記
3 到我們要選擇的文本的結尾處.
4
如果我們要複製到剪下板,我們可以按下M-w(kill-ring-save),如果我們要剪下,我們可以按下C-w(kill-region)
而我們最經常的做法卻是使用滑鼠來標記文本地區然後使用鍵盤來來進行剪下或是複製的操作.雖然在一開始看來這些鍵盤綁定比較難於記憶,但是我們還要是試著來這樣做,因為這樣的方法會使得我們和Emacs的互動更加的方便和快速.
我們可以使用滑鼠或是鍵盤來進行文本的粘貼.如果要使用滑鼠我們只是簡單的在我們要粘貼文本的地方按下滑鼠中鍵.要使用鍵盤,我們要將游標放在我們要粘貼文本的地方然後按下C-y
Emacs不僅會儲存最後一次的選擇而且會儲存以前的一些文本的選擇.這就使得我們將一些舊的選擇放入我們的緩衝區中.要粘貼一箇舊的文本選擇,我們可以按下C-y,這就會將最一次的文本選擇粘貼到緩衝區中.然後我們按下M-y(yank-pop),這就會用將倒數第二次的文本選擇插入我們的緩衝區中.接下來的M-y可以用更舊的文本選擇來替換.
如果我們在C-y和M-y之間按下其他的鍵,我們就不可能得到一些更舊的文本選擇了.
如果我們正在使用GNU
,位於選擇和粘貼之後.然而在XEmacs中卻是不可以的.
除了命令C-w(kill-region),還有其他的一些命令可以刪除緩衝區中的文本並將其放在剪下板中.最常用一個命令就是C-k(kill-line),他會將從當前游標處直到本行結束的文本移除並放入剪下板中.我們可以多次按下這個鍵,這樣就可以移除多行文本並將其加入剪下板中.這樣如果我們粘貼文本,所有的行就會做為一個整體進行操作.
我們在以前還談到C-d命令可以刪除下一個字元.這樣另兩個比較有用的命令就是M-d(kill-word)刪除後一個單詞,而M-DEL可以刪除前一個單詞(backward-kill-word).這兩個命令都可以將刪除的文本放入剪下板中.
另一個比較簡單的插入方法就是插入一個檔案夾.我們可以通過C-x i來做到.
編輯檔案:
在Emacs中編輯一個檔案最簡單的方法就是我們在啟動Emacs時用我們要編輯的檔案名稱作為參數.當我們的Emacs正在運行時,我們可以通過C-x C-f來裝入一個檔案.
Emacs會將當前緩衝區的路徑作為我們的開始路徑.這個原因就是在大部的時間裡我們要開啟的檔案與我們的當前編輯的檔案處在同一個檔案夾中.如果我們要尋找的檔案位於另一個檔案夾中,我們可以編輯這個給定的路徑.
雙斜線(//)表明Emacs會忽略到當前點的內容並將剩餘行的內容理解為從檔案系統的根目錄開始的路徑.與其相同的/~/表明會忽略到當前點的內容並將此行剩餘的內容理解為我們當前主目錄下的目錄路徑.有時我們要開啟一個位於其他檔案夾中的檔案,這樣的方式就顯得更為有用了.
如果我們所指定的檔案並不在我們的硬碟上,Emacs就會將其理解為我們要編輯的新檔案的名字.所以建立一個檔案與開啟一個並不存在的檔案是相同的.當我們開啟了一個並不存在的檔案,Emacs會通過在minibuffer顯示資訊來提示我們這是一個新的檔案.
下面也許是我們會開啟一個並不存在的檔案的原因:
1 我們要編輯一個新的檔案.
2 我們輸入了錯誤的檔案名稱,也就是我們實際要編輯的是另一個檔案.
在後一種情況下,我們要通過命令C-x k(kill-buffer)來殺掉為新檔案所開啟的緩衝區,然後再開啟我們要編輯的檔案.一個更好的辦法就是我們可以按下C-x C-v (find-alternate-file),這個方法會同時完成上面的兩步操作.
在這裡我們要注意的就是在Emacs裝入或是開啟一個檔案被稱為finding a file.這是由於曆史的原因.所以裝入檔案的命令是find-file而不是load-file.
要儲存緩衝區,我們可以簡單的使用C-x C-s (save-buffer).這樣Emacs就會將當前緩衝區中的內容儲存到我們原始裝入的檔案中.如果當前的緩衝區並沒有與一個裝入的檔案相匹配,也就是說如果我們要將我們的啟動Emacs時看到的初始緩衝區的內容寫入一個檔案,Emacs就會詢問檔案名稱.
也許有的時候我們會需要讀入一個檔案而希望將其以另一個檔案名稱進行儲存,這時C-x
就不能滿足我們的要求了,因為這個命令會將我們的緩衝區儲存到我們讀入的檔案中而不會詢問另一個檔案名稱.在這樣的情況下我們可以使用C-x C-w (write-file),這樣Emacs就會詢問一個檔案名稱並將緩衝區中的內容存入另一個檔案中.如果我們正在編輯一個我們並沒有從某一個檔案讀入的緩衝區時,我們也可以使用這樣的方法來儲存我們的工作.也就是說我們的開啟我們的Emacs,然後輸入了一些內容,我們就可以用這樣的方法來儲存我們所輸入的內容.當我們完成我們的編輯工作,我們可以通過C-x C-c (save-buffers-kill-emacs).如果在我們的緩衝區中存在一些我們的並沒有儲存的內容,Emacs就會詢問我們的是否要先儲存這些內容.
多種多樣的檔案命令:
在這一部分我們將會學習如何來編輯一個位於遠程機器人上的檔案和如何來編輯一個壓縮檔.如果我們確實是很匆忙的,我們可以先跳過這一部分,但是我們的一定要回過頭看一下這一部的內容,因為在這裡有一些非常有用的資訊.
Emacs允許我們編輯位於遠程機器上的檔案,也許我們會想到下面的兩點:
1 我們要使用一些特殊的文法來告訴Emacs檔案的位置.
2 當我們要裝入或是儲存檔案時,我們要使Emacs聯結到遠端主機.
要從另一個主機上裝入檔案,我們要完成下面的兩件事:
1 檔案所在的主機名稱.
2 我們在這個主機上的使用者名稱.
然後Emacs就會使用FTP聯結來下載我們要編輯的檔案.
在這裡我們要注意的是如果我們要使用這個特徵我們必須允許FTP聯結到遠端主機.
要使Emacs裝入位於其他主機上的檔案,我們可以簡單的使用這些我們已經知道的在我們的本地開啟檔案的命令.我們已經瞭解了C-x C-f (find-file)和C-x C-v (find-alternate-file).作為檔案名稱,我們要指定我們在遠程主機上的使用者名稱,我們可以用下面的文法:
/usr@host:filename
這個語句的構成為:斜線,使用者名稱,標記@,主機名稱,冒號,檔案名稱.
例如如果我們要以root的身分裝入linux.homenet主機上的/etc/passwd檔案我們可以輸入:
/root@linux.homenet:/etc/passwd
如果我們在遠程主機上的使用者名稱與我們當前機器上的使用者名稱相同,我們可以省略usrnme@部分.例如我們要編輯linux.homenet主機使用者目錄下的.tcshrc檔案,我們可以這樣來做:
/linux.homenet:~/.tcshrc
在這裡我們要注意的就是~代表我們在遠程主機上的使用者主目錄.
當Emacs聯結到遠端主機上以後,minibuffer就會顯示要我們的輸入密碼.
Emacs還可以編輯壓縮的檔案或是文檔,也就說以.gz,.Z,.tar,.zip,.arc,.lzh,.zoo副檔名的檔案.這就可以在我們的磁碟空間相對較低的情況下避免解壓檔案.
一個名為jka-compr的庫可以在Emacs中加入編輯壓縮檔的功能,這個功能可以做到透明(Transparent)的讀取和寫入由gzip或是compress壓縮的檔案.在這裡透明意味著事實上我們並沒有注意到這是一個壓縮的檔案.
Emacs可以識別的壓縮檔必須是以.gz,.Z,.tgz為副檔名的檔案.最後一個副檔名的檔案是用tar歸檔,用gzip壓縮的檔案.
當我們裝入一個壓縮檔時,Emacs在向我們顯示檔案之前進行簡單的解壓.當我們儲存檔案時,他會在將這個檔案寫入硬碟時進行壓縮.所以對我們來說是透明的.要加入這個特性,我們要在我們的.emacs檔案中加入下面的幾句:
(require 'jka-compr)
(jka-compr-install)
如果我們並沒有使用XEmacs,那麼我們可以不加入第二行.
當我們裝入一個歸檔檔案時,Emacs會向我們顯示出這個歸檔檔案中的檔案清單.Tar歸檔檔案是由一個叫做tar-mode的庫來處理的,而Zip,Arc,Lzf,Zoo歸檔檔案是由名為arc-mode的庫來處理的.這就意味著這兩個歸檔檔案的設定介面是有一些不同的.
當游標位於某一個檔案上時我們敲入斷行符號,這個檔案就會被裝入緩衝區,這時我們就可以編輯這個檔案.當我們進行儲存時,歸檔檔案會自動進行更新.
然而對tar歸檔檔案來說這並不是完全正確的,要更新tar檔案,我們需要儲存包含有tar歸檔檔案的緩衝區.
在菜單中有許多不同的函數功能可以處理這些歸檔檔案:我們從這個歸檔檔案中複製檔案或是向這個歸檔檔案中是複製檔案,重新命名檔案或是變更檔的許可權等等.
文件範本:
Emacs的一個主要的哲學就是我們應將我們的時間花在有意義地方,而不是去那些瑣碎無變化的任務(One of the main philosophies of Emacs is that you should spend your time being a genius instead of doing trivial monotonous tasks!).如果我們在使用Emacs時可以記住這一點,我們就會發現我們所要做的事情Emacs可以會較少的敲擊鍵盤或是根本不用敲擊鍵盤就可以完成這些工作.
這其中的一個例子就是建立一個檔案.當我們建立一個新檔案時,大多數的情況下我們的最初的幾分鐘會花費在插入一些文本,而這些文本是我們在上一次建立一個類似的檔案時插入過的,例如,我們上一次建立的是一個HTML文檔.
對這個問題的一個解決辦法就是使Emacs插入一個模板.這個模板會根據我們是否寫C程式,HTML文檔或是寫給奶奶的信而有所不同.更進一步說,HTML檔案的設定模板是與其他的檔案模板不同的.我們個人首頁的HTML檔案也許會不同於我們為我們的公司設計的檔案.或者說是一個程式的模板會不同於另一個.
當我們建立一個新檔案時,Emacs會根據檔案的副檔名來尋找相應的模板.也就是說當我們的建立了一個名為test.html的檔案,Emacs就會尋找一個名為TEMPLATE.html.tpl的模板.而如果我們建立是一個名為letter.txt的檔案,Emacs就會尋找名為TEMPLATE.txt.tpl的模板.
當要找一個模板時,Emacs首先會在新檔案所在的目錄下進行尋找,如果Emacs沒有找到,Emacs就會在名為Templates的子目錄下進行尋找.如果仍然沒有找到,Emacs就會在父目錄和名為Templates的子目錄下進行尋找.Emacs以這樣的方式進行尋找直到我們的使用者主目錄的頂部.如果Emacs仍然沒有找到,Emacs就會在我們有可能已經定了模板的地方進行尋找.
例如,如果我們的建立了一個名為~/work/Emacs-project/note.txt的檔案而我們所有的標準模板位於目錄~/lib/template目錄下.Emacs就會以下面的方式進行尋找:
1.~/work/Emacs-project/TEMPLATE.txt.tpl
2.~/work/Emacs-project/Templates/TEMPLATE.txt.tpl
3.~/work/TEMPLATE.txt.tpl
4.~/work/Templates/TEMPLATE.txt.tpl
5.~/TEMPLATE.txt.tpl
6.~/Templates/TEMPLATE.txt.tpl
7.~/lib/templates/TEMPLATE.txt.tpl
也許我們會很奇怪這樣的尋找方式,然而這樣的方式由於下面的原因是相當的重要的:
1.通過在目前的目錄和Templates子目錄中進行尋找,我們就有時會在一個子目錄中隱藏我們的模板,因為我們不希望這些模板與其他的檔案混在一起.換句說我們並不必須這樣的來做.
2通過這樣的路徑進行尋找,我們也許會在子目錄或是上一級目錄中找到特殊的模板.例如也許我們有一個名為Letters的目錄,在這個目錄中存放著我們所有的信件.在這個目錄下也許我們會放一個普通的模板,這個模板會插入一些類似Dear...的話以及當前的日期.而在一個Letter的子目錄中我們也許會存放一些寫給我們的男朋友或是女朋友的信.這個模板會插入一些類似Yours forever的話.
3通過最後在標準的模板目錄中進行尋找,我們就會尋找到所有的通用模板.
模板可以包含一些由標準行(stand-ins)所組成的文本.這些行可能被其他的文本替換或是當基於這個模板建立一個新檔案時在緩衝區中進行標記.標準行的格式為(>>>letter<<<),例如>>>P<<<設定當我們的建立一個文檔時位於緩衝區中的這一點,>>>A<<<可以插入我們的郵件地址.
下面列出一些不需使用者定義的代碼:
代碼 例子 描述
檔案和目錄類:
(>>>DIR<<<) ~/Letters/ 檔案名稱部分目錄
(>>>FILE<<<) Gretchen.txt 沒有目錄的檔案名稱
(>>>RILE_RAW<<<) Gretchen 沒有副檔名的檔案名稱
(>>>EILE_EXT<<<) txt 檔案名稱的副檔名(沒有逗點)
時間日期類:
(>>>DATE<<<) 07 Jan 1999
20:17:29 日期和時間
(>>>ISO_DATE<<<) 1999-01-07 ISO 8601 日期
系統資訊類:
(>>>AUTHOR<<<) blackie@ifad.dk 完整Email地址
(>>>LOGIN_NAME<<<) blackie 登陸名
(>>>HOST_ADDRE<<<) ifad.dk 主機名稱
(>>>USER_NAMEE<<<) Jesper 使用者真名
位置類:
(>>>POINT<<<) 這個設定點,當然只有這個點可以進行設定
(>>>MARKT<<<) 設定標記,只有標記可以進行設定
(>>>1<<<) (>>>9<<<)
十個可能的位置.要到達這些位置中的任何一個,我們可以按下C-x j(jump-to-register)
一個例子模板如下:
Odense (I<<<)
Dear (>P<<<)
Our record number: (>1<<<)
Cheers (>U<<<)
在我們的模板中,我們也可以插入詢問問題的答案.所以在我們的前面的例子中,我們也許希望提示我們要在插在Dear後的名字.如下面的模板:
Odense (>>>I<<<)
Dear (>>>name<<<)
(>>>P<<<)
Our record number: (>>>number<<<)
Cheers (>>>U<<<)
>TEMPLATE-DEFINITION-SECTION<<
("name" "What is the name of the customer? ")
("number" "What is the record number? ")
要使Emacs詢問我們問題,我們需要插入一行來表明開始了定義的部分.在這行後的文本是用來定義問題的,所以我們要小心不要插入沒有文法的文本.
每一個問題都是與一個單詞相聯絡的.這個單詞是作為標準的輸入文本.
這樣當我們開啟一個新的檔案時,Emacs會向我們詢問問題,而我們的答案也就會插入相應的地方.