LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1066|回复: 2

Emacs 中 CC Mode 下的一些键绑定修改

[复制链接]
发表于 2005-11-2 12:44:46 | 显示全部楼层 |阅读模式
我喜爱 Emacs 的强大和灵活,但却不喜欢它复杂的按键。曾经在 Emacs 中试过 Viper Mode,可是它在某些情况下表现得并不好。最重要的一点在于,由于这样结合出来的是一个既不像 Emacs 又不像 Vi (或者说既像 Emacs 又像 Vi)的怪物,经常使人感觉到按键的混乱。我经常使用 C 家族中的语言(如 C、C++、Java),但发觉自己无法使用 Emacs 的按键来达到在 Vim 中的编辑速度。经常出现的情况是,头脑中有了一个修改代码的想法,却无法很快地用键盘定位到要修改的地方,就是手的速度跟不上大脑的速度。这样,在 Emacs 中的效率比在 Vim 中的效率大大下降。

好在 Emacs 的键绑定非常灵活,我总结了一些常用的命令,并在 CC Mode 中重新划分了快捷键。自己尝试了一下觉得还可以,于是写在这里了。

把下面的代码加到 ~/.emacs 中。

  1. (defun my-c-mode-common-hook ()
  2.   (c-toggle-auto-hungry-state)
  3.   (local-set-key (kbd "M-<DEL>") 'backward-kill-sexp)
  4.   (local-set-key (kbd "M-d") 'kill-sexp)
  5.   (local-set-key (kbd "M-b") 'backward-sexp)
  6.   (local-set-key (kbd "M-f") 'forward-sexp)
  7.   (local-set-key (kbd "M-n") 'c-end-of-statement)
  8.   (local-set-key (kbd "M-p") 'c-beginning-of-statement)
  9.   (local-set-key (kbd "M-a") 'beginning-of-defun)
  10.   (local-set-key (kbd "M-e") 'end-of-defun))

  11. (add-hook 'c-mode-common-hook
  12.        '(lambda ()
  13.           (my-c-mode-common-hook)))
复制代码


主要解释一下 my-c-mode-common-hook 中的内容。c-toggle-auto-hungry-state 在 Emacs 的手册中有介绍,这里就不说了。后面的 8 对快捷键是我认为的在 C 家族程序中最常用的移动命令,通过重新定义它们到更简单的按键组合,手的速度便可以跟上大脑的速度了。不过这样做有一个缺点,就是它破坏了 Emacs 里在所有格式的文件中都可以用一种方式移动光标的优点,不过如果一个人因为习惯了它们而使效率上升,这也没什么了。不要忘记,通常人们在有灵感时都希望快些看到结果,并且人们在编写程序时比编写文档时对高效有更高的期望。

前四个快捷键都和相对单词的操作有关。在默认的情况下它们的配置是(按照与上面相同的顺序):

  1. backward-kill-word
  2. kill-word
  3. backward-word
  4. forward-word
复制代码


不过这经常不是我们希望的,比如 size_t 按照默认的方式就被解释成两个词 size 和 t,这样就需要按两下键组合才可以完成操作。默认提供了 C-M-b 和 C-M-f 来移动到前一个和下一个完整的表达式,不过这个按键太麻烦了。这四个快捷键都是为了减少对应情况里的按键。

后两对快捷键用于快速移动。

对我来说,上面这些移动的组合比 Emacs 中默认的好,因为它们提高了我的效率。显然,它们覆盖了我在像 C 这样的语言的程序中最高概率的按键。每个人都有自己的喜好,由于 Emacs 强大的特性,每个人都可以调整出自己最喜欢的设置。但正如 Vim 的作者 Bram Moolenaar 所说的,如果提高效率是最终的目标,一个人必须“练习使用这些操作对应的快捷命令,直到他可以不假思索地使用它们”。于是高效编辑需要磨合编辑器,这正是 Emacs 提供自定义设置的目标。
 楼主| 发表于 2005-11-2 12:56:21 | 显示全部楼层
如果再大胆一些,还可以这样写:
  1. (defun my-c-mode-common-hook ()
  2.   (c-toggle-auto-hungry-state)
  3.   (hs-minor-mode)
  4.   (local-set-key (kbd "M-<DEL>") 'backward-kill-sexp)
  5.   (local-set-key (kbd "M-d") 'kill-sexp)
  6.   (local-set-key (kbd "M-b") 'backward-sexp)
  7.   (local-set-key (kbd "M-f") 'forward-sexp)
  8.   (local-set-key (kbd "M-n") 'c-end-of-statement)
  9.   (local-set-key (kbd "M-p") 'c-beginning-of-statement)
  10.   (local-set-key (kbd "M-a") 'beginning-of-defun)
  11.   (local-set-key (kbd "M-e") 'end-of-defun)
  12.   (local-set-key (kbd "M-<") 'hs-hide-block)
  13.   (local-set-key (kbd "M->") 'hs-show-block)
  14.   (local-set-key (kbd "C-M-a") 'beginning-of-buffer)
  15.   (local-set-key (kbd "C-M-e") 'end-of-buffer))
复制代码

这样,按 M-< 可以折叠一段 {} 之间的程序,M-> 可以再将其打开,C-M-a 是到文件的开头,C-M-e 是到文件的结尾。到文件开头和结尾的概率在 C 程序中比折叠和打开代码的概率要小吧。
回复 支持 反对

使用道具 举报

发表于 2005-11-2 17:01:45 | 显示全部楼层
加精呀!  :cool:
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表