使用emacs + cscope + ecb替代source insight


Emacs Lisp 功能扩展集锦

Emacs 具备超强的扩展性。这是当今没有任何其它编辑器能够比拟 的强大特色。这里介绍一些很方便的 Emacs Lisp 扩展。 php

有连接的文件可能不是 Emacs 自带的,你须要下载el文件到你的 load-path 中的一个目录里。 html

全部文件能够点击连接下载,你也能够点击这里一次性下载全部 el 文件,可是不包括大型的 elisp 包,好比 dictionary. [下载]。 java

这里提供的下载是我正在用的版本。我没有列出我找到它们的地址, 由于我记不住那么多。若是你须要最新的版本,请查看文件里的网址 到做者的主页。 linux

每一个标题后面的lisp代码是须要写到配置文件里的东西。 web

session.el

(require 'session)
  (add-hook 'after-init-hook 'session-initialize)

使用了这个扩展以后,你上次离开 Emacs 时的全局变量 (kill-ring,命令记录……),局部变量,寄存器,打开的文件,修 改过的文件和最后修改的位置,…… 所有都会被记录下来。 正则表达式

加载了 session 以后菜单上会多两项:最近访问过的文件和最近 修改过的文件。看这个shell

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, 之后你须要必定的时间来打开你常常编辑的文件! windows

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

setnusetnu-plus

这两个包能够用来显示文件的行号。而且根据是否空行和文件行 的语法加亮显示不一样的数字颜色。

看看个人抓图

hide-region.elhide-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) 是一个代码浏览器,它依赖于SemanticEieio

它们组合能够实现很好的文法分析的代码浏览。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/
功能和热键的学习:

下载安装:参考上记Homepage。
http://ftp.gnu.org/gnu/emacs/

重点:
 记住个别编辑工做中经常使用Hotkey。
 知道.emacs文件和<load-path>设置的做用和用法。
 知道LISP语言。(可是不必定要掌握这种语言,抄抄网络上大侠的就行,同时也但愿更多的人加入到Lisp行列中)。

简单说明:
  • .emacs文件:是Emacs启动时,自动读取用户自定义配置的默认的配置文件
    (手动建立该文件,自定义配置都写在该文件中,LISP语言,"~"路径下)
  • shell命令启动Emacs时,若是用'emacs -q'命令,则不加载任何额外的自定义设置启动Emacs.
  • <load-path>:由'.emacs'文件中编写的相应的自定义配置,调用的关联**.el文件的存放路径。
    (在.emacs中记入该路径时,建议使用绝对路径.这样经过shell命令不管用哪一个账户的ENV启动Emacs时,都能正确读取对应的**.el文件。也就是无视'~'所代替的ENV中的$HOME的值是什么,LISP语言)
    这个<load-path>的文件夹,能够手动建立(推荐),也能够用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);;自动缩进<C-j>变为<Enter> (setq echo-keystrokes 0.1) ;;尽快显示按键序列提示 ;; 设置指针颜色白色 (set-cursor-color "white") ;; 鼠标颜色设置为白色 (set-mouse-color "white") ;; (global-font-lock-mode t) ;;hightlight grammer语法高亮 (global-hl-line-mode 1);高亮当前行 ;;;;;;;;;;;;;;; 启动最大化 ;;;;;;;;;;;;;;;;;; ;(require 'maxframe) ;(add-hook 'window-setup-hook 'maximize-frame t) ;下载maxframe.el并放置在<load-path>中 ;http://emacsblog.org/2007/02/22/maximize-on-startup-part-2/ ;;;;;;;; ;;;;;;;;;;; Web 方式显示行号 ;(set-scroll-bar-mode 'right')滚动条显示在右侧 (set-scroll-bar-mode nil) ;不显示滚动条 (add-to-list 'load-path "~/.emacs.d/") (require 'wb-line-number) (wb-line-number-toggle) ; 下载wb-line-number . el ; http://homepage1 . nifty.com/blankspace/emacs/elisp.html ;;;;;;;;;;;;;;;;;;;;; ;;;;; cc-mode ;;;;;;;; (add-to-list 'load-path "~/.emacs.d/cc-mode-5.32.2") (require 'cc-mode) (c-set-offset 'inline-open 0) (c-set-offset 'friend '-) (c-set-offset '



-------------------------

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 is a source code analysis tool. With it, you can edit your source code, display relationships between classes and functions and members, and display call trees. You can also build your projects, either with your own makefile, or by using Source-Navigator's build system to automatically generate a makefile.

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++


  • Xrefactory C/Java (free)

  • 1. Prerequisites

    You 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

    • Download Xrefactory distribution corresponding to your platform by clicking on the appropriate link from the table above.
    • Unpack the downloaded file into a directory (say DIR). Then insert the following lines at the end of your .emacs configuration file:
      (setq load-path (cons "DIR/xref/emacs" load-path)) (setq exec-path (cons "DIR/xref" exec-path)) (load "xrefactory") 
      Don't forget to replace DIR by the actual name of the directory where you have unzipped Xrefactory.

      Under UNIX systems you can skip this point by running xrefsetup shell script. This script will setup your .emacs file automatically and will guide you through Xrefactory training examples.
    • If you have used Xrefactory Java before installation of Xrefactory C++, you will need to remove your Xrefactory Java configuration file (this is usualy the file ~/.xrefrc) in order to profite from free evaluation license.




    3. Training Examples

    It 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. License

    You 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.
    相关文章
    相关标签/搜索