Emacs 是什么的簡(jiǎn)稱?Emacs 能做什么一個(gè)簡(jiǎn)略的介紹,講述一下我已經(jīng)知道的 Emacs 的功能。 Emacs 資料這里可以找到很多有關(guān) Emacs 的資料。包括入門書籍,網(wǎng)址等。 Emacs Lisp 功能擴(kuò)展集錦我搜集到的一些很好的 emacs 擴(kuò)展。它們使得 Emacs 成為一個(gè)多 才多藝的編輯器。 Emacs 筆記這里簡(jiǎn)要記錄一些 Emacs 的使用技巧。便于查詢。 返回 Emacs 綁定鍵盤的技巧。萬(wàn)無(wú)一失的綁定方法很多人綁定一些比較特殊的鍵的時(shí)候,都搞不清楚在 (global-set-key ... ‘my-funtion) 里寫些什么。特別是在 xterm 里的時(shí)候就更不知所措了。其實(shí)有一個(gè)萬(wàn)無(wú)一失的辦法保證你一定寫對(duì)。這個(gè)辦法就是:
好了,你現(xiàn)在就能在 minibuffer 里看到你應(yīng)該寫在 .emacs 的東西了。 如果你還是失敗了……如果你在第1步的時(shí)候發(fā)現(xiàn) Emacs 根本對(duì)你的按鍵沒有反應(yīng),那么應(yīng)該懷疑是你的窗口管理器攔截了這個(gè)按鍵。比如,我的 FVWM 設(shè)置把 C-f3 設(shè)定成了打開一個(gè) FvwmCommand, 所以 Emacs 接收不到這個(gè)按鍵。如果我要綁定一個(gè)函數(shù)到 C-f3, 我必須讓 FVWM 放過 C-f3。 綁定新的前綴鍵其實(shí)上面的辦法只能讓你綁定一個(gè)已有的前綴。你有可能想綁定一個(gè) save-buffer 到 "C-c C-w C-b a"。上面的辦法就不靈了。我們必須使用另外的辦法: (global-set-key (kbd "C-c C-w C-b a") ‘save-buffer) 一點(diǎn)解釋上面的那個(gè) "C-c C-w C-b a" 是自動(dòng)把 "C-c C-w", "C-c C-w C-b" 都定義成了一個(gè) prefix-command. 你可以這樣看到它們:
現(xiàn)在你清楚的看到了 "C-c C-w", "C-c C-w C-b" 都是 prefix command 吧? 創(chuàng)建新的 prefix command上面這個(gè)辦法只對(duì)開頭的鍵已經(jīng)是 prefix command 的鍵序列起作用,如果你的第一個(gè)鍵不是一個(gè) prefix,那么就會(huì)出錯(cuò)。你可以試試:(global-set-key (kbd "C-z C-c C-w b") ‘find-file) 出現(xiàn)錯(cuò)誤:(error "Key sequence C-z C-c C-w b uses invalid prefix characters") 所以你必須事先把第一個(gè)鍵設(shè)定為 prefix: (define-prefix-command ‘ctl-z-map) (global-set-key (kbd "C-z") ‘ctl-z-map) 然后再用 (global-set-key (kbd "C-z C-c C-w b") ‘find-file) 就行了。"C-z C-c" 和 "C-z C-c C-w" 都會(huì)自動(dòng)被定義為 prefix command. 綁定中文命令現(xiàn)在我舉一個(gè)例子來(lái)說明 prefix command 是如何工作的。我們可以把中文的 存盤 兩個(gè)字綁定到save-buffer. 這樣你用中文輸入法敲入“存盤”兩個(gè)字時(shí),就可以把當(dāng)前 buffer 保存起來(lái)。 (define-prefix-command ‘存-map) (global-set-key (kbd "存") ‘存-map) (define-key 存-map (kbd "盤") ‘save-buffer) 有趣吧?你可以猜到這里面是怎么回事吧?太簡(jiǎn)單了是不是?當(dāng)你輸入“存”的時(shí)候,看到 minibuffer 是這樣:
這是因?yàn)槲覀儼选按妗边@個(gè)字綁定到了 存-map 這個(gè) prefix-command. 當(dāng)讀到“存”的時(shí)候,Emacs 就會(huì)等待下一條命令,這個(gè)命令是定義在 存-map 這個(gè) map 里的。它讀到“盤”,就會(huì)執(zhí)行 save-buffer 了。 不過注意,你真的要在文檔里輸入“存盤”兩個(gè)字就得先打 C-q 了。剛才我就打了好多次 C-q,真累啊。還是用一些不常用的詞組比較好,或者加一個(gè) ctrl 什么的前綴,就像這個(gè),"C-z 存盤"。 (define-prefix-command ‘ctl-z-map) (global-set-key (kbd "C-z") ‘ctl-z-map) (define-key ctl-z-map (kbd "存盤") ‘save-buffer) 看我們更 bt 一點(diǎn): (define-prefix-command ‘ctl-z-map) (global-set-key (kbd "C-z") ‘ctl-z-map) (define-key ctl-z-map (kbd "給我存盤啦!") ‘save-buffer) 嗨喲!yes sir!! define-key 會(huì)自動(dòng)建立很多 prefix command. 不過自己顯式用 define-prefix-command 定義前綴命令有一個(gè)好處,就是你可以在你的 prefix 里再方便的定義更多的命令,而不用把整個(gè)前綴都寫一遍。 (define-prefix-command ‘ctl-z-map) (define-prefix-command ‘存-map) (define-prefix-command ‘盤-map) (global-set-key (kbd "C-z") ‘ctl-z-map) (define-key ctl-z-map (kbd "存") ‘存-map) (define-key 存-map (kbd "盤") ‘盤-map) (define-key 盤-map (kbd "!") ‘save-buffer) (define-key 盤-map (kbd "到") ‘write-file) (define-key 盤-map (kbd "退出") (lambda () (interactive) (save-buffer) (kill-emacs))) 這樣,到了“C-z 存盤-” 這個(gè)時(shí)候,我們定義了3個(gè)分支:
自定義 prefix command 的另外一個(gè)更大的好處就是:你可以修改最上層對(duì) prefix command 的綁定,從而修改許多鍵的綁定。比如,我們可以把 “存盤” 輕而易舉的改成 “保存”: (define-key ctl-z-map (kbd "保存") ‘盤-map) 這樣一來(lái), “C-z 保存!” ,“C-z 保存到” , “C-z 保存退出” 就分別有了 “C-z 存盤!” , “C-z 存盤到” 和 “C-z 存盤退出” 的含義了。 Emacs 的簡(jiǎn)單設(shè)置我覺得這里的設(shè)置對(duì)我來(lái)說比缺省的設(shè)置方便。
關(guān)閉煩人的出錯(cuò)時(shí)的提示聲。
關(guān)閉起動(dòng)時(shí)的那個(gè)“開機(jī)畫面”。
顯示列號(hào)。
不要在鼠標(biāo)點(diǎn)擊的那個(gè)地方插入剪貼板內(nèi)容。我不喜歡那樣,經(jīng)常把我的文檔搞的一團(tuán)糟。我覺得先用光標(biāo)定位,然后鼠標(biāo)中鍵點(diǎn)擊要好的多。不管你的光標(biāo)在文檔的那個(gè)位置,或是在 minibuffer,鼠標(biāo)中鍵一點(diǎn)擊,X selection 的內(nèi)容就被插入到那個(gè)位置。
用一個(gè)很大的 kill ring. 這樣防止我不小心刪掉重要的東西。我很努莽的,你知道 :P
把 fill-column 設(shè)為 60. 這樣的文字更好讀。
不用 TAB 字符來(lái)indent, 這會(huì)引起很多奇怪的錯(cuò)誤。編輯 Makefile 的時(shí)候也不用擔(dān)心,因?yàn)?makefile-mode 會(huì)把 TAB 鍵設(shè)置成真正的 TAB 字符,并且加亮顯示的。
設(shè)置 sentence-end 可以識(shí)別中文標(biāo)點(diǎn)。不用在 fill 時(shí)在句號(hào)后插入兩個(gè)空格。
可以遞歸的使用 minibuffer。我經(jīng)常需要這么做。
防止頁(yè)面滾動(dòng)時(shí)跳動(dòng), scroll-margin 3 可以在靠近屏幕邊沿3行時(shí)就開始滾動(dòng),可以很好的看到上下文。
把缺省的 major mode 設(shè)置為 text-mode, 而不是幾乎什么功能也沒有的 fundamental-mode.
括號(hào)匹配時(shí)顯示另外一邊的括號(hào),而不是煩人的跳到另一個(gè)括號(hào)。
光標(biāo)靠近鼠標(biāo)指針時(shí),讓鼠標(biāo)指針自動(dòng)讓開,別擋住視線。
在標(biāo)題欄顯示buffer的名字,而不是 emacs@wangyin.com 這樣沒用的提示。
讓 Emacs 可以直接打開和顯示圖片。
進(jìn)行語(yǔ)法加亮。
把這些缺省禁用的功能打開。
設(shè)置一下備份時(shí)的版本控制,這樣更加安全。
一個(gè)簡(jiǎn)單的辦法設(shè)置 auto-mode-alist, 免得寫很多 add-to-list.
設(shè)置有用的個(gè)人信息。這在很多地方有用。
讓 dired 可以遞歸的拷貝和刪除目錄。 移動(dòng)光標(biāo)
返回 Emacs Fill 詳解Emacs 具有非常智能的文本編輯能力。它可以自動(dòng)對(duì)文字?jǐn)嘈?,并且在斷開的行首都加入一些 prefix(前綴)。 你編輯 C 程序多行注釋的時(shí)候,你想要編輯器能夠自動(dòng)縮進(jìn)到合適的位置并且插入一個(gè) "*",就像這樣? /* seed the random number generator * first try the random file /dev/random * if there isn‘t such a file in the system * use current time to seed the RNG. */ 在你寫新聞組的文章的時(shí)候,你又想讓編輯器使你的文檔出現(xiàn)這樣漂亮的縮進(jìn): 1. I seed the random number generator first try the random file /dev/random if there isn‘t such a file in the system use current time to seed the RNG. 2. I need more powerful randomized binary search tree algorithm to store my wavefront elements. 這些 * 和 行首留出的空白就叫做 prefix。每當(dāng)使用 fill-paragraph 等操作或者啟動(dòng)了 auto-fill-mode 的時(shí)候,文字在斷行時(shí),Emacs 可能會(huì)在斷開的每行前面加入 prefix(前綴)。這大大方便了編輯類似程序注釋這一類文字。 設(shè)置 fill-columnfill-column就是說到多少列的時(shí)候斷行。你可以使用 C-u 70 C-x f 這樣的命令把 fill-column 設(shè)置為 70. 也可以把光標(biāo)移動(dòng)到你想要斷行的位置,然后按 C-u C-x f 斷開的行可能會(huì)被自動(dòng)加上一個(gè)前綴(prefix)。設(shè)置prefix的方式主要有兩種,手動(dòng)設(shè)置和 adaptive prefix 自動(dòng)設(shè)置。 手動(dòng)設(shè)置 prefix如果把光標(biāo)放在段落首后面一個(gè)位置,使用 C-x . (set-fill-prefix) 就可以把段落頭到光標(biāo)處的那段字符作為 prefix. Adaptive Filling但是沒有手動(dòng)設(shè)置 prefix 的時(shí)候,Emacs 也可以自動(dòng)識(shí)別段落首的一些字符作為 prefix。這就叫做 Adaptive Filling。 提取候選前綴Emacs 使用變量 adaptive-fill-regexp 來(lái)提取前綴。這個(gè)變量是一個(gè)正則表達(dá)式。它會(huì)把fill區(qū)域開頭的能夠匹配的部分作為候選的前綴。很多 major mode 會(huì)自動(dòng)幫你設(shè)置好這個(gè)變量,所以你通常不用操心。 但是某些時(shí)候,你可能希望能夠自己操縱這一切。我們下面就來(lái)看一個(gè)具體的例子。假設(shè)如果你要達(dá)到這種效果,在同一個(gè)文本文件里:
這些 "*** ", "* ", "1. ", "2. ", " " 就叫做前綴。為了識(shí)別這些前綴,我們把 adaptive-fill-regexp 設(shè)置為: (setq adaptive-fill-regexp "[ \t]+\\|[ \t]*\\([0-9]+\\.\\|\\*+\\)[ \t]*") 這表示前綴可以全是空白字符?;蛘唛_頭可以有一些空白,接著數(shù)字加點(diǎn)或者一個(gè)以上的 *,接著一些空白。那么 Emacs 發(fā)現(xiàn)開頭有這樣的字樣時(shí),就會(huì)把這個(gè)字符串作為一個(gè)“候選前綴”。 候選前綴的選擇我們已經(jīng)輕松提取了可能作為前綴的部分,但是一個(gè)候選前綴是否被使用,還有很多因素。Emacs 的策略是非常聰明的。我們下面來(lái)看看 Emacs 是怎樣為用戶著想的。
總結(jié)這個(gè)規(guī)則看起來(lái)挺復(fù)雜,不過我們可以用算法描述的方式簡(jiǎn)單的描述出來(lái): 1. 使用 adaptive-fill-regexp 把每行開頭部分能夠匹配的字符提取出來(lái),作 為“候選前綴”。 2. 如果文字有兩行以上,把第二行的候選前綴插入到斷開的所有行開頭。 3. 如果文字只有一行,看看 adaptive-fill-first-line-regexp 能不能匹配這 行的候選前綴。如果能匹配,使用這個(gè)前綴。否則,把這個(gè)前綴轉(zhuǎn)成同樣長(zhǎng) 度的空格,把這些空格作為前綴。 Emacs Outline Mode 示例
下面就是一個(gè) LaTeX 文檔的各種 outline 操作的結(jié)果示范。由于 outline-minor-mode 的鍵綁定前綴 C-c @ 過于復(fù)雜,大部分經(jīng)常使用 outline 的人想把它設(shè)置為另一個(gè)鍵,所以以后我在敘述時(shí)直接稱呼函數(shù)名字和簡(jiǎn)化前綴的鍵綁定。具體的鍵綁定請(qǐng)用 C-h w 查詢。 更改前綴可以在啟動(dòng) outline-minor-mode 之前,用改變 outline-minor-mode-prefix 變量的辦法一次完成。比如: (setq outline-minor-mode-prefix [(control o)]) 就可以把前綴改成 C-o. 以后我們實(shí)例中的鍵綁定都使用 C-o. 本文的 Outline首先,給大家一個(gè) outline 的總體印象。我們使用 outline 來(lái)看看本文的主要內(nèi)容 :)
原文檔這是一個(gè)非常簡(jiǎn)單的 LaTeX 文檔: outline.tex
我們來(lái)把文檔的各部分術(shù)語(yǔ)解釋一下。
啟動(dòng) OutlineM-x outline-minor-mode 就可以啟動(dòng) Outline。還有一個(gè) outline-mode 是一個(gè) major mode,一般都不用它。 全局隱藏操作光標(biāo)在任何位置,只要執(zhí)行這些操作,文檔的顯示就會(huì)變化成需要的樣子。 hide-sublevels(C-o C-q)這個(gè)操作如果不帶參數(shù),隱藏所有文檔子結(jié)構(gòu),只剩最上層。
M-4 hide-sublevels(M-4 C-o C-q)這是參數(shù)為4的操作,顯示至文檔第4層子結(jié)構(gòu)。
hide-body(C-o C-t)文檔的所有 Entry 都被隱藏。只顯示主干。
對(duì)一個(gè)子樹(Chapter 1)的隱藏操作hide-subtree(C-o C-d)所有文檔部分展開時(shí),光標(biāo)移動(dòng)到 Chapter 1,執(zhí)行 hide-subtree。整個(gè) Chapter 1 的子樹被折疊起來(lái)。
hide-other(C-o C-o)所有文檔部分展開時(shí),光標(biāo)移動(dòng)到 Chapter 1,執(zhí)行 hide-other。除了 Chapter 1,其它子樹全部被折疊起來(lái)。這個(gè)操作正好與 hide-subtree 互補(bǔ)。
hide-leaves(C-o C-l)所有文檔部分展開時(shí),光標(biāo)移動(dòng)到 Chapter 1,執(zhí)行 hide-leaves。所有 Chapter 1 子樹下的所有級(jí)別的 entry 被隱藏。也就是說,Chapter 1 下,只顯示 branch.
hide-entry(C-o C-c)所有文檔部分展開時(shí),光標(biāo)移動(dòng)到 Chapter 1,執(zhí)行 hide-entry。Chapter 1 的 Entry 被隱藏,但是所有子樹都不動(dòng)。
全局顯示操作show-all(C-o C-a)顯示所有文檔。結(jié)果就是原文檔。 對(duì)一個(gè)子樹的顯示操作為了演示,我們從全部隱藏的情況開始:
show-children(C-o C-i)show-children 只顯示直接的下一代子樹,而不顯示間接的下一代。這里, \begin{document} 的直接的下一代就是 \chapter{...}。
show-entry(C-o C-e)把光標(biāo)移動(dòng)到 Chapter 1,執(zhí)行 show-entry。Chapter 1 的 Entry 被顯示,但是所有子結(jié)構(gòu)還是保持隱藏。 show-branches(C-o C-k)把光標(biāo)移動(dòng)到 Chapter 1,執(zhí)行 show-branches。Chapter 1 這棵子樹之下的各級(jí)“樹干”被顯示,但是各級(jí) entry 還是保持隱藏。Chapter 1 自己的 entry,由于我們上一步已經(jīng)顯示,所以保持不變。
show-subtree(C-o C-s)把光標(biāo)移動(dòng)到 Chapter 1,執(zhí)行 show-subtree。Chapter 1 及其所有子結(jié)構(gòu)全部被擴(kuò)展。
Outline mode 下的移動(dòng)操作在 outline 模式下,有幾種特殊方便的移動(dòng)方式。
|
|
來(lái)自: helloworld > 《linux》