emacs中定义了大量的快捷键,让各种操作可以速度如飞。我们也可以定制化,给自己想要的任何操作(函数)绑定任何想要的按键。
按键绑定的可见范围分类
全局绑定 > 主模式(major-mode)绑定 > 副模式(minor-mode)绑定 > 局部绑定(在某个缓冲区中通过执行"M-x"所做的绑定)
在更小可见范围中定义的按键绑定将会覆盖掉在更大可见范围内已经定义的相同按键的绑定。
查看某个按键(序列)和哪些函数进行了绑定
C-h c [按键序列]
查看某个函数和哪些按键(序列)进行了绑定
C-h w [函数名] <RET>
使用global-set-key和kbd给函数绑定全局按键
常用用法如下:
(global-set-key (kbd "C-z") 'shell) ;; 将shell函数绑定到按键"C-z"上
(global-set-key (kbd "C-c y") 'clipboard-yank) ;; 将clipboard-yank函数绑定到按键"C-c y上"
(global-set-key (kbd "C-M-q") 'query-replace)
(global-set-key (kbd "<f5>") 'flyspell-mode)
(global-set-key (kbd "C-<f5>") 'linum-mode)
(global-set-key (kbd "C-<right>") 'forward-sentence)
使用add-hook给指定的主模式绑定按键
使用add-hook可以对指定的主模式进行按键绑定,而不影响其他模式。大部分的主模式都定义了自己的至少一个hook,用法示例:
;; 仅在org-mode模式改变"C-z"的按键绑定,将其绑定为打开shell命令行的"shell"函数,注意这里要使用local-set-key
(add-hook 'org-mode-hook
(lambda ()
(local-set-key (kbd "C-z") 'shell)))
注:1. 给主模式绑定快捷键后,要重启主模式才能生效(kill掉对应的buffer然后重新打开)2. 查看当前emacs中的所有已定义的hook:M-x apropos-variable <RET> -hook <RET>
使用define-key给指定的模式绑定按键
使用define-key
函数也可以给指定的模式绑定快捷键,前提是这个模式定义了按键map,所以第一件事就是要找到这个模式所定义的按键map。
以org-mode
为例,怎么知道这个模式所定义的按键map是什么呢?非常简单,C-h f <RET> org-mode <RET>
查看org-mode
的帮助文档,就会出现org-mode
代码所在的el
文件,进入这个文件,搜索:-map
,就会找到org-mode-map
这个变量。
然后使用define-key
来为org-mode
定义一个简单的按键绑定,如下:
(defun my-org-func ()
(interactive)
(message "hello, org!"))
(define-key org-mode-map (kbd "C-c d") 'my-org-func)
加载上述代码后,在org-mode
中按C-c d
快捷键,就会执行my-org-func
函数,显示出来一个字符串:hello, org!