http://docs.huihoo.com/homepage/shredderyin/emacs_elisp.html
php
Emacs 具備超強的擴展性。這是當今沒有任何其它編輯器能夠比擬 的強大特色。這裏介紹一些很方便的 Emacs Lisp 擴展。html
有連接的文件可能不是 Emacs 自帶的,你須要下載el文件到你的 load-path 中的一個目錄裏。web
全部文件能夠點擊連接下載,你也能夠點擊這裏一次性下載全部 el 文件,可是不包括大型的 elisp 包,好比 dictionary. [下載]。正則表達式
這裏提供的下載是我正在用的版本。我沒有列出我找到它們的地址, 由於我記不住那麼多。若是你須要最新的版本,請查看文件裏的網址 到做者的主頁。瀏覽器
每一個標題後面的lisp代碼是須要寫到配置文件裏的東西。服務器
(require 'session) (add-hook 'after-init-hook 'session-initialize)session
使用了這個擴展以後,你上次離開 Emacs 時的全局變量 (kill-ring,命令記錄……),局部變量,寄存器,打開的文件,修 改過的文件和最後修改的位置,…… 所有都會被記錄下來。app
加載了 session 以後菜單上會多兩項:最近訪問過的文件和最近 修改過的文件。看這個圖 。編輯器
(load "desktop") (desktop-load-default) (desktop-read)ide
若是你想保存上次打開的文件記錄,那麼可使用 desktop。這是 Emacs 自 帶的。你只須要加入以上設置,而後 M-x desktop-save。之後 Emacs 啓動時就會打開你上次離開時的全部 buffer.
M-x desktop-clear 能夠刪除記住的內容,你閒如今記住的 buffer 太多就能夠採用這個辦法。不過我仍是建議用 ibuffer(見下) 來管理這些buffer,由於有時你會發現,若是刪掉所有記住的buffer, 之後你須要必定的時間來打開你常常編輯的文件!
若是session跟desktop配合,下次啓動Emacs 的時候,就像根本 沒有關閉 Emacs 同樣!多爽!
把這幾行加入 .emacs 就能夠把 C-x C-b 那個普通的 buffer menu 換成很是方便的 ibuffer 啦!
(require 'ibuffer)
(global-set-key (kbd "C-x C-b") 'ibuffer)
使用了 desktop 以後有可能使你同時有幾十個 buffer 同時打開 着。有時你想把其中一些關閉,有時你想在某些 buffer 裏尋找某個 regexp。這個時候你能夠用 ibuffer,它有跟 dired 類似的界面。 能夠對 buffer 進行各類標記,排序,隱藏,查找,替換。很是好用。 看看這個抓圖就是我限定顯示 emacs-lisp-mode 和 c-mode 的 buffer,按 major mode 名稱排序, 並作上一些記號的狀況。
我經常使用的一個功能是,用 %-n 標記符合某種名字的 buffer,然 後按 "O" 在這些buffer裏尋找我須要的字串。好比在全部打開的後 綴爲 html 的 buffer 裏尋找 "Emacs" 字樣,獲得以下結果。
(require 'browse-kill-ring)
(global-set-key [(control c)(k)] 'browse-kill-ring)
(browse-kill-ring-default-keybindings)
方便的在 kill-ring 裏尋找須要的東西。
你是否是常常按 C-y 放進一個 kill-ring 裏的單元。而後 M-y,M-y,…… 來尋找你須要的好久之前剪切下來的東西?很費事吧?用了 browse-kill-ring 就行了。你只須要把它綁定到一個熱鍵,好比 C-c k: 就能出現這樣一個buffer。[查看圖形]
kill-ring 裏的內容均可以方便的瀏覽,粘貼。具體操做請在這 個 buffer 裏 C-h m 或者 ?.
你可能用過 iswitchb。可是當有不少buffer時,iswitchb 仍是很慢。你可 以使用ido。這是我見過的最方便的切換buffer,尋找文件的擴展了。在你的 .emacs 文件里加入:
(require 'ido)(ido-mode t)ido 主要有兩個界面:打開文件和切換buffer,它們之間能夠隨便切換。它的原 始的鍵設定不是很方便直觀,因此我把它另外設置了一下。看這個列表。其實你從這個列表就能夠看出 ido 的功能。 我這裏只敘述一下基本的操做。
啓動 ido-mode 之後,你能夠在 C-x C-f 打開文件時獲得一個以下的界面:
你開始輸入文件名,前綴匹配的文件和目錄都會列在光標後面的表裏。目錄 是紅色的。
你可使用 C-s,C-r 或者左右光標鍵在匹配的文件之間來回旋轉,按上下 光標能夠在匹配的目錄名之間旋轉。你能夠按 TAB 補全名字,方括號裏的內容 是你按 TAB 將會補全的字符。按 backspace 遇到目錄名時,一次會吃掉整個目 錄名,而且到達上一級目錄。C-k 能夠刪除一個文件。別擔憂,當刪除文件時, 你會被要求作出明確的回答。
若是你按 C-p 就會啓動部分匹配,而不是嚴格前綴匹配。這時只要文 件名的一部分與你的輸入匹配就會列在表中。
按 C-t 就會切換到正則表達式匹配方式,你輸入的文字將被做爲正則 表達式對文件進行匹配。好比我輸入 ".*el$" 就能夠獲得全部以 "el" 結尾的 文件列表。
另外,C-c 和 C-a 分別切換大小寫匹配和忽略某些文件。
你訪問過的目錄都會被 ido 記住,你能夠按 M-up 和 M-down切換之前訪問 過的目錄,按 M-left 和 M-right 能夠提出之前使用過的文件名。
按 C-b 就會切換到選擇buffer模式。按 C-d 就會進入Dired.
注意,你若是要建立一個新的文件叫 "ab",而你的目錄裏有匹配前綴的文件 或目錄,RET 就會打開部分匹配的文件。因此這個時候你必須按 C-j 來建立這 樣一個文件。若是沒有匹配的文件,那麼RET也會建立一個新的文件。
因爲方向鍵,backspace 和 C-f, C-b 都被做爲其它用途了,因此若是你想 把光標移動到行首修改一些東西,你必須按 C-e 進入編輯模式。
Emacs 打開文件的函數叫 find-file。這是不少人不理解的問題。下面咱們 就能看到,有了 ido 以後,這個函數就名副其實了。當你輸入了一個文件名或 者正則表達式,而在當前目錄沒有這樣的文件,你就能夠利用ido的查找功能了。 我舉一個例子好了。
我常常同時編輯不一樣種類的文件,它們在系統裏不一樣的目錄中。它們的目錄 名會被ido記住。這樣我打開一個文件時,能夠無論它在哪一個目錄。我只須要輸 入它的名字。好比,我剛纔已經打開了
~/html/emacs_elisp.html/usr/local/texlive/texmf-local/tex/latex/CJK/GB/c19fzhc.fd~/.emacs.d/site-lisp/folding.el....如今我想打開另外一些/usr/local/texlive/texmf-local/tex/latex/CJK/GB/目錄下的 .cap 文件。我就在 C-x C-f 的界面按輸入 "cap$",而後打開正則匹配 和部分匹配,出現如下界面:由於當前目錄(PWD)下沒有後綴是 fd 的文件,因此我按了一下 M-up,這下 成了這個樣子:
顯然它找到一個結尾是 "cap" 的文件,可是這不是我想要的,因而我繼續按 一下 M-up 到再上面一個目錄裏去找。就成了這樣:
這就是我須要的文件!想想,你的當前目錄不在那個地方,用別的辦法打 開如此深一個目錄裏的文件須要花多少時間?
其實咱們還有一個竅門,剛纔若是在不能匹配的時候按 M-s,ido 就會把所 路徑合併,找到匹配文件,而後給出一個列表:
切換 buffer 的界面也跟打開文件功能相似。不過少了一些文件特有的功能, 多了一些buffer特有的的功能。
打開文件時 C-k 是刪除文件,如今 C-k 變成了關閉 buffer。若是你按 C-a 就會顯示一般被忽略的 buffer。
若是不存在這樣的的buffer,你能夠直接回車新建一個buffer,也可使用 C-f 切換到打開文件界面。
這個擴展功能實在太多,你看了個人敘述可以體會到它的方便了吧。可是實 際使用時,你不多能記住全部這些功能。最好是本身綁定鍵。在須要的時候能夠 查詢這個鍵綁定。就像個人這個鍵綁定。
最新的 ido 能夠逐步篩選你須要的文件 (ido-restrict-to-matches),你能夠把這段代碼加入你的 .emacs.
使用這個,你就能夠方便的在最近編輯的 buffer 之間切換了。 切換的時候會出現一個小窗口顯示附近的buffer,就像翻頁同樣。看 看抓圖。
我把它綁定到了 C-prior 和 C-next,按起來很方便。並且你可 以用變量 swbuff-exclude-buffer-regexps 設定你不想看到的 buffer。它們不會出如今列表裏。這個例子中我把全部名稱開頭是空 格的 buffer 和名字先後都是 "*" 的都排除在輪訓之外,這樣就可 以在不一樣的文件之間切換而不被惱人的臨時 buffer 擾亂了。
一個很重要的變量是 swbuff-status-window-layout, 改變它的 值能夠改變 swbuff 下面那個窗口的顯示方式。
若是你的 buffer 不少,這個窗口能夠長得很大。若是你把 swbuff-status-window-layout設爲 'adjust,則不論何時都會 出現這樣的大窗口,設爲 'default 則只有單窗口時纔出現大窗口。 雖然這個窗口只顯示幾秒鐘,可是 我很討厭一個那麼大的窗口在我 面前一閃。如今若是你把它設爲 'scroll,不論何時都只佔用一 行。這樣buffer太多時,那個窗口不會佔用太多空間擾亂視線。
原來的 swbuff 有一個小小的 bug, 不管 swbuff-status-window-layout 是什麼值,都會顯示一個很大的窗口 顯示全部的 buffer,這個文件是我修改過的版本。
swbuff-clear-delay 能夠控制小窗口消失的延遲。
swbuff-window-min-text-height 能夠控制小窗口的大小。若是 設爲 0, 就不會打開小窗口了。
你曾經以爲 Windows 樣式的編輯器上面的 tab 很好用吧?其實 Emacs 的更好,它不但能夠把全部 buffer 列在 tab 上,並且根據 major mode 對 tab 進行分組。你能夠用 customize-group RET tabbar RET 來設置它的選項。
我把Windows鍵盤上的 "Win" 鍵綁定到了這個功能,由於 tabbar 很像Windows 的風格。按 Win-left 和 Win-right 就會在同組 tab 之間切換,Win-up 和 Win-down 能夠在分組之間切換。
看看下面幾個圖你就知道它如何好用啦!
顯示 html mode 的分組:
分組列表
在不一樣的窗口裏能夠有獨立的 tab。圖片太大,要看的話點擊這裏
tabbar 有一個小小的 Hack, 可使你更方便。
這個是 Emacs 自帶的。M-x speedbar 就能夠啓動它。它可讓你 方便的瀏覽文件,你還能夠顯示文件裏的標題,函數,變量……
在你編輯不一樣的文件時,它能夠顯示當前文件所在目錄裏的相關文 件和它們的信息,好比文件是否須要從新編譯,elisp文件是否已 經編譯,…… 等等。
你能夠看看個人抓圖。
很是酷的一個擴展。能夠「所見即所得」的編輯一個文本模式的 表格。就跟不少字處理程序那樣操做,能夠識別文本文件裏原本就存 在的表格,並且能夠把表格輸出爲 HTML 和 TeX。看看個人抓圖吧。
這個擴展能夠幫你保存一個「最近打開的文件」列表。在 .emacs 文件里加 入:
(require 'recentf)(recentf-mode 1)你能夠把不經常使用的C-x C-r 綁定到這樣一個函數:(defun recentf-open-files-compl () (interactive) (let* ((all-files recentf-list) (tocpl (mapcar (function (lambda (x) (cons (file-name-nondirectory x) x))) all-files)) (prompt (append '("File name: ") tocpl)) (fname (completing-read (car prompt) (cdr prompt) nil nil))) (find-file (cdr (assoc-ignore-representation fname tocpl))))) (global-set-key [(control x)(control r)] 'recentf-open-files-compl)這樣你就能夠 C-x C-r 而後 TAB 列出最近打開文件列表了。你是否是以爲 Emacs 的「矩形區域操做」不太直觀?使用這個包以後矩形 region會被真正顯示成一個矩形。[查看圖形]這 可使你的矩形操做大大方便。
若是你已經有了一個 region。你可使用 C-x r C-x 把它顯示爲一個矩形。 若是你剛開始設定一個矩形區域,你可使用 C-x r 做爲你的 set-mark-command 的前綴,好比 C-x r C-SPC。那麼區域會被顯示爲矩形。
這個是 Emacs 自帶的功能,但是知道它的人很少。不少人用的是M-/ (dabbrev-expand) 這樣的東西。 hippie-expand 要強大的多。由於它可使用 擴展函數任意擴充!你能夠把你的 M-/ 綁定到 hippie-expand,立刻就能夠體 會到它的方便。
(global-set-key [(meta ?/)] 'hippie-expand)你能夠設置如下 hippie-expand 的補全方式。它是一個優先列表, hippie-expand 會優先使用表最前面的函數來補全。一般個人設置是:(setq hippie-expand-try-functions-list '(try-expand-dabbrev try-expand-dabbrev-visible try-expand-dabbrev-all-buffers try-expand-dabbrev-from-kill try-complete-file-name-partially try-complete-file-name try-expand-all-abbrevs try-expand-list try-expand-line try-complete-lisp-symbol-partially try-complete-lisp-symbol))這是說,首先使用當前的buffer補全,若是找不到,就到別的可見的窗口裏尋找, 若是還找不到,那麼到全部打開的buffer去找,若是還……那麼到kill-ring裏, 到文件名,到簡稱列表裏,到list,…… 當前使用的匹配方式會在 echo 區域 顯示。
特別有意思的是 try-expand-line,它能夠幫你補全整整一行文字。我不少 時後有兩行文字大體相同,只有幾個字不同,可是我懶得去拷貝粘貼如下。那 麼我就輸入這行文字的前面幾個字。而後多按幾下 M-/ 就能獲得那一行。
這是一個很小的函數。你是否是以爲 Emacs 在匹配的括號之間來回跳轉的時 候按 C-M-f 和 C-M-b 太麻煩了?vi的 % 就很方便,咱們能夠把 % 設置爲匹配 括號。但是你想輸入 % 怎麼辦呢?
一個很巧妙的解決方案就是,當 % 在括號上按下時,那麼匹配括號,不然輸 入一個 %。你只須要在 .emacs 文件里加入這些東西就能夠達到目的:
(global-set-key "%" 'match-paren) (defun match-paren (arg) "Go to the matching paren if on a paren; otherwise insert %." (interactive "p") (cond ((looking-at "\\s\(") (forward-list 1) (backward-char 1)) ((looking-at "\\s\)") (forward-char 1) (backward-list 1)) (t (self-insert-command (or arg 1)))))有時你須要跳到另外一個文件進行一些操做,而後很快的跳回來。你固然能夠 使用 bookmark 或者寄存器。可是這些實在是太慢了。你多想擁有vi那樣的 ma, mb, 'a, 'b 的操做。如今你能夠用幾行 elisp 達到相似的目的:
(global-set-key [(control ?\.)] 'ska-point-to-register)(global-set-key [(control ?\,)] 'ska-jump-to-register)(defun ska-point-to-register() "Store cursorposition _fast_ in a register. Use ska-jump-to-register to jump back to the stored position." (interactive) (setq zmacs-region-stays t) (point-to-register 8))(defun ska-jump-to-register() "Switches between current cursorposition and positionthat was stored with ska-point-to-register." (interactive) (setq zmacs-region-stays t) (let ((tmp (point-marker))) (jump-to-register 8) (set-register 8 tmp)))當你按 C-. 時就作了一個記號。而後你能夠到別處,按 C-, 就能夠在這兩點之 間來回跳轉了。這雖然沒有 vi 的 26 個 mark 多,可是你仔細想一想,vi的26個 mark,你一般能用到幾個?很是感謝 Oliver Scholz 提供這個函數給 我。
這個函數是一個 vi 的 "f" 命令的替代品。vi的用戶知道,vi有 一個特別好的命令 "f"。當你按 "fx", x 是任意一個字符時,光標 就會移動到下一個 "x" 處。這以後只要按 ";"(分號),光標就到再 下一個 "x"。
舉個例子說明這個命令的用途。好比咱們有這樣一行字,光標在 行首。
(setq unread-command-events (list last-input-event))) ^^^^^咱們但願迅速的到達最後那個 event 處,因而我在 vi 裏按 "fe"。結果光標到了 "setq" 的那個 e 上面,這時候我接着按 ";", 不一下子就到了咱們想要的地方。很方便吧?可能起初不以爲,後來 你發現這真的很是好!
我一直以爲 Emacs 沒有這樣一個方便的命令,可是 Oliver 給了 我一個完美的答案:
有了這段代碼以後,當你按 C-c a x (x 是任意一個字符) 時,光 標就會到下一個 x 處。再次按 x,光標就到下一個 x。好比 C-c a w w w w ..., C-c a b b b b b b ...
我以爲這個方式比 vi 的 "f" 要快。
這兩個包能夠用來顯示文件的行號。而且根據是否空行和文件行 的語法加亮顯示不一樣的數字顏色。
看看個人抓圖。
這兩個函數能夠分別把一個區域和匹配某個regexp的行都藏起來, 就跟不存在同樣……這樣你就能夠對某些內容進行任意的操做而不會 影響到其它的部分。
hide-lines 在操做某些行的時候用起來特別方便。加一個前綴參 數能夠把不匹配的行都藏起來,只看到匹配的!看看我只顯示這個文 件裏含有global-set-key 的行:
個人 folding 配置很長,要看請點擊這裏。
我編輯了這麼長一個 HTML 文件,你以爲必定很費力,不容易定 位吧?其實個人屏幕看起來就是這 個樣子。全部小節都被我摺疊了起來,我很容易就能夠調換小節 的位置。我剛纔把folding的大段的配置代碼移動到了另外一個文件, 就像移動了一行。
folding 根據不一樣的文檔有不一樣的標記,它都是基於註釋的。本 網頁就是這樣一個例子。
把語法加亮的文件輸出成彩色 HTML 文件。看看這個例子。
鏈接到 dict 協議服務器,而且查詢單詞含義。按 C-c d 查詢道當 前單詞,按 C-c m 在字典裏查找一個匹配的單詞,鼠標郵件點擊單詞 會彈出菜單。還有 tooltip 功能!很是好用!你能夠看看個人屏幕截圖。
你能夠在本身機器上安裝一個 dictd。這樣就不須要連到很遠的服 務器查字典了。
Emacs 提供給你全部的配色機制,但是因爲你的藝術細胞不夠,常常爲找不 到好的配色方案而煩惱。使用這個包就能夠方便的改變你的 Emacs 的配色方案 啦!看看個人屏幕抓圖 [1] [2] [3]
它提供了50種以上的配色方案。你只須要把:
(require 'color-theme)加入到 .emacs 文件。使用 M-x color-theme-select 就會出現一個配色方案選 擇窗口,在配色方案上按 l 就能夠改變當前 frame 的配色,按 i 就能夠改變 全部 frame 的配色。若是你想選定一個配色方案後就一直用它,而避免每次都加載大量用不着的 lisp代碼,按 p 就能夠把當前配色方案的 lisp 打印出來,你能夠把它加到你 的 .emacs 文件。而不使用 (require 'color-theme) 這樣能夠加快啓動速度。
這個擴展能夠把 Emacs 變成一個圖片瀏覽器。看看抓圖吧。
你想過一個 buffer 裏同時存在不少個 major mode 嗎?如今用 MMM 就能夠辦到了。在不一樣的區域擁有對應鍵綁定,變量,縮進 ……
看看個人抓圖,HTML, Emacs Lisp, Perl, C 和 LaTeX 全都都在同一個 buffer 裏被正確的語法 加亮了!並且TAB在不一樣的區域均可以進行正確縮進。在 LaTeX 的區 域還可使用 AUC TeX 來處理某個部分。
固然我如今是在濫用這個模式。若是你有嵌入 HTML 的 JavaScript 或 CSS2, PL/SQL,……這個就有用了。
我可使用這個擴展來處理 CWEB 程序。最外面的 major mode 用 cweb-mode, 裏面的 TeX 和 C 的區域就使用它們各自的TeX-mode 和 c-mode。看起來就像這個樣子 。
看到這個名字你還覺得是一個 TeX 發行吧?它不是一個 TeX 發 行,而是一個專門用來幫助做者寫 TeX/LaTeX 文檔的工具。它大大 增強了 LaTeX 用戶的能力。你寫文檔時可以只 TeX 一個你以爲須要 看到效果的 region 的內容,而沒必要等待漫長的編譯過程啦!
能夠把 LaTeX 文檔的效果插入到文檔裏,造成一個預覽,與你的 原文件一一對照。很是方便。你能夠看看個人抓圖:
注意要用這個包,你必須安裝 TeX 系統和 AUCTeX.
ctypes 能夠識別你的 C 文件裏的類型定義 (typedef)。自動對 它們進行語法加亮。
ECB(Emacs Code Browser) 是一個代碼瀏覽器,它依賴於Semantic 和Eieio。
它們組合能夠實現很好的文法分析的代碼瀏覽。ECB 在 Semantic 和 Eieio 的支持下,能夠識別許許多多種計算機語言,C, C++, Java, Elisp, ...
看看這個抓圖。
用來製做 WiKi 的包。很是方便。看看個人抓圖。
這上面的只是我本身的設定,你要根據本身的狀況修改。
我寫了一個簡要的 WiKi 說明在 這 裏。
更多的信息請參考 http://repose.cx/emacs/wiki/。