emacs试用以及设置#

---
创建日期: 2012-08-24
---
曾经有试用过emacs,就是那个为用vi还是emacs纠结的年纪……也不算是文章吧,现在我也看不懂……

对于按键,基本上想自己重新定义常用的。我也不知道有没有高级键配置,反正自己按类分,自己知道就好了。但有一些比较庞大的默认键我可不敢改,比如 C-x C-h C-c ,这些要是映射成别的再想用的时候就搞不顺溜了。 在定义其它键之前先得把这些大家伙映射到别的地方去,否则不太好按 C-x C-c 。我想分别映射成 C-7 C-8 。

基本按键映射例如: (define-prefix-command 'example-map) (define-key example-map (kbd "xxx") 'function-name) 当然要用到这里的example-map,就要再一个命令 (define-key global-map (kbd "yyy") 'example-map) 或者 (global-set-key (kbd "yyy") 'example-map) 对于 C-x 来说,对应的应该是 ctl-x-map ,现在要让 C-7 相当于 C-x ,我要这样 (define-key global-map (kbd "C-7") 'ctl-x-map) C-8 类似。但事实证明无效,总提示 ctl-x-map 为 void ,我不懂lisp,不过看来未定义? 然后就去各种搜索,都无效欸……

但是当这样配置 (define-key ctl-x-map (kbd "C-8") 'example-function) C-x C-8 是会执行example-function,那ctl-x-map怎么会未定义呢? emacs里的配置文件读取顺序又是怎样的?

普通方式定义map之前给出来了,那 ctl-x-map 在所有文件中应该会存在这么一句 (define-prefix-command 'ctl-x-map) 或者 (global-set-key (kbd "C-x") 'ctl-x-map) 之类的吧 我就去搜索 ctl-x-map ,结果只有 (define-key ctl-x-map ……) 难道这个是内置的?!这不太厚道啊!

继续搜索网络,emacs manual貌似也没搜到什么。 但是看到“Control-X-prefix”、“ctl-x-map variable”等字样, 难道 ctl-x-map 是个变量,而真正的map名字是 Control-X-prefix ? 现在 (global-set-key (kbd "C-7") ctl-x-map) 或者 (global-set-key (kbd "C-7") 'Control-X-prefix) 是可以实现的 所以想如法炮制 C-c 咯,但是确失败了。C-c 应该是给模式留的prefix-map,global方式不能随之变化。

就这样了吗,至少也达成一半的目的了。 但是仍有另一个想法,C-7 确实是完成前缀的任务了,C-7 C-7 或 C-x C-7 却不同于C-x C-x ,我会更希望 C-7 就是 C-x ,不论在哪个位置。 我之前有看到过global-translate命令,或许是我要的。 (keyboard-translate ?\C-7 ?\C-x) 这个是根据例子改的,却总是错误。 而 (keyboard-translate ?\C-i ?\C-x) 却成功了,非常符合预期,当按 C-i 显示的确实是 C-x 。 为什么数字不行呢?难道表达有误?后来发现也不能用 ?\M-i 去变成 ?\C-x 。 manual里提到keyboard-translate是因为在某些系统中 C-h 会变成 <DEL> 的作用 这里的 ?\C-i 也不同于 define-key ,缺少外面的括号,也不能用(kbd “zzz”)替换,看来是不同的类型数据。

到现在也没弄清怎么达到预期,或许用 C-m C-n 替换 C-x C-c 吧,7/8就留给一些常用却又不频繁的命令。

前面说某些系统里C-h会对应<DEL>,那去FreeBSD里试试。即使在shell里也是啊!而且C-a C-e C-p C-n C-y C-w C-k …… 全都和emacs里的命令相似啊,而且去slackware那试试也如此,难道UNIX有这种传统? emacs里也确实C-h变成<DEL>了。 manual上是说C-h发送的code和<DEL>同值,那其它的组合有没相同值的键?其它键在manual里没有提到。

在Windows下映射caps-lock为ctrl可以通过注册表,而FreeBSD Linux下,只搜到了X环境相关的应用(当然没试过),不知道no-X11怎么办。 在FreeBSD里可以通过 sysinstall - keymap - USA ISO / USA CapsLock->Ctrl 来使用映射,但只有一个改变,不能定制的样子,所以还要有空再看FreeBSD的Handbook。而其它的keymap比如USA Emacs完全不适用,输出字符完全不同,国内键盘应该多是USA ISO标准的。

想知道怎么在系统底层和emacs底层更改组合键的映射,如:C-7 变为 C-x ,M-8 变为 C-c 之类的。或许真的只有 C-alpha 才有意义。

在Windows下通过注册表更换两个按键的方式如下: 在[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout]中,新建一个二进制值的Key,名叫:Scancode Map。 修改为下面的值,第4行和第5行就是交换ctrl和caps-lock按键的作用。

00,00,00,00
00,00,00,00
03,00,00,00
3A,00,1D,00
1D,00,3A,00
00,00,00,00

下表是系统按键的值:

按键名

键值

Escape

01 00

Tab

0F 00

Caps Lock

3A 00

Left Alt

38 00

Left Ctrl

1D 00

Left Shift

2A 00

Left Windows

5B E0

Right Alt

38 E0

Right Ctrl

1D E0

Right Shift

36 00

Right Windows

5C E0

Backspace

0E 00

Delete

53 E0

Enter

1C 00

Space

39 00

Insert

52 E0

Home

47 E0

End

4F E0

Num Lock

45 00

Page Down

51 E0

Page Up

49 E0

Scroll Lock

46 00