Emacs Lisp 功能擴(kuò)展集錦
Emacs 具有超強(qiáng)的擴(kuò)展性。這是當(dāng)今沒(méi)有任何其它編輯器可以比擬的強(qiáng)大特點(diǎn)。這里介紹一些很方便的 Emacs Lisp 擴(kuò)展。
有鏈接的文件可能不是 Emacs 自帶的,你需要下載el文件到你的 load-path 中的一個(gè)目錄里。
所有文件可以點(diǎn)擊鏈接下載,你也可以點(diǎn)擊這里一次性下載所有 el 文件,但是不包括大型的 elisp 包,比如 dictionary. [下載]。
這里提供的下載是我正在用的版本。我沒(méi)有列出我找到它們的地址, 因?yàn)槲矣洸蛔∧敲炊唷H绻阈枰钚碌陌姹荆?qǐng)查看文件里的網(wǎng)址 到作者的主頁(yè)。
每個(gè)標(biāo)題后面的lisp代碼是需要寫到配置文件里的東西。
session.el
(require 'session)
(add-hook 'after-init-hook 'session-initialize)
使用了這個(gè)擴(kuò)展之后,你上次離開(kāi) Emacs 時(shí)的全局變量 (kill-ring,命令記錄……),局部變量,寄存器,打開(kāi)的文件,修改過(guò)的文件和最后修改的位置,…… 全部都會(huì)被記錄下來(lái)。
加載了 session 之后菜單上會(huì)多兩項(xiàng):最近訪問(wèn)過(guò)的文件和最近修改過(guò)的文件。看這個(gè)圖 。
desktop.el
(load "desktop")
(desktop-load-default)
(desktop-read)
如果你想保存上次打開(kāi)的文件記錄,那么可以使用 desktop。這是 Emacs 自帶的。你只需要加入以上設(shè)置,然后 M-x desktop-save。以后 Emacs 啟動(dòng)時(shí)就會(huì)打開(kāi)你上次離開(kāi)時(shí)的所有 buffer.
M-x desktop-clear 可以刪除記住的內(nèi)容,你閑現(xiàn)在記住的 buffer 太多就可以采用這個(gè)辦法。不過(guò)我還是建議用 ibuffer(見(jiàn)下) 來(lái)管理這些buffer,因?yàn)橛袝r(shí)你會(huì)發(fā)現(xiàn),如果刪掉全部記住的buffer,以后你需要一定的時(shí)間來(lái)打開(kāi)你經(jīng)常編輯的文件!
如果session跟desktop配合,下次啟動(dòng)Emacs 的時(shí)候,就像根本沒(méi)有關(guān)閉 Emacs 一樣!多爽!
ibuffer.el
把這幾行加入 .emacs 就可以把 C-x C-b 那個(gè)普通的 buffer menu 換成非常方便的 ibuffer 啦!
(require 'ibuffer)
(global-set-key (kbd "C-x C-b") 'ibuffer)
使用了 desktop 之后有可能使你同時(shí)有幾十個(gè) buffer 同時(shí)打開(kāi)著。有時(shí)你想把其中一些關(guān)閉,有時(shí)你想在某些 buffer 里尋找某個(gè) regexp。這個(gè)時(shí)候你可以用 ibuffer,它有跟 dired 相似的界面。可以對(duì) buffer 進(jìn)行各種標(biāo)記,排序,隱藏,查找,替換。非常好用。看看這個(gè)抓圖就是我限定顯示 emacs-lisp-mode 和 c-mode 的 buffer,按 major mode 名稱排序,并做上一些記號(hào)的情況。
我常用的一個(gè)功能是,用 %-n 標(biāo)記符合某種名字的 buffer,然后按 "O" 在這些buffer里尋找我需要的字串。比如在所有打開(kāi)的后綴為 html 的 buffer 里尋找 "Emacs" 字樣,得到如下結(jié)果。
browse-kill-ring.el
(require 'browse-kill-ring)
(global-set-key [(control c)(k)] 'browse-kill-ring)
(browse-kill-ring-default-keybindings)
方便的在 kill-ring 里尋找需要的東西。
你是不是經(jīng)常按 C-y 放進(jìn)一個(gè) kill-ring 里的單元。然后 M-y,M-y,…… 來(lái)尋找你需要的很久以前剪切下來(lái)的東西?很費(fèi)事吧?用了 browse-kill-ring 就好了。你只需要把它綁定到一個(gè)熱鍵,比如 C-c k: 就能出現(xiàn)這樣一個(gè)buffer。[查看圖形]
kill-ring 里的內(nèi)容都可以方便的瀏覽,粘貼。具體操作請(qǐng)?jiān)谶@個(gè) buffer 里 C-h m 或者 ?.
ido.el
你可能用過(guò) iswitchb。但是當(dāng)有很多buffer時(shí),iswitchb 還是很慢。你可以使用ido。這是我見(jiàn)過(guò)的最方便的切換buffer,尋找文件的擴(kuò)展了。在你的 .emacs 文件里加入:
(require 'ido)
(ido-mode t)
ido 主要有兩個(gè)界面:打開(kāi)文件和切換buffer,它們之間可以隨便切換。它的原始的鍵設(shè)定不是很方便直觀,所以我把它另外設(shè)置了一下。看這個(gè)列表。其實(shí)你從這個(gè)列表就可以看出 ido 的功能。我這里只敘述一下基本的操作。
1. 打開(kāi)文件 (C-x C-f)
啟動(dòng) ido-mode 以后,你可以在 C-x C-f 打開(kāi)文件時(shí)得到一個(gè)如下的界面:
你開(kāi)始輸入文件名,前綴匹配的文件和目錄都會(huì)列在光標(biāo)后面的表里。目錄是紅色的。
你可以使用 C-s,C-r 或者左右光標(biāo)鍵在匹配的文件之間來(lái)回旋轉(zhuǎn),按上下光標(biāo)可以在匹配的目錄名之間旋轉(zhuǎn)。你可以按 TAB 補(bǔ)全名字,方括號(hào)里的內(nèi)容是你按 TAB 將會(huì)補(bǔ)全的字符。按 backspace 遇到目錄名時(shí),一次會(huì)吃掉整個(gè)目錄名,并且到達(dá)上一級(jí)目錄。C-k 可以刪除一個(gè)文件。別擔(dān)心,當(dāng)刪除文件時(shí),你會(huì)被要求做出明確的回答。
如果你按 C-p 就會(huì)啟動(dòng)部分匹配,而不是嚴(yán)格前綴匹配。這時(shí)只要文件名的一部分與你的輸入匹配就會(huì)列在表中。
按 C-t 就會(huì)切換到正則表達(dá)式匹配方式,你輸入的文字將被作為正則表達(dá)式對(duì)文件進(jìn)行匹配。比如我輸入 ".*el$" 就可以得到所有以 "el" 結(jié)尾的 文件列表。
另外,C-c 和 C-a 分別切換大小寫匹配和忽略某些文件。
你訪問(wèn)過(guò)的目錄都會(huì)被 ido 記住,你可以按 M-up 和 M-down切換以前訪問(wèn)過(guò)的目錄,按 M-left 和 M-right 可以提出以前使用過(guò)的文件名。
按 C-b 就會(huì)切換到選擇buffer模式。按 C-d 就會(huì)進(jìn)入Dired.
注意,你如果要?jiǎng)?chuàng)建一個(gè)新的文件叫 "ab",而你的目錄里有匹配前綴的文件或目錄,RET 就會(huì)打開(kāi)部分匹配的文件。所以這個(gè)時(shí)候你必須按 C-j 來(lái)創(chuàng)建這樣一個(gè)文件。如果沒(méi)有匹配的文件,那么RET也會(huì)創(chuàng)建一個(gè)新的文件。
由于方向鍵,backspace 和 C-f, C-b 都被作為其它用途了,所以如果你想把光標(biāo)移動(dòng)到行首修改一些東西,你必須按 C-e 進(jìn)入編輯模式。
2. 尋找文件
Emacs 打開(kāi)文件的函數(shù)叫 find-file。這是很多人不理解的問(wèn)題。下面我們就能看到,有了 ido 之后,這個(gè)函數(shù)就名副其實(shí)了。當(dāng)你輸入了一個(gè)文件名或者正則表達(dá)式,而在當(dāng)前目錄沒(méi)有這樣的文件,你就可以利用ido的查找功能了。我舉一個(gè)例子好了。
我經(jīng)常同時(shí)編輯不同種類的文件,它們?cè)谙到y(tǒng)里不同的目錄中。它們的目錄名會(huì)被ido記住。這樣我打開(kāi)一個(gè)文件時(shí),可以不管它在哪個(gè)目錄。我只需要輸入它的名字。比如,我剛才已經(jīng)打開(kāi)了
~/html/emacs_elisp.html
/usr/local/texlive/texmf-local/tex/latex/CJK/GB/c19fzhc.fd
~/.emacs.d/site-lisp/folding.el
....
現(xiàn)在我想打開(kāi)另一些
/usr/local/texlive/texmf-local/tex/latex/CJK/GB/
目錄下的 .cap 文件。我就在 C-x C-f 的界面按輸入 "cap$",然后打開(kāi)正則匹配和部分匹配,出現(xiàn)以下界面:
因?yàn)楫?dāng)前目錄(PWD)下沒(méi)有后綴是 fd 的文件,所以我按了一下 M-up,這下成了這個(gè)樣子:
顯然它找到一個(gè)結(jié)尾是 "cap" 的文件,但是這不是我想要的,于是我繼續(xù)按一下 M-up 到再上面一個(gè)目錄里去找。就成了這樣:
這就是我需要的文件!想一想,你的當(dāng)前目錄不在那個(gè)地方,用別的辦法打開(kāi)如此深一個(gè)目錄里的文件需要花多少時(shí)間?
其實(shí)我們還有一個(gè)竅門,剛才如果在不能匹配的時(shí)候按 M-s,ido 就會(huì)把所路徑合并,找到匹配文件,然后給出一個(gè)列表:
3. 切換buffer(C-x b)
切換 buffer 的界面也跟打開(kāi)文件功能類似。不過(guò)少了一些文件特有的功能,多了一些buffer特有的的功能。
打開(kāi)文件時(shí) C-k 是刪除文件,現(xiàn)在 C-k 變成了關(guān)閉 buffer。如果你按 C-a 就會(huì)顯示通常被忽略的 buffer。
如果不存在這樣的的buffer,你可以直接回車新建一個(gè)buffer,也可以使用 C-f 切換到打開(kāi)文件界面。
這個(gè)擴(kuò)展功能實(shí)在太多,你看了我的敘述能夠體會(huì)到它的方便了吧。但是實(shí)際使用時(shí),你很少能記住所有這些功能。最好是自己綁定鍵。在需要的時(shí)候可以查詢這個(gè)鍵綁定。就像我的這個(gè)鍵綁定。
最新的 ido 可以逐步篩選你需要的文件 (ido-restrict-to-matches),你可以把這段代碼加入你的 .emacs.
# swbuff
(require 'swbuff)
(global-set-key (kbd "") 'swbuff-switch-to-previous-buffer)
(global-set-key (kbd "") 'swbuff-switch-to-next-buffer)
(setq swbuff-exclude-buffer-regexps
'("^ " "\\*.*\\*"))
(setq swbuff-status-window-layout 'scroll)
(setq swbuff-clear-delay 1)
(setq swbuff-separator "|")
(setq swbuff-window-min-text-height 1)
使用這個(gè),你就可以方便的在最近編輯的 buffer 之間切換了。切換的時(shí)候會(huì)出現(xiàn)一個(gè)小窗口顯示附近的buffer,就像翻頁(yè)一樣。看看抓圖。
我把它綁定到了 C-prior 和 C-next,按起來(lái)很方便。而且你可以用變量 swbuff-exclude-buffer-regexps 設(shè)定你不想看到的 buffer。它們不會(huì)出現(xiàn)在列表里。這個(gè)例子中我把所有名稱開(kāi)頭是空格的 buffer 和名字前后都是 "*" 的都排除在輪訓(xùn)以外,這樣就可以在不同的文件之間切換而不被惱人的臨時(shí) buffer 擾亂了。
一個(gè)很重要的變量是 swbuff-status-window-layout, 改變它的值可以改變 swbuff 下面那個(gè)窗口的顯示方式。
如果你的 buffer 很多,這個(gè)窗口可以長(zhǎng)得很大。如果你把 swbuff-status-window-layout設(shè)為 'adjust,則不論什么時(shí)候都會(huì)出現(xiàn)這樣的大窗口,設(shè)為 'default 則只有單窗口時(shí)才出現(xiàn)大窗口。雖然這個(gè)窗口只顯示幾秒鐘,但是 我很討厭一個(gè)那么大的窗口在我面前一閃。現(xiàn)在如果你把它設(shè)為 'scroll,不論什么時(shí)候都只占用一行。這樣buffer太多時(shí),那個(gè)窗口不會(huì)占用太多空間擾亂視線。
原來(lái)的 swbuff 有一個(gè)小小的 bug, 無(wú)論 swbuff-status-window-layout 是什么值,都會(huì)顯示一個(gè)很大的窗口顯示所有的 buffer,這個(gè)文件是我修改過(guò)的版本。
swbuff-clear-delay 可以控制小窗口消失的延遲。
swbuff-window-min-text-height 可以控制小窗口的大小。如果設(shè)為 0, 就不會(huì)打開(kāi)小窗口了。
tabbar.el
(require 'tabbar)
(tabbar-mode)
(global-set-key (kbd "") 'tabbar-backward-group)
(global-set-key (kbd "") 'tabbar-forward-group)
(global-set-key (kbd "") 'tabbar-backward)
(global-set-key (kbd "") 'tabbar-forward)
你曾經(jīng)覺(jué)得 Windows 樣式的編輯器上面的 tab 很好用吧?其實(shí) Emacs 的更好,它不但可以把所有 buffer 列在 tab 上,而且根據(jù) major mode 對(duì) tab 進(jìn)行分組。你可以用 customize-group RET tabbar RET 來(lái)設(shè)置它的選項(xiàng)。
我把Windows鍵盤上的 "Win" 鍵綁定到了這個(gè)功能,因?yàn)?tabbar 很像Windows 的風(fēng)格。按 Win-left 和 Win-right 就會(huì)在同組 tab 之間切換,Win-up 和 Win-down 可以在分組之間切換。
看看下面幾個(gè)圖你就知道它如何好用啦!
顯示 html mode 的分組:
分組列表
在不同的窗口里可以有獨(dú)立的 tab。圖片太大,要看的話點(diǎn)擊這里
tabbar 有一個(gè)小小的 Hack, 可以使你更方便。
speedbar
這個(gè)是 Emacs 自帶的。M-x speedbar 就可以啟動(dòng)它。它可以讓你 方便的瀏覽文件,你還可以顯示文件里的標(biāo)題,函數(shù),變量……
在你編輯不同的文件時(shí),它可以顯示當(dāng)前文件所在目錄里的相關(guān)文 件和它們的信息,比如文件是否需要重新編譯,elisp文件是否已 經(jīng)編譯,…… 等等。
你可以看看我的抓圖。
table.el
(autoload 'table-insert "table" "WYGIWYS table editor")
非常酷的一個(gè)擴(kuò)展。可以“所見(jiàn)即所得”的編輯一個(gè)文本模式的表格。就跟很多字處理程序那樣操作,可以識(shí)別文本文件里本來(lái)就存在的表格,而且可以把表格輸出為 HTML 和 TeX。看看我的抓圖吧。
recentf.el
這個(gè)擴(kuò)展可以幫你保存一個(gè)“最近打開(kāi)的文件”列表。在 .emacs 文件里加入:
(require 'recentf)
(recentf-mode 1)
你可以把不常用的C-x C-r 綁定到這樣一個(gè)函數(shù):
(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 列出最近打開(kāi)文件列表了。
rect-mark.el
你是不是覺(jué)得 Emacs 的“矩形區(qū)域操作”不太直觀?使用這個(gè)包之后矩形 region會(huì)被真正顯示成一個(gè)矩形。[查看圖形]這可以使你的矩形操作大大方便。
如果你已經(jīng)有了一個(gè) region。你可以使用 C-x r C-x 把它顯示為一個(gè)矩形。如果你剛開(kāi)始設(shè)定一個(gè)矩形區(qū)域,你可以使用 C-x r 作為你的 set-mark-command 的前綴,比如 C-x r C-SPC。那么區(qū)域會(huì)被顯示為矩形。
hippie-expand
這個(gè)是 Emacs 自帶的功能,可是知道它的人不多。很多人用的是M-/ (dabbrev-expand) 這樣的東西。 hippie-expand 要強(qiáng)大的多。因?yàn)樗梢允褂脭U(kuò)展函數(shù)任意擴(kuò)充!你可以把你的 M-/ 綁定到 hippie-expand,馬上就可以體會(huì)到它的方便。
(global-set-key [(meta ?/)] 'hippie-expand)
你可以設(shè)置以下 hippie-expand 的補(bǔ)全方式。它是一個(gè)優(yōu)先列表, hippie-expand 會(huì)優(yōu)先使用表最前面的函數(shù)來(lái)補(bǔ)全。通常我的設(shè)置是:
(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))
這是說(shuō),首先使用當(dāng)前的buffer補(bǔ)全,如果找不到,就到別的可見(jiàn)的窗口里尋找,如果還找不到,那么到所有打開(kāi)的buffer去找,如果還……那么到kill-ring里,到文件名,到簡(jiǎn)稱列表里,到list,…… 當(dāng)前使用的匹配方式會(huì)在 echo 區(qū)域顯示。
特別有意思的是 try-expand-line,它可以幫你補(bǔ)全整整一行文字。我很多時(shí)后有兩行文字大致相同,只有幾個(gè)字不一樣,但是我懶得去拷貝粘貼以下。那么我就輸入這行文字的前面幾個(gè)字。然后多按幾下 M-/ 就能得到那一行。
括號(hào)匹配
這是一個(gè)很小的函數(shù)。你是不是覺(jué)得 Emacs 在匹配的括號(hào)之間來(lái)回跳轉(zhuǎn)的時(shí)候按 C-M-f 和 C-M-b 太麻煩了?vi的 % 就很方便,我們可以把 % 設(shè)置為匹配括號(hào)。可是你想輸入 % 怎么辦呢?
一個(gè)很巧妙的解決方案就是,當(dāng) % 在括號(hào)上按下時(shí),那么匹配括號(hào),否則輸入一個(gè) %。你只需要在 .emacs 文件里加入這些東西就可以達(dá)到目的:
(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)))))
臨時(shí)記號(hào)
有時(shí)你需要跳到另一個(gè)文件進(jìn)行一些操作,然后很快的跳回來(lái)。你當(dāng)然可以使用 bookmark 或者寄存器。但是這些實(shí)在是太慢了。你多想擁有vi那樣的 ma, mb, 'a, 'b 的操作。現(xiàn)在你可以用幾行 elisp 達(dá)到類似的目的:
(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

)
(defun ska-jump-to-register()
"Switches between current cursorposition and position
that was stored with ska-point-to-register."
(interactive)
(setq zmacs-region-stays t)
(let ((tmp (point-marker)))
(jump-to-register
(set-register 8 tmp)))
當(dāng)你按 C-. 時(shí)就做了一個(gè)記號(hào)。然后你可以到別處,按 C-, 就可以在這兩點(diǎn)之間來(lái)回跳轉(zhuǎn)了。這雖然沒(méi)有 vi 的 26 個(gè) mark 多,但是你仔細(xì)想想,vi的26個(gè) mark,你通常能用到幾個(gè)?
go-to-char
(defun wy-go-to-char (n char)
"Move forward to Nth occurence of CHAR.
Typing `wy-go-to-char-key' again will move forwad to the next Nth
occurence of CHAR."
(interactive "p\ncGo to char: ")
(search-forward (string char) nil nil n)
(while (char-equal (read-char)
char)
(search-forward (string char) nil nil n))
(setq unread-command-events (list last-input-event)))
(define-key global-map (kbd "C-c a") 'wy-go-to-char)
非常感謝 Oliver Scholz 提供這個(gè)函數(shù)給我。
這個(gè)函數(shù)是一個(gè) vi 的 "f" 命令的替代品。vi的用戶知道,vi有一個(gè)特別好的命令 "f"。當(dāng)你按 "fx", x 是任意一個(gè)字符時(shí),光標(biāo)就會(huì)移動(dòng)到下一個(gè) "x" 處。這之后只要按 ";"(分號(hào)),光標(biāo)就到再下一個(gè) "x"。
舉個(gè)例子說(shuō)明這個(gè)命令的用途。比如我們有這樣一行字,光標(biāo)在行首。
(setq unread-command-events (list last-input-event)))
^^^^^
我們希望迅速的到達(dá)最后那個(gè) event 處,于是我在 vi 里按 "fe"。結(jié)果光標(biāo)到了 "setq" 的那個(gè) e 上面,這時(shí)候我接著按 ";", 不一會(huì)兒就到了我們想要的地方。很方便吧?可能起初不覺(jué)得,后來(lái)你發(fā)現(xiàn)這真的非常好!
我一直覺(jué)得 Emacs 沒(méi)有這樣一個(gè)方便的命令,但是 Oliver 給了我一個(gè)完美的答案:
有了這段代碼之后,當(dāng)你按 C-c a x (x 是任意一個(gè)字符) 時(shí),光標(biāo)就會(huì)到下一個(gè) x 處。再次按 x,光標(biāo)就到下一個(gè) x。比如 C-c a w w w w ..., C-c a b b b b b b ...
我覺(jué)得這個(gè)方式比 vi 的 "f" 要快。
setnu和setnu-plus
這兩個(gè)包可以用來(lái)顯示文件的行號(hào)。并且根據(jù)是否空行和文件行的語(yǔ)法加亮顯示不同的數(shù)字顏色。
看看我的抓圖。
hide-region.el 和 hide-lines.el
這兩個(gè)函數(shù)可以分別把一個(gè)區(qū)域和匹配某個(gè)regexp的行都藏起來(lái),就跟不存在一樣……這樣你就可以對(duì)某些內(nèi)容進(jìn)行任意的操作而不會(huì)影響到其它的部分。
hide-lines 在操作某些行的時(shí)候用起來(lái)特別方便。加一個(gè)前綴參數(shù)可以把不匹配的行都藏起來(lái),只看到匹配的!看看我只顯示這個(gè)文件里含有g(shù)lobal-set-key 的行:
;;hide region
(require 'hide-region)
(global-set-key (kbd "C-c r") 'hide-region-hide)
(global-set-key (kbd "C-c R") 'hide-region-unhide)
;; hide lines
(require 'hide-lines)
(global-set-key (kbd "C-c l") 'hide-lines)
(global-set-key (kbd "C-c L") 'show-all-invisible)
folding.el
我的 folding 配置很長(zhǎng),要看請(qǐng)點(diǎn)擊這里。
我編輯了這么長(zhǎng)一個(gè) HTML 文件,你覺(jué)得一定很費(fèi)力,不容易定位吧?其實(shí)我的屏幕看起來(lái)就是這個(gè)樣子。所有小節(jié)都被我折疊了起來(lái),我很容易就可以調(diào)換小節(jié)的位置。我剛才把folding的大段的配置代碼移動(dòng)到了另一個(gè)文件,就像移動(dòng)了一行。
folding 根據(jù)不同的文檔有不同的標(biāo)記,它都是基于注釋的。本網(wǎng)頁(yè)就是這樣一個(gè)例子。
htmlize.el
把語(yǔ)法加亮的文件輸出成彩色 HTML 文件。看看這個(gè)例子。
dictionary
[本地下載][來(lái)源地]
(autoload 'dictionary-search "dictionary"
"Ask for a word and search it in all dictionaries" t)
(autoload 'dictionary-match-words "dictionary"
"Ask for a word and search all matching words in the dictionaries" t)
(autoload 'dictionary-lookup-definition "dictionary"
"Unconditionally lookup the word at point." t)
(autoload 'dictionary "dictionary"
"Create a new dictionary buffer" t)
(autoload 'dictionary-mouse-popup-matching-words "dictionary"
"Display entries matching the word at the cursor" t)
(autoload 'dictionary-popup-matching-words "dictionary"
"Display entries matching the word at the point" t)
(autoload 'dictionary-tooltip-mode "dictionary"
"Display tooltips for the current word" t)
(autoload 'global-dictionary-tooltip-mode "dictionary"
"Enable/disable dictionary-tooltip-mode for all buffers" t)
(global-set-key [mouse-3] 'dictionary-mouse-popup-matching-words)
(global-set-key [(control c)(d)] 'dictionary-lookup-definition)
(global-set-key [(control c)(s)] 'dictionary-search)
(global-set-key [(control c)(m)] 'dictionary-match-words)
;; choose a dictionary server
(setq dictionary-server "localhost")
;; for dictionary tooltip mode
;; choose the dictionary: "wn" for WordNet
;; "web1913" for Webster's Revised Unabridged Dictionary(1913)
;; so on
(setq dictionary-tooltip-dictionary "wn")
(global-dictionary-tooltip-mode t)
;(dictionary-tooltip-mode t)
連接到 dict 協(xié)議服務(wù)器,并且查詢單詞含義。按 C-c d 查詢道當(dāng) 前單詞,按 C-c m 在字典里查找一個(gè)匹配的單詞,鼠標(biāo)郵件點(diǎn)擊單詞 會(huì)彈出菜單。還有 tooltip 功能!非常好用!你可以看看我的屏幕截圖。
你可以在自己機(jī)器上安裝一個(gè) dictd。這樣就不需要連到很遠(yuǎn)的服 務(wù)器查字典了。
color theme
Emacs 提供給你所有的配色機(jī)制,可是由于你的藝術(shù)細(xì)胞不夠,經(jīng)常為找不到好的配色方案而煩惱。使用這個(gè)包就可以方便的改變你的 Emacs 的配色方案啦!看看我的屏幕抓圖 [1] [2] [3]
它提供了50種以上的配色方案。你只需要把:
(require 'color-theme)
加入到 .emacs 文件。使用 M-x color-theme-select 就會(huì)出現(xiàn)一個(gè)配色方案選擇窗口,在配色方案上按 l 就可以改變當(dāng)前 frame 的配色,按 i 就可以改變所有 frame 的配色。
如果你想選定一個(gè)配色方案后就一直用它,而避免每次都加載大量用不著的 lisp代碼,按 p 就可以把當(dāng)前配色方案的 lisp 打印出來(lái),你可以把它加到你的 .emacs 文件。而不使用 (require 'color-theme) 這樣可以加快啟動(dòng)速度。
thumbs
這個(gè)擴(kuò)展可以把 Emacs 變成一個(gè)圖片瀏覽器。看看抓圖吧。
mmm
(autoload 'mmm-mode "mmm-mode" "Multiple Major Modes" t)
(autoload 'mmm-parse-buffer "mmm-mode" "Automatic MMM-ification" t)
你想過(guò)一個(gè) buffer 里同時(shí)存在很多個(gè) major mode 嗎?現(xiàn)在用 MMM 就可以辦到了。在不同的區(qū)域擁有對(duì)應(yīng)鍵綁定,變量,縮進(jìn) ……
看看我的抓圖,HTML, Emacs Lisp, Perl, C 和 LaTeX 全都都在同一個(gè) buffer 里被正確的語(yǔ)法加亮了!而且TAB在不同的區(qū)域都可以進(jìn)行正確縮進(jìn)。在 LaTeX 的區(qū)域還可以使用 AUC TeX 來(lái)處理某個(gè)部分。
當(dāng)然我現(xiàn)在是在濫用這個(gè)模式。如果你有嵌入 HTML 的 JavaScript 或 CSS2, PL/SQL,……這個(gè)就有用了。
我可以使用這個(gè)擴(kuò)展來(lái)處理 CWEB 程序。最外面的 major mode 用 cweb-mode, 里面的 TeX 和 C 的區(qū)域就使用它們各自的TeX-mode 和 c-mode。看起來(lái)就像這個(gè)樣子 。
AUCTeX
看到這個(gè)名字你還以為是一個(gè) TeX 發(fā)行吧?它不是一個(gè) TeX 發(fā)行,而是一個(gè)專門用來(lái)幫助作者寫 TeX/LaTeX 文檔的工具。它大大加強(qiáng)了 LaTeX 用戶的能力。你寫文檔時(shí)能夠只 TeX 一個(gè)你覺(jué)得需要看到效果的 region 的內(nèi)容,而不必等待漫長(zhǎng)的編譯過(guò)程啦!
preview-latex
可以把 LaTeX 文檔的效果插入到文檔里,形成一個(gè)預(yù)覽,與你的原文件一一對(duì)照。非常方便。你可以看看我的抓圖:
文檔里的公式
文檔里的圖片
注意要用這個(gè)包,你必須安裝 TeX 系統(tǒng)和 AUCTeX.
ctypes.el
(require 'ctypes)
(ctypes-auto-parse-mode 1)
ctypes 可以識(shí)別你的 C 文件里的類型定義 (typedef)。自動(dòng)對(duì)它們進(jìn)行語(yǔ)法加亮。
ECB
ECB(Emacs Code Browser) 是一個(gè)代碼瀏覽器,它依賴于Semantic 和Eieio。
它們組合可以實(shí)現(xiàn)很好的文法分析的代碼瀏覽。ECB 在 Semantic 和 Eieio 的支持下,可以識(shí)別許許多多種計(jì)算機(jī)語(yǔ)言,C, C++, Java, Elisp, ...
看看這個(gè)抓圖。
Emacs Wiki
(require 'emacs-wiki)
(add-hook 'emacs-wiki-mode-hook
(lambda ()
(define-key emacs-wiki-mode-map (kbd "C-c C-h") 'emacs-wiki-preview-html)
(define-key emacs-wiki-mode-map (kbd "C-c C-c") 'emacs-wiki-preview-source)
(define-key emacs-wiki-mode-map (kbd "C-c C-v") 'emacs-wiki-change-project)
))
;; (setq emacs-wiki-grep-command "glimpse -nyi \"%W\"")
(setq emacs-wiki-publishing-directory "publish")
(setq emacs-wiki-directories '("~/WiKi"))
(setq emacs-wiki-meta-charset "gb2312")
(setq emacs-wiki-style-sheet
"")
(setq emacs-wiki-inline-relative-to 'emacs-wiki-publishing-directory)
(defun emacs-wiki-preview-source ()
(interactive)
(emacs-wiki-publish-this-page)
(find-file (emacs-wiki-published-file)))
(defun emacs-wiki-preview-html ()
(interactive)
(emacs-wiki-publish-this-page)
(browse-url (emacs-wiki-published-file)))
(setq emacs-wiki-projects
`(("default" . ((emacs-wiki-directories . ("~/WiKi"))))
("work" . ((fill-column . 65)
(emacs-wiki-directories . ("~/workwiki/"))))))
用來(lái)制作 WiKi 的包。非常方便。看看我的抓圖。
這上面的只是我自己的設(shè)定,你要根據(jù)自己的情況修改。
我寫了一個(gè)簡(jiǎn)要的 WiKi 說(shuō)明在 這里。
更多的信息請(qǐng)參考
http://repose.cx/emacs/wiki/。