すべてのキーバインドをロードせずに、paredit の関数をいくつか使用しようとしています。paredit.el を見てみると、キーマップが paredit-mode-map しかなかったので、これを試してみました。
(setq paredit-mode-map (make-sparse-keymap))
(define-key paredit-mode-map (kbd "<C-M-left>") 'paredit-backward)
キーバインドは変更されませんでしたが (Ch 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 でキーバインドがどのように機能するかをもっと理解したいと思いました。