Emacs 编辑器

Emacs 最强大的编辑器

// 在一个资源爬取网站上面看到的一个文章,看上去也是综合的,不过心得比较多,比起死板的教程和命令来的有用,ctrl+C过来了。


希望本文能指引你进入Emacs的神奇世界

一 基本介绍
1. Emacs是什么东西?

Emacs名字的正式由来是"Editing Macros"的简称,即“宏编辑器”,当
然这个“宏”和臭名昭著的“宏病毒”没有半点关系。也有一种说法是
rms(Emacs的作者)最喜欢的一家冰淇淋店的名字。经过将近20年的发展
, Emacs的功能不断的增强,现在更通用的说法是"Emacs is the
extensible, customizable, self-documenting real-time display
editor"。

也许你早就从网上,朋友或者某个讨厌的Emacs fake zealot(比如我)
那里听说过有个 叫 "Emacs"的东西。也许你一直以为Emacs是来自遥远
的*nix世界的魔鬼,而对它畏而远之,但实际上,Emacs是一个真正的
跨平台软件,在最大限度上保证了平台无关性,即使是在Windows下,
也表现的非常出色,实际上我现在就是在Windows下写这篇文档。应广大
用户的要求,微软 的Visual Studio .Net 2005 beta版中已经实现了简
单的模拟Emacs编辑模式,也许在正式版中会得到进一步的加强。

2. Emacs能做什么?

顾名思义,Emacs的“本职工作”是编辑文本。这里的文本包括的 范围
就很大了,像我现在写的这样简单的纯文本,更主要是用来编辑各种程
序的源代码,比如C, C++, C#, Perl, Python, html, php, lisp,
matlab, tex....。Emacs的强大体现在它的人性化,和智能化。比如不
管在哪种语言模式下,都可以用 M-e, M-a 移动一句话,M-{ M-} 移动
一个段落,C-M-f, C-M-b 在平级的语法结构中移动,C-M-a C-M-e 在
语句块中前后移动,等等等等。你不需要去记住每个模式的操作方式,
因为它们是如此的一致,Emacs通常会很“聪明”的识别不同模式下各
种语法结构的意义, 在任何模式下 C-M-\ 都会把一段代码排版的整整齐
齐, M-; 可以插入一条注释并缩进到正确的地方。

用Emacs编辑代码,可以实现语法加亮,折叠,隐藏,大纲模式,自动
补全等基本功能,可以直接调用编译器和调试器来编译,调试程序,可
以直接把网页代码送到浏览器中预览,可以把Emacs当成一个代码浏览器
。关于Emacs编写程序方面的扩展实在是太多了,由于我水平很菜,也没
接触过很多,总之当你有自己的需求的时候,直接去网上找,Emacs很少
会让你失望的。

除了被用来编辑文本,Emacs也越来越多的被用来做其它事情,而且往
往做得非常出色。 dired 模式被用来作为文件管理器, 其功能比起同样
出色的Total Commander可一点都不弱。Gnus是访问新闻组和接收邮件
的利器,实现了专业级别的 Mail Client 功能,Gnus 的 FAQ 中这样
写道 "不要再问 ‘我能xxxx吗?’之类的问题,因为你得到的答案通常
都是 ‘Yes’"。当然有点夸张了, 因为对于某些"私有"的东西,Gnus
支持的并不好,比如微软的 hotmail。

Emacs还可以被用来作为很多程序的前端,比如 mysql 数据库, Matlab
软件, 各种 Scheme 解释器。

Emacs还有一大堆“乱七八糟”的功能,Emacs的日历,能支持中国的历
法,天干地支都支持,还能根据你所在地方的经度纬度计算日出日落时
间。配合Emacs日历,可以写日记,约会提醒等等和日程相关的事情。你
要是想用Emacs做计算器,查字典,聊天,播放mp3,使用p2p下载软件,
这些也不是不可以。

3. 为什么要用Emacs?

看了前面一大堆功能(虽然不及Emacs实际功能的1%),你可能会说“你
丫是不是有毛病,这些功能都有专门的软件去实现”。你说的没错。当
然每个人都有自己的选择习惯。但是我的感觉是,Emacs不仅仅是能实现
这些功能,关键是实现的往往非常出色,不逊色于专有的软件。而且在
Emacs中做这些事情,有一个统一的工作环境,不需要去熟悉各种软件的
操作习惯,在Emacs中你会发现许多看似毫不相关的软件功能,在Emacs
中变得如此相似,我觉得这种感觉很美妙:P。

Emacs是一个“free software”,这里的“free”是指“freedom”,
而不是“免费”的意思。当然对个人用户来说,获得Emacs通常都是免费
的。你永远不会担心“新版本的完美破解怎么还没出来?”“升级到新
版本,key又失效了”,“这个软件要是再便宜一点我就能注册了”,“
这个软件的作者真不厚道,老的注册用户都不能免费升级了”之类的问
题。Emacs属于所有人,它是完全自由的,你可以自由的修改它以实现你
需要的功能,可以自由的和别人分享你修改后的代码,当然这一切都要
遵循GPL。

4. Emacs与其它编辑器相比有什么优点?

这个问题我没办法回答,因为我不敢对我不怎么了解的东西妄加评论。
尤其是在 et8 这藏龙卧虎的地方(我想你们也一样吧?)。我只能说
Emacs 开放的 C+elisp 架构使其具有几乎无限的扩展性,在扩展性方
面,是当之无愧的 No.1. 如果你看到其它某种编辑器有个很酷的功能
,不用怀疑,Emacs 可以实现它,如果你足够强,可以自己动手或者向
某个你熟悉 elisp 高手求助。 总之,没有什么作为一个编辑器应该具有
的功能是 Emacs 实现不了的 。


5. Emacs 与其它编辑器相比有什么缺点?

这个我倒可以说说:P。首先,用 Emacs 会上瘾,在一个没有 Emacs 的
机器上,你会无精打采,没有工作的热情。如果你失去了自己的配置文
件,你会变得痛苦万分,因为重新把 Emacs 配置一遍是很要花一番功夫
的(除了 Emacs 还没见过哪个软件的配置文件能让人穷此一生的去研究
)。其次,Emacs 和其它编辑器相比是“臃肿”的,和vim, editplus
这样小巧的编辑器相比,它体积大,启动慢,耗内存(现在我机器上开
了一个ue,四个emedit,和一个editplus,它们加起来消耗的内存还不
到 Emacs 的一半 =_=),不过它的运行速度可一点都不慢,嘿嘿。其
实 Emacs 本来就不想做一个小巧的编辑器,它的“正确使用方法”是
:随着你的系统一起启动,直到你一天的工作结束后关机,在这一天的
工作当中,也许你根本不需要离开 Emacs。最后,Emacs 的操作习惯让
大部分用惯了 Windows 的人感到不爽, 很多人都是因为这个放弃了它
。刚开始你会觉得,Ctrl Alt Shift Esc + 各种各样奇怪的按键方法
很变态。事实上 Emacs 的优势不在击键次数,使用 Emacs 就是要让它
少按键甚至不按键就实现你想要的功呢。要说按键的简洁,那老大应该
是 Vim :P。再说, Emacs 的按键没有你想象的那么复杂,它们的设计都
有统一的规律, 熟悉了一种模式的按键,很容易就会熟悉其它模式中的按
键 , 这就是 Emacs 统一编辑环境带来的好处。


6. 尝试消除对 Emacs 的几个偏见。

1. “我X,啥破玩意,连语法加亮都没有,删了它”。

很多人这样抱怨 ,不过稍微用脚丫子想一想,最早作为一个程序员
给程序员写的编辑器,可能连这种最基本的功能都没有么?实际上
Emacs 对语法加亮的支持非常好,它是根据语法分析来着色的,而不
是死板的定义一堆的关键字和正则表达式。语法加亮其实是一个比
较消耗资源的功能,特别是在 Emacs 诞生的那个年代。而且 Emacs
所支持的机器比一般人听过的都要多,不是每个机器都支持彩色
的....,类似的情况还有加亮选择区域。还有可能是,最早使用
Emacs 的超级大牛根本不需要这个既消耗资源又对他们没什么用的
功能。总之, Emacs 由于种种历史原因,保留了它特有的一些风格
。只要是稍微有耐心的人,都会在 Option 菜单最显眼的地方找到
打开它的选项。

2. “开源的东西,还免费,质量靠不住”。

这么认为的人应该不多。能在这个年代还抱有这种可笑的偏见只有两
种人:火星人和极端的 Warez zealot。即便是微软,也只会在他们
的 FUD 战术中“违心”的宣称一下而已,能骗一个是一个嘛:P。
 
二. 实战 Emacs

看到我前面白乎了一大堆,你可能不耐烦了,拜托再给点面子,下面是实
战部分了,别错过最关键的东西。再说俺打这么多字也不容易,都是在一
个坛子里混得,给点面子吧。


-1. 写在最前面

如果你第一眼看到 Emacs 就对它感到无比的厌恶,很简单,Quit &
Delete. 或者误打误撞,遇到一些常见的小毛病,如何解决?我首先
教你如何做这些。

按键说明:
按键是大小写敏感的,也就是说 'C-A' 表示 Ctrl+Shift+A, 'C-$' 表示
Ctrl+Shift+4.

C-x 表示 按住 Ctrl+x
M-x 表示 按住 Alt+x 或者 按一下 Esc 再按一下 x
C-x y 表示 按住 Ctrl+x 松开Ctrl 再按下 y
M-x y 与上面类似.
C-x C-y 表示 一直按住 Ctrl,然后按下 x y
M-x M-y 与上面类似.
RET 表示回车

是不是觉得麻烦,实际上有人说 Emacs 是 'Esc Meta Alt Ctrl
Shift' 的简称。你可以考虑买一个跳舞毯来方面你操作。

在 Emacs 中,你不知道做了某种操作,导致 Emacs 进入某种意外的
状态,这时候按下  C-g 结束当前命令。记住,
不管在任何模式下,想中止当前命令,按下 C-g

如果跳出一个buffer,里面有一堆 (((xxxx))) 之类的调试信息,那
是 Emacs 的 lisp 解释器出错了,这时候简单,直接按一下
' q' , 这个讨厌的窗口就消失了。

如果你不想玩了,甚至准备删除 Emacs,如何退出呢?
1. Ctrl+Shift+Esc 调出任务管理器杀死(最解恨的方法)。
2. 如果你觉得上一种方法太粗鲁,也可以从菜单退出,
File->Exit Emacs.
3. 也许你想表现的更好,使自己的操作更有 “Emacs味”,那么
标准的操作是  C-x C-c

然后你可以去睡觉,做别的事情,甚至是直接删除整个Emacs目录,连
回收站都不要它去!

1. 获得 Emacs

废话少说,最直接的办法,去 Emacs 的老窝直接下载。下载地址是

http://ftp.gnu.org/pub/gnu/emacs/

Emacs 现在的稳定版本是 21.3。我个人推荐的是去

http://savannah.gnu.org/projects/emacs/

下载最新的 CVS 版本,CVS Emacs 做了很多有用的改进, 特别是在中
文支持方面做得更好了, 当然 21.3 也没有问题, 如果你不会用 CVS
就算了。而且从源码编译 Emacs 往往需要 Visual Studio。有点麻烦
,谁让 Windows 下连个免费的编译器都没有呢。权宜之计,可以从这
里下载最近编译的 CVS Emacs

ftp://soft.eeatech.org:11021/incoming/other/Gnu%20Emacs/

不过我不能保证连接的有效性。真希望 et8 有个热心人能做一下这个
工作,就像 Mplayer K&K 版一样。

2. 安装方法

Emacs 不需要安装,属于大家所提倡的那种"绿色软件",解压缩后,进
入 bin 目录,双击  runemacs.exe 就可以运行
了。还有,把 emacs 的 bin 目录的绝对路径,添加到你的
PATCH 环境变量中,如何设置环境变量? 我的
电脑->右键->属性->高级->环境变量....不说了,这些基本的
windows 操作您比我明白。这一步不是必须的,但是 有些必要:)。


2. 基本配置

Emacs 的配置文件是一个叫  .emacs 的文件,不
知道 M$ 哪两个部门的沟通出了点问题,导致 windows explorer 无
法直接创建 ^.* 这样的 文件(而这样的文件名在windows文件系统中
却又是合法的,啧啧), 所以 ,在windows下也可以 用
_emacs 来代替。

下一步,让emacs找到你的 .emacs 配置文件,如果你什么都懒得做,
就直接仍到  C:/ 下面好了。
但是我最强烈 的推荐大家,稍微多做一点点工作,以便以后工作的更好
。设置一个“主目录”,这个目录通常就是

c:/Documentsand Settings/Administrator

你也可以设置能其它目录,以方便重装系统的时候备份。

设置主目录有两种方法

1. 新建一个名字叫  HOME 的环境变量。变量
值就是你的想要的目录路径名称。

2. 如果你觉得第一种方法不过瘾,想让 Windowz 最强大的注册表发
挥一下功能,也可以。新建一个数据项

HKEY_CURRENT_USER\Software\GNU\Emacs

在里面添加一个 REG_SZ 类型的字符串,名字就叫
HOME, 值就是你想要的目录路径名。

设置好主目录后,把 .emacs(_emacs) 扔进去。最基本的设置就算完
成了。

3. 中文支持

Emacs 是一个真正的支持多语言编辑器。试试看

M-x view-hello-file

会列出Emacs支持的所有语言。如果有些大方块在里面,那不是
Emacs 的错,因为你的系统里没有那种字体。

如果你下载的是那个 CVS Emacs,据说默认就支持中文了。如果是21.3
,可能需要一点配置。

打开 .emacs(_emacs) 文件,你现在还不会用 Emacs, 所以还是先用
notepad, ue, editplus 等你熟悉的编辑器吧。

注意: 绿色部分为代码,直接copy过去就可以,';'开头的行,是
elisp的注释行,但愿你的编辑器已经支持它了。

加入以下几行。

(set-terminal-coding-system 'chinese-iso-8bit)
(set-keyboard-coding-system 'chinese-iso-8bit)
(set-language-environment 'chinese-gb)
(set-clipboard-coding-system 'chinese-iso-8bit)
(set-selection-coding-system 'chinese-iso-8bit)
(setq locale-coding-system 'chinese-iso-8bit)
(setq current-language-environment "Chinese-GB")

启动emacs, 试着敲几个中文,应该不会有问题了。

Emacs 默认支持的是 gb2312 的中文,虽然大部分情况是足够用了,
但偶尔还是会遇到 gb2312 以外的字符,比如我们前总理的名字。
不管出于什么理由,的确有办法让 Emacs 支持 gbk 字符集。设置稍
微麻烦一点。首先去这里下载最新的,一定要最新的! mule-gbk

http://mule-gbk.sourceforge.net

解压缩后看看里面的 README 文档,那个文档是为 Linux 写的,所以
可以直接看我下面的说明。

在 .emacs(_emacs) 文件的第一行,务必是第一行! 加入如下内容。

;; Top line of .emacs: -*- coding: chinese-gbk; -*-

这是为了在后面使用中文的字体名字。

紧接着的一行是:

(add-to-list 'load-path "d:/emas-lisp/mule-gbk-0.1.2004080701")

引号中的部分是你的 mule-gbk 解压缩到的目录,建议你和我一样,建
立一个目录专门存放自己的 .el 文件,我的是 d:/emacs-lisp。

随后的部分是

(setq w32-charset-info-alist
(cons '("gbk" w32-charset-gb2312 . 936) w32-charset-info-alist))
(require 'mule-gbk)
(set-w32-system-coding-system 'chinese-gbk)
(set-terminal-coding-system 'chinese-gbk)
(set-keyboard-coding-system 'chinese-gbk)
(set-language-environment 'chinese-gbk)
(set-clipboard-coding-system 'chinese-gbk)
(set-selection-coding-system 'chinese-gbk)
(setq locale-coding-system 'chinese-gbk)
(setq current-language-environment "Chinese-GBK")


接下来要区别一下,如果你下的是标准的 21.3,采用下面的设置:

;; Setup X Selection for mule-gbk
(mule-gbk-selection-setup)


如果你下的是 CVS Emacs,采用这个设置:

;;; Unicode support, for Emacs CVS (21.3.50) only
(when (fboundp 'utf-translate-cjk-mode)
;; Load modified utf-translate-cjk-mode
(require 'gbk-utf-mode)
;; Turn on utf-translate-cjk-mode
(utf-translate-cjk-mode 1)
;; Setup X selection for unicode encoding
(setq x-select-request-type '(UTF8_STRING COMPOUND_TEXT TEXT STRING)))



分歧到此为止,下面的部分,是统一的:

(create-fontset-from-fontset-spec
"-*-Courier New-normal-r-*-*-14-*-*-*-c-*-fontset-most,
chinese-gbk:-*-宋体-normal-r-*-*-16-*-*-*-*-*-gbk*-*,
chinese-gb2312:-*-宋体-normal-r-*-*-16-*-*-*-*-*-gb2312*-*,
chinese-cns11643-5:-*-宋体-medium-r-*-*-16-*-*-*-*-*-gbk*-*,
chinese-cns11643-6:-*-宋体-medium-r-*-*-16-*-*-*-*-*-gbk*-*,
chinese-cns11643-7:-*-宋体-medium-r-*-*-16-*-*-*-*-*-gbk*-*,
korean-ksc5601:-*-Batang-normal-r-*-*-16-*-*-*-c-*-ksc5601.1987*-*,
chinese-big5-1:-*-宋体-normal-r-*-*-16-*-*-*-*-*-big5*-*,
chinese-big5-2:-*-宋体-normal-r-*-*-16-*-*-*-*-*-big5*-*,
japanese-jisx0208:-*-MS UI Gothic-medium-r-*-*-16-*-*-*-*-*-jisx0208*-*" t)

(setq default-frame-alist
(append
'((font . "fontset-most"))
default-frame-alist))



以上一大段是新建了一个字符集 'fontset-most'。
确保代码无误,启动 Emacs, 敲一下前总理的名字,看看正常没有
?如果正常,说明你的 Emacs gbk 已经配置好了。

4. 做一点改变,让 Emacs 符合 Windows 用户的习惯( 慎用慎用)。

;按照windowz用户的习惯使用 `C-x C-c C-v'
(setq cua-mode t)

;按照windowz用户的习惯,使用 'Ctrl Alt Shift + 方向键移动和选择文本'
(setq pc-selection-mode t)
 
5. 一些减轻痛苦的设置

;;打开语法加亮
(cond ((fboundp 'global-font-lock-mode)
;; Load the font-lock package.
(require 'font-lock)
;; Maximum colors
(setq font-lock-maximum-decoration t)
;; Turn on font-lock in all modes that support it
(global-font-lock-mode t)))


;;加亮选中部分
(transient-mark-mode t)

;关闭起动时的那个“开机画面”。
(setq inhibit-startup-message t)

;显示列号。
(setq column-number-mode t)

;不要在鼠标点击的地方插入剪贴板的内容,不然你的文档很容易变得乱七八糟。
(setq mouse-yank-at-point t)

;括号匹配时加亮显示另外一边的括号,而不是烦人的跳到另一个括号。
(show-paren-mode t)
(setq show-paren-style 'parentheses)

;光标靠近鼠标指针时,让鼠标指针自动让开,别挡住视线。
(mouse-avoidance-mode 'animate)

;在标题栏显示buffer的名字,而不是 emacs@!#*&!(&@# 这样没用的提示。
(setq frame-title-format "emacs@%b")

;设置一下备份时的版本控制,这样更加安全。
(setq version-control t) 
(setq kept-new-versions 3)
(setq delete-old-versions t)
(setq kept-old-versions 2)
(setq dired-kept-versions 1)

;设置自动备份文件保存的目录,以免把你的磁盘弄得乱七八糟(你可以
去掉这一行试试看:P ~/.autosave 表示 主目录下的一个叫
.autosave 的子目录,按照前面的方法设置主目录。
(setq backup-directory-alist '(("." . "~/.autosave")))

;让 dired 可以递归的拷贝和删除目录。
(setq dired-recursive-copies 'top)
(setq dired-recursive-deletes 'top)

;;滚轮支持
(setq mouse-wheel-mode t)

;一个加强的 buffer 列表模式
(require 'ibuffer)
(global-set-key (kbd "C-x C-b") 'ibuffer)


;浏览剪贴板中的内容,绑定到 'C-c k'.
(require 'browse-kill-ring)
(global-set-key [(control c)(k)] 'browse-kill-ring)
(browse-kill-ring-default-keybindings)

;ido mode. 超强的buffer切换工具, Emacs 也有通常编辑器的那种
在 Tab 中选择 buffer 的 mode,但是用了ido 以后,我再也不需要
他它了,ido mode 是我见过最方便的 buffer 切换模式。
(require 'ido)
(ido-mode t)

;极强的自动补全,帮定到 M-/ 上面了。
基本就是,你编辑了一段时间以后,只要输入字符串的前几个字符,
按一下 M-/ ,就会补全后面的,多按几次可以选择。补全的原则是"就
近选择",试试就知道了,多数情况都让人满意。

(global-set-key [(meta ?/)] '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))


;设置日历表的中文天干地支,在日期上按 `p C' 就可以显示农历和干支。
(setq chinese-calendar-celestial-stem
["甲" "乙" "丙" "丁" "戊" "已" "庚" "辛" "壬" "癸"])
(setq chinese-calendar-terrestrial-branch
["子" "丑" "寅" "卯" "辰" "巳" "午" "未" "申" "酉" "戌" "亥"])

;设置你所在地方的经度纬度,在日历中就可以查看日出日落时间。
(setq calendar-latitude 30.15)
(setq calendar-longitude 120.10)
(setq calendar-location-name "Somewhere")

;记住上次编辑的文件,这样你下次进入Emacs 的时候,就会直接打开
上次编辑的东西,就和没退出过一样。建议,把这个设置放在配置文
件的最末尾!
(require 'desktop) 
(desktop-save-mode t)
(desktop-read)


基本的设置就到这里,有兴趣的话,就继续往下看。

6. 开始学习 
Emacs 的学习过程是充满挑战和快乐的。也许没有你原来想
象的那么恐怖。Emacs 自带了一个入门的 Tutorial 就是最好的入门
教材。如果你有兴趣继续学习 Emacs,学习这个 Tutorial 是
必须的,下面教你如何查看它。

1. 直接从菜单 Help->Emacs Tutorial
2. 如果你下载的是 CVS Emacs,就更好了,已经有一份中文的版本。
Type:
C-u C-h t TAB

选择中文版本
如果是 21.3,恐怕就要耐性子读英文了,直接  C-h
t
 打开它。


这个 Tutorial 是交互式的,看起来很轻松,耐心的把它看完,你就是
一个准 Emacs User 了

Emacs: 一个真正的编辑器
官方GNU Emacs主页。

官方EMACS快速指南
入门的好材料呀。

Emacs Logo的设计
介绍如何设计Emacs的启动画面。

一个创建Emacs mode的教程
一步一步教你如何创建Emacs mode。

参考卡片
打印下来贴在案边是个不错的选择:=)

Introductory Tutorial
介绍Emacs的PS文件。(写于1994年; 你需要升级它)

VM
Quick reference card andtoolbar icons for the preferred Emacs mail reader.

Tiracol cartoon (in Spanish)
The eternal battle between Good and Evil.

自定义你的Emacs
收集 .emacs文件的最好网站。

有用的扩展包(By Noah Friedman)
我已经从这里找到并安装了许多扩展。

Emacs Wiki
非常棒的组织工具。

vi教程
对于非Emacs用户极为有用。

Emacs::最强大的编辑器

目录

Emacs编辑器
Emacs编辑器常用命令
Emacs Wiki
emacs-wiki的导航菜单
emacs-wiki-table的使用
emacs-wiki多个项目之间的互相引用
Emacs Lisp

Emacs编辑器

Emacs编辑器常用命令

键组合1 命令含义
C-x C-f 打开文件
C-x C-s 保存文件
C-x C-c 退出
C-/ 撤消2
C-g 取消当前命令
C-f 向前移动一个字符
C-b 向后移动一个字符
M-f 向前移动一个单词
M-b 向后移动一个单词
C-v 向下翻页
M-v 向上翻页
M-r 移到屏幕中间行首
C-x k 关闭当前缓冲区
M-x 执行命令
C-h w 查询命令
C-h k 查询键绑定3

[1]C代表Ctrl键,M是Meta键,一般指Alt,如果没有可以用ESC代替

[2]如果需要重做(Redo)功能,可以先用C-g再用C-/

[3]以上两个命令非常有用,特别在不知道命令所对应的键组合时

Emacs Wiki

关于Emacs Wiki,李宇和薛瑞尼已经做了非常详细的中文说明,对他们的辛苦工作表示感谢!在此我需要补充一些东西和我在使用中碰到的问题。

emacs-wiki的导航菜单

早期的emacs-wiki-menu有个bug,已经由李宇将bug报告给Michael Olson(emacs-wiki的maintainer)并修复了。可以从maintainer的主页上下载最新的emacs-wiki,或者做如下修改,在“/path/to/emacs-wiki/emacs-wiki-menu.el”的大约243行,将

(cddr entry) ; tooltip

改为

(car (cddr entry)) ; tooltip

我听说只需要修改.el文件而不必重新编译就能生效,但是实际操作过程中,发现需要将对应的.elc文件删除才行。

在$HOME/.emacs-wiki.el中加入

(require 'emacs-wiki-menu)

然后将“/path/to/emacs-wiki/emacs-wiki-publish.el”中关于header定义的一部分中关于(funcall emacs-wiki-menu-factory)这一部分的注释取消。

另外一个问题是,我希望使用手工方式创建菜单,即在页面源文件第一行写入

#menu (("menuItem1" "url1" "toolTip1") ("menuIterm2" "url2" "toolTip2") ...)

按照中文emacs-wiki的说明,需要在$HOME/.emacs-wiki.el中写入

(setq emacs-wiki-menu-factory 'emacs-wiki-menu-make-from-list)

但是经我试验如果写入就会出错,不写就没问题。

新版本导航菜单的使用

在emacs-wiki 2.67 以后的版本中,导航菜单的生成方法做了较大的改动,主要有以下几点:

  • 可以不用修改emacs-wiki-publish.el文件,手工定义header即可,将以下几行的注释取消
<lisp>(when (boundp 'emacs-wiki-menu-factory)
        (funcall emacs-wiki-menu-factory))</lisp>
  • 必须在$HOME/.emacs-wiki.el中定义emacs-wiki-menu-factory为"emacs-wiki-menu-make-from-list"
  • 页面中的菜单不再使用"#menu (("menu1" "url1" "tooltip1") ...)"的形式,而使用
<lisp>(setq emacs-wiki-menu-definition
'(("menu1" "url1" "tooltip1")
("menu2" "url2" "tooltip2")))
</lisp>

值得注意的是,如果使用这种办法生成导航菜单,页面中会多出

(("menu1" "url1" "tooltip1") ("menu2" "url2" "tooltip2"))

这样的内容,解决办法是用"<!--"和"-->"把它注释掉。

emacs-wiki-table的使用

在使用emacs-wiki-table的时候我发现了一个bug,使用旧版本的可以修改“/path/to/emacs-wiki/emacs-wiki-table.el”的大约75行和93行,把

"]+" nil t))
...
"]+</p>" nil t))

改为

"]+") nil t)
...
"]+</p>") nil t)

然后在$HOME/.emacs-wiki.el中加入

(require 'emacs-wiki-table)

即可。注意最好把相应的旧.elc文件删除,如果碰到找不到table的情况,你可以需要重新编译一下你的“/path/to/emacs- wiki/contrib/table.el”,并将table.elc放入 “/path/to/emacs/21.3.50/lisp/textmodes/”下面。

emacs-wiki多个项目之间的互相引用

同一个项目之间引用很容易,只需要用

wikiName或者wikiName#anchorName

要在不同项目之间引用的话需要事先定义emacs-wiki-interwiki-names,先假定project是这样定义的

(setq emacs-wiki-projects
	`(("proj1" . ((emacs-wiki-directories . ("~/wiki/proj1"))
	              (emacs-wiki-publishing-directory . "~/publish/proj1")))
	  ("proj2" . ((emacs-wiki-directories . ("~/wiki/proj2"))
	              (emacs-wiki-publishing-directory . "~/publish/proj2")))))

emacs-wiki-interwiki-names可以这样定义

(setq emacs-wiki-interwiki-names
      '(("proj1" . 
	 (lambda (tag)
	   (concat "../proj1/" tag ".html")))
	("proj2" . 
	 (lambda (tag)
	   (concat "../proj2/" tag ".html")))))

这样,如果需要在proj1的页面中引用proj2中的页面,只需要这样写

proj2#wikiNameOfProj2

项目间引用另解

使用项目间引用的另一种方法是利用emacs-wiki-update-project-interwikis函数。projects需要这样定义

(setq emacs-wiki-projects
	`(("proj1" . ((emacs-wiki-directories . ("~/wiki/proj1"))
	              (emacs-wiki-project-server-prefix . "../proj1")
	              (emacs-wiki-publishing-directory . "~/publish/proj1")))
	  ("proj2" . ((emacs-wiki-directories . ("~/wiki/proj2"))
	              (emacs-wiki-project-server-prefix . "../proj2")
	              (emacs-wiki-publishing-directory . "~/publish/proj2")))))
(emacs-wiki-update-project-interwikis)

这样就不需要定义emacs-wiki-interwiki-names了,而其实emacs-wiki-interwiki-names在其它场合有更广泛的应用。


你可能感兴趣的:(emacs入门)