我正在尝试仅使用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)。

10-07 19:53