[emacs] 关于快捷键设置的方案选择: 修饰键(key modifier)的设置

三个月前之前我发过一篇《给Emacs安装一个脚踏板: 用Windows/Menu键作为key modifier》,讲的是在Windows下将现在普通PC键盘上的windows键和menu键(又叫apps键)用作super和hyper这两个key modifier,但用了一段时间之后发现了一些问题,主要有:
1) 正如厌恶Emacs的朋友们说的那样,Emacs这些组合键按多了手指有些疼,尤其是一次同时按两三个key modifiers的时候( Emacs = Escap Meta Alt Control Shift :)——而且也很难记住
2) 与windows键相关的组合,在Windows上和Linux上都有很多已经被系统和一些应用程序占用了,你得很小心地配置,另一方面要避免冲突,另一方面又要求好记,还不想配置"s-o r"这样的组合键,实在是难啊;
3) 在Linux的GNOME下,只能将两个windows键要么都配成super,要么都配成hyper,不能配置一个super/hyper(我也懒得去 改GNOME代码了),而menu键怎么都搞不成key modifiers(而且term/console下什么都配不出来),自己的配置完全用不上了;

下面来说解决办法:

1.1 避免组合键,避免key modifiers
避免组合键的方法是“粘滞键”,也就是一次敲一个键,松开之后再按另外一个,比如C-x C-s的击键方法是C x C s四个独立的按键。

粘滞键在XEmacs上自带的(setq modifier-keys-are-sticky t);但GNU Emacs没有这个功能,不过我们可以在系统层面进行设置,Windows/OS X/Linux都有各自的方法,具体可以参看 EmacsWiki: Sticky Modifiers


1.2 避免与系统快捷键的冲突

 
1) 查找冲突与解决冲突
对于Windows来说,如果你想用的键组合被其它应用程序(比如EverNote, Dexpot)占用了,但你又不知道是哪一个,做为程序员的你可以通过这个方法来查找“元凶”:Detect hotkeys conflict using Spy++ - Jerry Chou - 博客园,然后打开该应用程序,修改其配置,从而解决冲突。

GNOME下可以在GNOME Control Center里面进行修改。

2). 避免冲突

但上面的办法仍然不能解决win+e、win+r、win+l这些被Windows系统占用的情况,这个问题有两个解决方法:
2.1) 用AutoHotKey将这些组合键变为其它键

#+begin_src xahk
  ;; turn win+r into `C-c r'
  #r::Send ^cr
#+end_src

 

2.2) 用上一节的key-translation-map方法

这可以将windows键、menu键改成粘滞键(要求关闭系统粘滞键)。这种方法对其它应用程序没有影响,仍然可以用非粘滞的按键方法使用这些组合键原来的功能。

其实你也可以将这些通常用作modifier的键转换成其它的键
:

#+begin_src emacs-lisp
  (setq w32-pass-lwindow-to-system nil)
  (setq w32-lwindow-modifier 'nil)

  (define-key key-translation-map (kbd "<lwindow>") (kbd "<f11>"))
  (global-set-key (kbd "<f11> k") 'kill-whole-line)
  (define-key key-translation-map (kbd "<apps>") (kbd "M-x"))
#+end_src    

这也是目前我所用的配置方式: 将<lwindow>映射到<f11>,因为在Cygwin、Linux等得不到<lwindow>键的情况下,我可以直接使用<f11>。

1.3 如何充分利用上特殊键
上面说过,我现在将<lwindow>、<apps>这些特殊键映射到了普通键,这是否意味着不再需要这些特殊键?不是,只是说 它们不再是“不可替代的”,只是在对应什么功能上可以由普通键/组合进行替代,而如果有这些键,显然可以更快捷地完成任务。

尤其是有些连续多次按会出现不同效果的功能(比如mark-word, extend-selection),配置成多次按键(比如C-c .)显然很不方便;

而对于前缀键(prefix-key, 比如用于outline-minor-mode/hs-minor-mode的C-c @),替换成更短的组合键的话,也要方便得多。

Window/OS X/GNOME下配置super/hyper的具体方法: Emacs: How to define Super & Hyper Keys

* 关于GNOME的补充说明 :: GNOME的控制中心里只能将两个windows键要么都配成super,要么都配成hyper,不能配置一个super/hyper。我都试过用xmodmap来配置,但GNOME好像不受影响——Xah Lee恰好也在问这个问题: how to set keybinding in gnome? - gnu.emacs.help | Google 网上论坛 ,网上有人回答说是GNOME不使用古老的xmodmap,而是使用XKB——我也不清楚这两者是什么关系。

* 关于Windows的补充 :: ScrollLock也是可以配置成key modifier的一个特殊键 (w32-scroll-lock-modifier) ,而且它比较特殊: 它是个开关,也就是说,如果你把它配置成ctrl,那么按了一次之后,直到下一次按它之前,所有键都带被ctrl修饰,比如<scroll> c f就等于C-c C-f —— 好像没什么好用途?

* 实在没有怎么办?:: 很简单,就不用呗。参照我上面的方式不就好了?但如果你的配置是直接写s-r, H-v的话,
要都改过来又得好一阵,于是可以用如下的方式来救急: C-x @ h 等于 hyper, C-x @ s 等于 super... (这是GNU Emacs的缺省配置)。其实这也是用上面说的key-translation-map 配置出来的,你也可以将C-c h配置成hyper:

#+BEGIN_SRC emacs-lisp
  (define-key key-translation-map (kbd "C-c h") 'event-apply-hyper-modifier)
#+END_SRC

1.4 参考资料
* Emacs: How to define Super & Hyper Keys, from Xah Lee
* Wikipedia: Windows key (里面有与Windows键相关的快捷键列表)
* Wikipedia: Menu Key

 

 

posted @ 2011-05-28 05:54  巴蛮子  阅读(5418)  评论(10编辑  收藏  举报