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 的功能。 我这里只叙述一下基本的操作。
- 打开文件 (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 进入编辑模式。
- 寻找文件
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 ....
目录下的 .cap 文件。我就在 C-x C-f 的界面按输入 "cap$",然后打开正则匹配 和部分匹配,出现以下界面:/usr/local/texlive/texmf-local/tex/latex/CJK/GB/
因为当前目录(PWD)下没有后缀是 fd 的文件,所以我按了一下 M-up,这下 成了这个样子:
显然它找到一个结尾是 "cap" 的文件,但是这不是我想要的,于是我继续按 一下 M-up 到再上面一个目录里去找。就成了这样:
这就是我需要的文件!想一想,你的当前目录不在那个地方,用别的办法打 开如此深一个目录里的文件需要花多少时间?
其实我们还有一个窍门,刚才如果在不能匹配的时候按 M-s,ido 就会把所 路径合并,找到匹配文件,然后给出一个列表:
- 切换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 position
that 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 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/。
——————————————————————————————————————
在windows环境下使用emacs + cscope + ecb替代source insight
source insight是windows环境下用于代码开发和阅读的利器,功能强大,对于大规模代码的维护和开发几乎不可或缺(这里
指它提供的功能,类似的商业工具还有很多)。使用emacs替代source insight原因有:a,si是商业软件,使用需要付费,虽然可以从网上
找到破解版本;b,对于unix/linux爱好者或者需要同时工作于unix和windows环境下的开发人员,emacs是通用工具;emacs其它的强大
功能暂且不表。
下面是基于windows xp平台的安装方法,其中大部分步骤和unix环境下的一样,只有cscope的有所不同。
1)准备工作
首先,你得下载一下一些工具(扩展),emacs,cscope,ecb,cedet是必须的,session,doxymacs不是必要的,但是装上会
更方便。下载这些东西的网址链接如下:(当然,下面这些东西都可以从google找到下载链接,下面提供的网址都是google出来的,如果
下面提供的链接不可用了,大家可以自己google一把)
i)emacs: http://www.gnu.org/software/emacs/
从gnu的ftp网站上下载windows版本,最新的版本是emacs-22.1。下面的设置都是在这个版本上进行的。
ii)cscope:cscope的主页 http://cscope.sourceforge.net/,其中有一个download的链接,从那里可以下载到编译好的压缩包。
win32版本的下载地址: http://iamphet.nm.ru/cscope/index.html,压缩包中有两个编译好的exe文件:cscope.exe, sort.exe
iii)ecb:主页地址 http://ecb.sourceforge.net/,download页面中还有一个Xemcas的安装程序setup.exe,可以试试,我没有使用这个。
sourceforg下载地址 http://sourceforge.net/project/showfiles.php?group_id=17484
iv)cedet:主页 http://cedet.sourceforge.net/,下载release压缩包1.0pre4.tar.gz,这个包中已经包含了semantic,ede,eieio,
speedbar,因此下载了这个大包后不用分别下载这些扩展插件。
v)session:sf下载地址 http://sourceforge.net/project/showfiles.php?group_id=46019
vi)doxymacs:地址 http://doxymacs.sourceforge.net/,
下载 http://sourceforge.net/project/s ... p;release_id=514962
vii)下载windows下的bash工具,主要是用到其中的find工具,用来手工生成cscope.files。如果安装了cygwin则不用安装这个了。
地址: http://folk.uio.no/andreass/unix_tools.html
2)安装
安装emacs:这个很简单,只要将压缩包解开,放到你想放的位置就可以用了,如果要在windows的开始菜单中添加菜单项,点击bin目录下
的addpm运行,就会在菜单中加入gnu菜单项。
安装cscope:a,解压平台不相关的那个tar.gz包,将/contrib/xscope/xscope.el拷贝到emacs-22.1/site-lisp目录下(emacs-22.1是
你安装emacs的目录);b,解压win32版本的cscope,将cscope.ext sort.exe拷贝到emacs-22.1/bin目录下(这个路径不是必要的,因为
cscope在windows下要用起来还得费点劲,4)点会讲到)
【site-lisp目录下插件安装】
安装ecb:解压,将解压后的ecb目录拷贝到site-lisp目录下。
安装cedet:解压,将解压后的cedet目录拷贝到site-lisp目录下。
安装session:解压,将解压后的session目录拷贝到site-lisp目录下。
安装doxymacs:解压,将解压后的doxymacs目录拷贝到site-lisp目录下。
安装win32bash:点击user.exe安装文件一步步点到最后就行了。
到此安装工作完成。
3)配置.emacs启动文件
显示指定扩展插件的加载地址(这一步好像不是必要的,只列出一个地址,其它类似)
(add-to-list 'load-path "e:/emacs/site-lisp/ecb-2.31"
加载相应插件:
(require 'xcscope) ;;加载xcscope
(require 'cedet) ;;加载cedet
(require 'ecb) ;;加载ecb
(require 'session) ;;加载session
(add-hook 'after-init-hook 'session-initialize) ;; 启动时初始化session
(require 'doxymacs) ;; 启动doxymacs
在配置文件中加入这些语句后,保存重启emacs,重启后查看一下Message窗口中的加载信息,可以看到各个插件加载成功。
在.emacs中加入一些方便的设置就可以使用了,完整的配置文件附在后面。(这些配置都是从google上到处搜刮来的,其中王垠博士的
网页上有很多emacs设置的好东西可以参考,还有一些英文网站上贴出的配置文件中也有很多好东西,大家可以根据自己的习惯写自己的
配置)
4)问题及解决
安装进行到这里,大部分功能都没有问题了,存在的问题有:
i)cscope的创建文件列表和创建代码符号索引两个命令不可用,按下C-c s L和C-c s I后minibuffer中显示cscope-indexer找不到。 在 cscope的安装包中确实有一个cscope-indexer的文件,我们安装时没有将它拷贝到emacs的安装路径中去,但是即使将它拷贝到bin目录下也还是不能工作,用文本编辑器打开cscope-indexer会发现它其实是个shell脚本文件,从脚本中可以看到,它首先通过find,grep等工具生成一个cscope.files的文件,然后调用cscope使用cscope.files作为输入生成cscope.out的索引文件。
因此,只要能生成一个文件列表的文件就可以使用win32版本的cscope.exe来生成cscope.out文件。到此,我们可以使用win32bash中的f ind 工具生成一个源代码文件列表了 (与unix下一样:find /my-project-source -name "*.[chs]" -print > cscope.files,不知windows下是否有类似find这样功能的命令,xp下的find好像不能用通配符,如果有这样的东西就可以不安装 win32bash)。
生成了cscope.files源码文件列表后就可以使用它像si一样在代码间穿梭了:
C-c s a设定代码根目录,cscope.files必须放在这个设定目录下,否则cscope找不到;在第一次使用如下几条命令时cscope会自动生成
cscope.out,也可以在windows的cmd中调用cscope.exe -b -i cscope.files -f cscope.out生成cscope.out。
C-c s g查找函数(或变量)定义;
C-c s c查看调用者;
C-c s C查看函数中调用的子函数;
ii)semantic中设置的项目根目录好像不起作用,在进行tag查找时semantic只查了当前目录中的代码文件, 如果引用的是其它目录中的函数或变量,查找相应定义时就找不到。这个问题还不知道原因,可能是设置的问题,semantic的设置项太多了。遇到相同问题的朋友请解答一下。
到此,si中常用的几个动作实现了。
还有个si中类似功能的实现:跳到函数定义后如何在跳回刚才的调用函数的地方。
在王垠的网页中找到了一个实现
;;;临时记号
(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)))
这样就可以在函数间跳来跳去,
结合cscope的pop-mark,就可以跳来跳去了,这样基本可以满足大多数情况下的使用。
ecb,cedet(semantic)提供了很多功能,不过由于太多了,需要慢慢摸索,目前使用cscope已经基本上实现了si上的几个常用功能,ecb + semantic可以实现像si中的函数/变量上下文显示功能,
但是由于4)ii)中提到的问题,这个显示上下文功能有时候不起作用。
还有一些有用扩展:http://docs.huihoo.com/homepage/shredderyin/emacs_elisp.html
——————————————————————————————————————
让Emacs功能强于Source Insight(Linux平台)
单独的Emacs软件的话,虽然也有着除了编辑以外的各种各样的功能,例如Mail,网页浏览等等,但是,仅对于我个人我还是觉得他就是个文本编辑器,因为别的功能我不用,也用不上。而且这个编辑器使用时还非常的费劲,觉不出他比微软的记事本强在哪里。
但是,Emacs支持配置其工作环境,当结合了一些插件后,他就发挥出强大的功能了。
这个强大的功能 = SourceInsight+专用仿真Debug软件之和。
还有就是,他是免费的,FreeDownload的,可自定义的。
微软在努力让我们告别键盘,Linux则建议大家没事别老碰鼠标。
Emacs + gtags + cedet + ecb + doxymas + session + GDB
Emacs: GNU Emacs
gtags: GNU GLOBAL source code tag system
cedet: Collection of Emacs Development Environment Tools
ecb: Emacs Code Browser
doxymacs: Doxygen + Emacs
Doxygen: Source code documentation generator tool
session: Session Management for Emacs
GDB: GNU Project debugger
个人环境:Ubuntu 10.04
目标源代码:C语言
建议写个hello来试运行,gtags建立tags或htags创建HTML模式源代码和doxygen生成文档等的时候,花费时间极长。同时也写好hello的configure.ac和Makefile.am吧,能够编译后执行,以便体验功能。
Emacs:GNU Emacs (Ver:23.1)
Emacs:Editor MACroS(宏编辑器)
HomePage:http://www.gnu.org/software/emacs/
功能和热键的学习:
- http://man.ddvip.com/soft/emacsuserguide/index.html
- http://www.gnu.org/software/chinese/manual/TUTORIAL.cn
- 《学习GNU Emacs》(68元)/《GNU Emacs Lisp 编程入门》(38元)
网上有中文扫描版和英文版的下载,忘了在哪里下的了,搜搜吧。
扫描版不清晰,例代码根本看不清,建议购入原书。 - http://man.chinaunix.net/newsoft/Emac/book.html
http://ftp.gnu.org/gnu/emacs/
重点:
记住个别编辑工作中常用Hotkey。
知道.emacs文件和
知道LISP语言。(但是不一定要掌握这种语言,抄抄网络上大侠的就行,同时也希望更多的人加入到Lisp行列中)。
简单说明:
- .emacs文件:是Emacs启动时,自动读取用户自定义配置的默认的配置文件
(手动创建该文件,自定义配置都写在该文件中,LISP语言,"~"路径下) - shell命令启动Emacs时,如果用'emacs -q'命令,则不加载任何额外的自定义设置启动Emacs.
-
:由'.emacs'文件中编写的相应的自定义配置,调用的关联**.el文件的存放路径。
(在.emacs中记入该路径时,建议使用绝对路径.这样通过shell命令无论用哪个帐户的ENV启动Emacs时,都能正确读取对应的**.el文件。也就是无视'~'所代替的ENV中的$HOME的值是什么,LISP语言)
这个的文件夹,可以手动创建(推荐),也可以用Emacs软件的默认路径(/usr/local/share/emacs/site-lisp/)。 - 下记的.emacsLoadpath 就是手动创建的一个文件夹,其中放置一些,准备使用的el文件啦,cedet啦,ecb啦,gtags.el啦等等。
例: ;load-path (add-to-list 'load-path "/home/yourname/.emacsLoadpath")
个人.emacs文件中的内容:
(仅安装emacs软件后,即可完成的动作,无需安装其他的组件,但需要个别插件,都是参考其他大侠的)
;; Author: Mark Chen ;; 2012.2.24 (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(current-language-environment "Chinese-GB") '(default-input-method "chinese-py") '(display-time-mode t) '(column-number-mode t) '(show-paren-mode t);显示与当前光标所在位置的括号匹配的另一个括号 '(inhibit-startup-screen t)) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. ) ;; 输入法设置为IBus ;; set ibus-el (add-to-list 'load-path "~/.emacs.d/ibus-el-0.3.1") (require 'ibus) (add-hook 'after-init-hook 'ibus-mode-on) ;; 当光标接近时,自动移开光标 (mouse-avoidance-mode 'animate) (setq-default cursor-type 'bar);光标显示为一竖线 (tool-bar-mode -1);不显示工具栏 (menu-bar-mode -1);不显示菜单栏 (setq x-select-enable-clipboard t);;支持emacs和外部程序之间进行粘帖 (fset 'yes-or-no-p 'y-or-n-p);以‘y/n‘字样替换原默认的‘yes/no‘字样 (setq frame-title-format "%d@emacs");;标题栏显示buffer名字 (setq make-backup-files nil) ;关闭自动备份功能 (setq auto-save-mode nil) (setq auto-save-default nil);不生成#filename#临时文件 (setq require-final-newline t);;自动在当前的buffer文件的最后加一个空行 (global-set-key "\r" 'align-newline-and-indent);;自动缩进
-------------------------
http://www.sourceinsight.com/
source insight serial number for all versions:
SI3US-719473-71478
Source Insight is a revolutionary project oriented program code editor and code browser, with built-in analysis for C/C++, C#, and Java programs, as well as other languages. Source Insight parses your source code and maintains its own database of symbolic information dynamically while you work, and presents useful contextual information to you automatically. Not only is Source Insight a great program editor, but it also can display reference trees, class inheritance diagrams, and call trees. Source Insight features the quickest navigation of source code and source information of any programming editor. Let Source Insight loose on your project and see what a difference it makes in your productivity.
sourcenav
http://sourcenav.sourceforge.net/index.html
What is Source-Navigator? |
---|
Source-Navigator works with the Insight GUI interface for GDB.
Source-Navigator supports C, C++, Java, Tcl, [incr Tcl], FORTRAN and COBOL, and provides and SDK so that you can write your own parsers.
Use Source-Navigator to:
- Analyze how a change will effect external source modules.
- Find every place in your code where a given function is called.
- Find each file that includes a given header file.
- Use the grep tool to search for a given string in all your source files.
Emacs Code Browser
http://ecb.sourceforge.net/
ECB stands for "Emacs Code Browser". While Emacs already has good editing support for many modes, its browsing support is somewhat lacking. That's where ECB comes in: it displays a number of informational windows that allow for easy source code navigation and overview.
————————————————————————————————
网友摘录:
”
1.Color Theme,在~/.emacs里添加如下行
;;COLOR_THEME
;;加载 Color Theme
(require 'color-theme)
;;Color Theme应用的主题
(color-theme-classic)
这个还行,勉强可以接受,就是为Emacs换个主题
2.显示行号,我下了半天没下载下来,不过我觉得这个应该挺好,比Emacs只在下边显光标行好多了
3.session,
4.cscope,
5.ECB,
6.CEDET,
7.Xrefactory,也许是因为商业软件的原因,感觉这个最猛,可是在网上找不到License string
免免强强就收获了这点,真是可怜啊,有个我最想要的像Viual Assists X一样把变量高亮显示了一直找不到,不知道Xrefactory有没有,还有就是可以在函数的定义和实现之间跳转,、
“
http://www.xref.sk/xrefactory/download.html
Xrefactory - Refactoring C and C++ programs under Emacs/XEmacs
Xrefactory C/C++
1. PrerequisitesYou need Emacs or XEmacs installed on your computer. They are free software.Emacs for Unix/Linux systems can be found at http://www.gnu.org/software/emacs GNU site. Most Linux distributions, and many other Unix systems come with Emacs pre-installed or pre-packaged for installation. Emacs for MS-Windows can be found on http://www.gnu.org/software/emacs/windows/ntemacs.html . All Emacs packages required by Xrefactory are included in the standard Emacs distribution. XEmacs for nearly all platforms can be downloaded from http://www.xemacs.org pages. Most Xrefactory functions will work with the default XEmacs installation. Installation of the 'mail-lib' package is required for JavaDoc browsing and the 'xemacs-base' package is required for XEmacs IDE functions (compile, run, etc.). |
2. Installation
3. Training ExamplesIt is highly recommended that you work through the tutorials after the installation. The C and C++ tutorials are stored in the cexercise and cppexercise directories of each distribution package. Tutorials will guide you through the typical usage of Xrefactory. To start the tutorial just open one of files cexercise/index.c or cppexercise/index.cpp and follow the instructions written there.
4. LicenseYou are supposed to purchase a license when using Xrefactory beyond the 8 days evaluation period! By downloading Xrefactory you agree with terms of our license agreement conditions. |