Emacs Lisp 功能擴展集錦
Emacs 具有超強的擴展性。這是當今沒有任何其它編輯器可以比擬的強大特點。這里介紹一些很方便的 Emacs Lisp 擴展。
有鏈接的文件可能不是 Emacs 自帶的,你需要下載el文件到你的 load-path 中的一個目錄里。
所有文件可以點擊鏈接下載,你也可以點擊這里一次性下載所有 el 文件,但是不包括大型的 elisp 包,比如 dictionary. [下載]。
這里提供的下載是我正在用的版本。我沒有列出我找到它們的地址, 因為我記不住那么多。如果你需要最新的版本,請查看文件里的網址 到作者的主頁。
每個標題后面的lisp代碼是需要寫到配置文件里的東西。
session.el
(require 'session)
(add-hook 'after-init-hook 'session-initialize)
使用了這個擴展之后,你上次離開 Emacs 時的全局變量 (kill-ring,命令記錄……),局部變量,寄存器,打開的文件,修改過的文件和最后修改的位置,…… 全部都會被記錄下來。
加載了 session 之后菜單上會多兩項:最近訪問過的文件和最近修改過的文件。看這個圖 。
desktop.el
(load "desktop")
(desktop-load-default)
(desktop-read)
如果你想保存上次打開的文件記錄,那么可以使用 desktop。這是 Emacs 自帶的。你只需要加入以上設置,然后 M-x desktop-save。以后 Emacs 啟動時就會打開你上次離開時的所有 buffer.
M-x desktop-clear 可以刪除記住的內容,你閑現在記住的 buffer 太多就可以采用這個辦法。不過我還是建議用 ibuffer(見下) 來管理這些buffer,因為有時你會發現,如果刪掉全部記住的buffer,以后你需要一定的時間來打開你經常編輯的文件!
如果session跟desktop配合,下次啟動Emacs 的時候,就像根本沒有關閉 Emacs 一樣!多爽!
ibuffer.el
把這幾行加入 .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" 字樣,得到如下結果。
browse-kill-ring.el
(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 或者 ?.
ido.el
你可能用過 iswitchb。但是當有很多buffer時,iswitchb 還是很慢。你可以使用ido。這是我見過的最方便的切換buffer,尋找文件的擴展了。在你的 .emacs 文件里加入:
(require 'ido)
(ido-mode t)
ido 主要有兩個界面:打開文件和切換buffer,它們之間可以隨便切換。它的原始的鍵設定不是很方便直觀,所以我把它另外設置了一下。看這個列表。其實你從這個列表就可以看出 ido 的功能。我這里只敘述一下基本的操作。
1. 打開文件 (C-x C-f)
啟動 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 進入編輯模式。
2. 尋找文件
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 就會把所路徑合并,找到匹配文件,然后給出一個列表:
3. 切換buffer(C-x b)
切換 buffer 的界面也跟打開文件功能類似。不過少了一些文件特有的功能,多了一些buffer特有的的功能。
打開文件時 C-k 是刪除文件,現在 C-k 變成了關閉 buffer。如果你按 C-a 就會顯示通常被忽略的 buffer。
如果不存在這樣的的buffer,你可以直接回車新建一個buffer,也可以使用 C-f 切換到打開文件界面。
這個擴展功能實在太多,你看了我的敘述能夠體會到它的方便了吧。但是實際使用時,你很少能記住所有這些功能。最好是自己綁定鍵。在需要的時候可以查詢這個鍵綁定。就像我的這個鍵綁定。
最新的 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)
使用這個,你就可以方便的在最近編輯的 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, 就不會打開小窗口了。
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)
你曾經覺得 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, 可以使你更方便。
speedbar
這個是 Emacs 自帶的。M-x speedbar 就可以啟動它。它可以讓你 方便的瀏覽文件,你還可以顯示文件里的標題,函數,變量……
在你編輯不同的文件時,它可以顯示當前文件所在目錄里的相關文 件和它們的信息,比如文件是否需要重新編譯,elisp文件是否已 經編譯,…… 等等。
你可以看看我的抓圖。
table.el
(autoload 'table-insert "table" "WYGIWYS table editor")
非常酷的一個擴展。可以“所見即所得”的編輯一個文本模式的表格。就跟很多字處理程序那樣操作,可以識別文本文件里本來就存在的表格,而且可以把表格輸出為 HTML 和 TeX。看看我的抓圖吧。
recentf.el
這個擴展可以幫你保存一個“最近打開的文件”列表。在 .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 列出最近打開文件列表了。
rect-mark.el
你是不是覺得 Emacs 的“矩形區域操作”不太直觀?使用這個包之后矩形 region會被真正顯示成一個矩形。[查看圖形]這可以使你的矩形操作大大方便。
如果你已經有了一個 region。你可以使用 C-x r C-x 把它顯示為一個矩形。如果你剛開始設定一個矩形區域,你可以使用 C-x r 作為你的 set-mark-command 的前綴,比如 C-x r C-SPC。那么區域會被顯示為矩形。
hippie-expand
這個是 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

)
(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)))
當你按 C-. 時就做了一個記號。然后你可以到別處,按 C-, 就可以在這兩點之間來回跳轉了。這雖然沒有 vi 的 26 個 mark 多,但是你仔細想想,vi的26個 mark,你通常能用到幾個?
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 提供這個函數給我。
這個函數是一個 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" 要快。
setnu和setnu-plus
這兩個包可以用來顯示文件的行號。并且根據是否空行和文件行的語法加亮顯示不同的數字顏色。
看看我的抓圖。
hide-region.el 和 hide-lines.el
這兩個函數可以分別把一個區域和匹配某個regexp的行都藏起來,就跟不存在一樣……這樣你就可以對某些內容進行任意的操作而不會影響到其它的部分。
hide-lines 在操作某些行的時候用起來特別方便。加一個前綴參數可以把不匹配的行都藏起來,只看到匹配的!看看我只顯示這個文件里含有global-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 配置很長,要看請點擊這里。
我編輯了這么長一個 HTML 文件,你覺得一定很費力,不容易定位吧?其實我的屏幕看起來就是這個樣子。所有小節都被我折疊了起來,我很容易就可以調換小節的位置。我剛才把folding的大段的配置代碼移動到了另一個文件,就像移動了一行。
folding 根據不同的文檔有不同的標記,它都是基于注釋的。本網頁就是這樣一個例子。
htmlize.el
把語法加亮的文件輸出成彩色 HTML 文件。看看這個例子。
dictionary
[本地下載][來源地]
(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 協議服務器,并且查詢單詞含義。按 C-c d 查詢道當 前單詞,按 C-c m 在字典里查找一個匹配的單詞,鼠標郵件點擊單詞 會彈出菜單。還有 tooltip 功能!非常好用!你可以看看我的屏幕截圖。
你可以在自己機器上安裝一個 dictd。這樣就不需要連到很遠的服 務器查字典了。
color theme
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) 這樣可以加快啟動速度。
thumbs
這個擴展可以把 Emacs 變成一個圖片瀏覽器。看看抓圖吧。
mmm
(autoload 'mmm-mode "mmm-mode" "Multiple Major Modes" t)
(autoload 'mmm-parse-buffer "mmm-mode" "Automatic MMM-ification" t)
你想過一個 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。看起來就像這個樣子 。
AUCTeX
看到這個名字你還以為是一個 TeX 發行吧?它不是一個 TeX 發行,而是一個專門用來幫助作者寫 TeX/LaTeX 文檔的工具。它大大加強了 LaTeX 用戶的能力。你寫文檔時能夠只 TeX 一個你覺得需要看到效果的 region 的內容,而不必等待漫長的編譯過程啦!
preview-latex
可以把 LaTeX 文檔的效果插入到文檔里,形成一個預覽,與你的原文件一一對照。非常方便。你可以看看我的抓圖:
文檔里的公式
文檔里的圖片
注意要用這個包,你必須安裝 TeX 系統和 AUCTeX.
ctypes.el
(require 'ctypes)
(ctypes-auto-parse-mode 1)
ctypes 可以識別你的 C 文件里的類型定義 (typedef)。自動對它們進行語法加亮。
ECB
ECB(Emacs Code Browser) 是一個代碼瀏覽器,它依賴于Semantic 和Eieio。
它們組合可以實現很好的文法分析的代碼瀏覽。ECB 在 Semantic 和 Eieio 的支持下,可以識別許許多多種計算機語言,C, C++, Java, Elisp, ...
看看這個抓圖。
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/"))))))
用來制作 WiKi 的包。非常方便。看看我的抓圖。
這上面的只是我自己的設定,你要根據自己的情況修改。
我寫了一個簡要的 WiKi 說明在 這里。
更多的信息請參考
http://repose.cx/emacs/wiki/。