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 |