gpt4 book ai didi

emacs - 为什么我不能更改 paredit 键绑定(bind)

转载 作者:行者123 更新时间:2023-12-04 14:02:15 24 4
gpt4 key购买 nike

我正在尝试仅使用 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),但我想更多地了解键绑定(bind)在 emacs 中的工作方式。

最佳答案

Paredit 使用不同的方式来定义键盘映射。大多数次要模式在变量定义中定义键映射,Paredit 调用 paredit-define-keys顶级 ,从而强制初始化键盘映射。

换句话说,您不能阻止 Paredit 设置其绑定(bind)。您需要使用 (define-key paredit-mode-map … nil) 删除键盘映射中的所有键绑定(bind)。摆脱这些。

编辑:您不能通过为变量分配新的键盘映射来“重置”键盘映射。 (setq paredit-mode-map …)将更改变量 paredit-mode-map ,它将 不是 更改 Paredit 模式使用的实际键盘映射。

此变量的绑定(bind)仅评估 一次定义时间 ,即在评估 define-minor-mode 期间.该宏内部调用 add-minor-mode , 并将 传递给此函数当前值键映射变量。该模式的所有 future 使用仅指此键盘映射。键映射变量是 再也不会由次要模式评估,因此更改其绑定(bind)没有任何效果。

如果要更改键盘映射,则必须重新绑定(bind)变量之前 define-minor-mode被评估,即在加载相应的库之前。在 eval-after-load 中更改它因此形式是完全无用的。

通常,在加载库之前更改 keymap 变量效果很好,因为大多数模式在 defvar 的正文中定义了 keymap。 . defvar但是,如果变量已经有值,则不会更改它的值。因此,如果变量已经有一个键映射,它将不会被触及。

但是,正如我所说,Paredit 不尊重这种模式,而是强行将其绑定(bind)添加到键映射。因此更改它是没有意义的,因为 Paredit 无论如何都会添加它的绑定(bind)。

正如我所说,您必须通过取消定义其每个键来手动清除现有的键盘映射。

TL;DR:使用 Smartparens,真的!它涵盖了 Paredit 的所有内容,它灵活、强大、可扩展,简而言之就是很好。它可以让你选择你想要的任何键绑定(bind)。

关于emacs - 为什么我不能更改 paredit 键绑定(bind),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16605571/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com