• Emacs Lisp 功能扩展集锦


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

  • 相关阅读:
    当修改表单时,表格的记录被同步修改了
    Element给树形控件添加图标
    BIO、NIO、AIO的区别
    JVM的垃圾回收机制 总结(垃圾收集、回收算法、垃圾回收器)
    spring 事务传播行为之嵌套事务NESTED细节
    ThreadLocal可能引起的内存泄露
    explain执行计划包含的信息
    二叉树、B树、B+树、红黑树 的 本质区别以及各个应用场景
    Redis中的IO多路复⽤机制
    自旋锁、阻塞锁、可重入锁使用解析
  • 原文地址:https://www.cnblogs.com/welhzh/p/3783721.html
Copyright © 2020-2023  润新知