我尝试使用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检查),但是变量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- it是一个用于查找的变量。我确信有更优雅的方法来更改键绑定,但我想更多地了解键绑定在emacs中是如何工作的。
发布于 2013-05-18 00:42:27
Paredit使用一种不同的方式定义快捷键映射。虽然大多数次要模式在变量定义中定义键映射,但Paredit在顶级上调用paredit-define-keys,从而强制初始化键映射。
换句话说,您不能阻止Paredit设置其绑定。您需要使用(define-key paredit-mode-map … nil)删除快捷键映射中的所有快捷键绑定,以消除这些快捷键绑定。
编辑:您不能通过将新的键映射赋给变量来“重置”键映像。(setq paredit-mode-map …)会改变变量paredit-mode-map,它不会改变Paredit模式使用的实际键值映射。
此变量的绑定仅在定义时一次(即,在评估define-minor-mode期间)评估一次。此宏在内部调用add-minor-mode,并将变量的当前值传递给此函数。该模式未来的所有使用仅指此快捷键映射。keymap变量是由minor模式计算的never ,因此更改它的绑定没有任何影响。
如果您想要更改快捷键映射,则必须在计算 define-minor-mode之前重新绑定变量,即在加载相应的库之前。因此,在eval-after-load表单中更改它是完全无用的。
通常,在加载库之前更改快捷键映射变量效果很好,因为大多数模式在defvar主体中定义快捷键映射。但是,如果变量已有值,则defvar不会更改该变量的值。因此,如果变量已经有了一个键映射,它就不会被触动。
但是,正如我所说的,Paredit并不尊重这种模式,而是强制将其绑定添加到键映射中。因此,更改它是没有意义的,因为Paredit无论如何都会添加它的绑定。
正如我所说的,您必须通过取消定义每个键来手动清除现有的键映射。
TL;DR:使用Smartparens,真的!它涵盖了Paredit的所有内容,它灵活、强大、可扩展,简而言之,它很好。它可以让你选择你想要的任何键绑定。
发布于 2013-05-18 12:06:39
先读一下lunaryorn的答案。这只是一个澄清。
你的代码到底出了什么问题?
(setq paredit-mode-map (make-sparse-keymap))这将不适用于任何已加载的模式。paredit并不特别。
Paredit对defvar的不尊重确实意味着很难像您希望的那样解除所有密钥的绑定。
发布于 2013-06-13 22:14:55
为什么你不创建自己的次要模式呢?Paredit模式所做的一切就是提供键绑定,所以如果您使用它的键映射,它对您没有任何帮助。无论是否使用paredit模式,Paredit命令都可用。(没有人“强迫”你绑定密钥!)
(defvar snowape-mode-map (make-sparse-keymap))
(define-minor-mode snowape-mode
"Minor mode for snowape's favorite pareditoid key bindings.
\\<snowape-mode-map>"
:lighter " Snowape")
(define-key snowape-mode-map (kbd "C-M-<left>") 'paredit-backward)
...或者,您可以只在您最喜欢的模式钩子中使用local-set-key:
(add-hook 'lisp-mode-hook
(defun lisp-mode-snowape-setup ()
(local-set-key (kbd "C-M-<left>") 'paredit-backward)))https://stackoverflow.com/questions/16605571
复制相似问题