http://docs.huihoo.com/homepage/shredderyin/emacs_elisp.html

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 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,你通常能用到几个?

      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 Nthoccurence 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" 要快。

      setnusetnu-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/

Emacs Lisp 功能扩展集锦的更多相关文章

  1. emacs speedbar功能介绍

    emacs speedbar功能介绍 speedbar启动命令M-x speedbar,效果如下: speedbar是一个frame,它会遮挡你工作中的buffer.鼠标左键点击,或者敲回车,都会自动 ...

  2. WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展

    一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要是对文本 ...

  3. C++类功能扩展预留五招

    第一招虚函数 通过派生类来进行功能扩展是基本的面向对象的方式,这种方式大如下: class base { public: virtual ~base(){} virtual void fun() { ...

  4. spring源码深度解析-2功能扩展

    容器功能的扩展ApplicationContext用于扩展BeanFactory中现有的功能.究竟多出了哪些功能,进一步探索.写法上:BeanFactory bf = new XmlBeanFacto ...

  5. Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot

    Lisp: Common Lisp, Racket, Clojure, Emacs Lisp - Hyperpolyglot Lisp: Common Lisp, Racket, Clojure, E ...

  6. vs.net 2013 Saffolding功能扩展

    vs.net 2013 Saffolding功能扩展 Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个&l ...

  7. Asp.net mvc 5 CRUD代码自动生成工具- vs.net 2013 Saffolding功能扩展

    Asp.net mvc 5 CRUD代码自动生成工具 -Visual Studio.net2013 Saffolding功能扩展 上次做过一个<Asp.net webform scaffoldi ...

  8. 【转】WPF自定义控件与样式(3)-TextBox & RichTextBox & PasswordBox样式、水印、Label标签、功能扩展

    一.前言.预览 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等. 本文主要是对文本输入控件进行样式开发,及相关扩展功能开发,主要内容包括: 基本文 ...

  9. ApplicationContext(四)BeanFactory 功能扩展

    ApplicationContext(四)BeanFactory 功能扩展 上节我们提到容器刷新的第二步初始化 BeanFactory 工厂并解析配制文件,但此时 BeanFactory 的功能还很简 ...

随机推荐

  1. EJB--事务管理 .

    在我们对事务的基本概念以及出现的问题和隔离级别有进一步的了解之后,接下来看看EJB是如何进行事务管理. 在EJB中有两种使用事务的方式.第一种方式通过容器管理的事务,叫CMT(Container-Ma ...

  2. Nginx+Tomcat+Memcached负载均衡集群服务搭建

    操作系统:CentOS6.5  本文档主要讲解,如何在CentOS6.5下搭建Nginx+Tomcat+Memcached负载均衡集群服务器,Nginx负责负载均衡,Tomcat负责实际服务,Memc ...

  3. android sqlite支持的数据类型

    Sqlite3支持的数据类型 :NULL.INTEGER.REAL.TEXT.BLOB 但实际上,sqlite3也接受如下的数据类型:    smallint 16 位元的整数.    interge ...

  4. NDK(13)JNIEnv和JavaVM

    转自:  http://www.cnblogs.com/canphp/archive/2012/11/13/2768937.html JNIEnv是一个与线程相关的变量,不同线程的JNIEnv彼此独立 ...

  5. POJ 1808 Quadratic Residues(平方剩余相关)

    题目链接:http://poj.org/problem?id=1808 题意:如下.对于素数p,若存在x使得x^2%p=a,则其值为1.否则为-1.现在给出a.p,计算其值. 思路: 若a为正数则利用 ...

  6. Redis cluster学习 & Redis常识 & sort操作

    Redis中的5种数据类型String.Hash.List.Set.Sorted Set. Redis源码总代码一万多行. 这篇文章有一些Redis "常识" http://www ...

  7. 最大流 Dinic + Sap 模板

    不说别的,直接上模板. Dinic+当前弧优化: struct Edge{ int x,y,c,ne; }e[M*]; int be[N],all; int d[N],q[N]; int stack[ ...

  8. HNOI2002营业额统计(平衡树)

    标准的平衡树. 贴个splay吧 var v,l,r,fa:..] of longint; root,x,i,n,ans:longint; procedure zig(x:longint); var ...

  9. 如何解决:新建Android程序的时候发生了找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 的错误

    问题概述: 在新建Android程序的时候出现以下错误: 找不到 \android-sdk-windows\tools\lib\proguard.cfg文件 原因: SDK不完整. 解决方法: 方法一 ...

  10. vssettings 的备份和导入

    vssettings 的作用:   vssettings的导出(也就是相当于是保存):   现在我们试试导入:找一个别人导出的包,我们导入试试.