EMACS-DOCUMENT

=============>集思广益

如何让重复调用emacs函数尽可能的方便

有时我们会需要重复执行一些由快捷键出发的Emacs函数. 这里有一种很简单的实现方式. 假设有一个简单的函数它的功能就是插入"here":

(defun insert-here ()
  (interactive)
  (insert "here"))

它的快捷键为 C-c h h:

(global-set-key (kbd "C-c h h") #'insert-here)

好了; 现在每当我们按下 C-c h h 就会在当前buffer插入"here"了. 但是我们经常会需要重复执行该命令. 诚然,我们可以通过 C-x z 来重复执行上一条命令,但是这需要我们按两下键盘呢,而且也不是特别的方便. 不过,我们可以这样做, 先创建一个sparse keymap 然后再这个keymap中设置 h 为该命令的快捷键.

(setq insert-here-keymap
      (let ((map (make-sparse-keymap)))
        (define-key map (kbd "h") #'insert-here)
        map))

现在我们只需要在 #'insert-here 中设置该keymap就行了. 我们不能用 #'use-local-map 来设置,因为这样一来我们就无法再插入字母h了:我们总是会优先使用 #'use-local-map 中的键绑定. 相反,我们需要用 #'set-transient-map 来设置,它会临时使用局部keymap,但在按下一个快捷键后就失效了.

(defun insert-here ()
  (interactive)
  (insert "here")
  (set-transient-map
   insert-here-keymap))

现在运行 #'insert-here 后, 我们可以通过按下 h 来重复执行该函数. 但若按下了其他的快捷键, 则该keymap会被禁用. 然后再按下 h 就会插入字母h了. 这样我们只需要按下一个键就能重复执行该命令了,很简单吧.