我想只使用paredit中的几个功能,而不加载所有按键绑定。查看paredit.el文件,我发现唯一的键位映射是paredit-mode-map,所以我尝试了以下方法。
(setq paredit-mode-map (make-sparse-keymap))
(define-key paredit-mode-map (kbd "<C-M-left>") 'paredit-backward)
它没有改变按键绑定(通过C-h k检查),但变量paredit-mode-map已经被修改。
我也尝试了
(eval-after-load "paredit"
'(progn
(setq paredit-mode-map (make-sparse-keymap))
(define-key paredit-mode-map (kbd "<C-M-left>") 'paredit-backward)))
然后尝试开启或关闭paredit,但结果相同。
在此之前,我直接更改密钥映射一直有效。这里发生了什么?
编辑:
我通过以下方式成功更改了密钥映射:
; Remove old paredit bindings
(defun take-from-list (condp list)
"Returns elements in list satisfying condp"
(delq nil
(mapcar (lambda (x) (and (funcall condp x) x)) list)))
(setq minor-mode-map-alist
(take-from-list
(lambda (x) (not (eq (car x) 'paredit-mode)))
minor-mode-map-alist))
; Create new paredit-mode-map
(setq paredit-mode-map (make-sparse-keymap))
(define-key paredit-mode-map (kbd "<C-kp-enter>") 'paredit-backward)
; Add the new paredit-mode-map to minor-mode-map-alist
(setq minor-mode-map-alist (append
(list (append (list 'paredit-mode) paredit-mode-map))
minor-mode-map-alist))
看起来minor-mode-map-alist是用于查找的变量。我相信有更优雅的方法来改变键绑定,但我想更多地了解在emacs中键绑定的工作原理。