我正在尝试仅使用paredit中的一些功能,而无需加载所有键绑定(bind)。查看paredit.el,我发现的唯一键映射是paredit-mode-map,因此我尝试了此操作。
(setq paredit-mode-map (make-sparse-keymap))
(define-key paredit-mode-map (kbd "<C-M-left>") 'paredit-backward)
它没有更改键绑定(bind)(已通过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是用于查找的变量。我敢肯定,有更优雅的方法可以更改键绑定(bind),但是我想更多地了解emacs中的键绑定(bind)是如何工作的。
最佳答案
Paredit使用另一种定义键盘映射的方式。大多数次要模式在变量定义中定义了键盘映射,而Paredit在顶层上调用paredit-define-keys
,从而强制初始化键盘映射。
换句话说,您不能阻止Paredit设置其绑定(bind)。您需要使用(define-key paredit-mode-map … nil)
删除键盘映射中的所有键盘绑定(bind),以摆脱这些绑定(bind)。
编辑:您不能通过为变量分配新的键盘映射来“重置”键盘映射。 (setq paredit-mode-map …)
将更改变量paredit-mode-map
,它将而不是更改由Paredit模式使用的实际键盘映射。
仅在定义时间,即define-minor-mode
评估期间,才对评估一次此变量的绑定(bind)。此宏在内部调用add-minor-mode
,并将键映射变量的当前值传递给此函数。该模式的所有将来使用仅指此键盘映射。 keymap变量为,不再由次要模式评估,因此更改其绑定(bind)无效。
如果要更改键盘映射,则必须在评估 define-minor-mode
之前(即,在加载相应库之前)重新绑定(bind)变量。因此,以eval-after-load
形式对其进行更改完全没有用。
通常,在加载库之前更改keymap变量效果很好,因为大多数模式都在defvar
主体内定义了keymap。但是,defvar
不会更改变量的值(如果它已经具有值)。因此,如果变量已经具有键映射,则不会被触摸。
但是,正如我所说,Paredit不尊重这种模式,而是强行将其绑定(bind)添加到键盘映射中。因此更改它是没有意义的,因为Paredit仍然会添加其绑定(bind)。
如我所说,您必须通过取消定义每个键来手动清除现有键图。
TL; DR:真的使用Smartparens!它涵盖了所有Paredit,灵活,功能强大,可扩展,总之就很好。它使您可以选择所需的任何键绑定(bind)。