在emacs 24中,set-temporary-overlay-map
激活一個鍵映射,只要用戶按下該鍵映射中未定義的鍵,該鍵映射就會失效。手動退出臨時覆蓋圖
我需要手動鈍化疊加鍵盤映射,但沒有提供特定的功能。我偷看到源代碼:
(defun set-temporary-overlay-map (map &optional keep-pred)
"Set MAP as a temporary keymap taking precedence over most other keymaps.
Note that this does NOT take precedence over the \"overriding\" maps
`overriding-terminal-local-map' and `overriding-local-map' (or the
`keymap' text property). Unlike those maps, if no match for a key is
found in MAP, the normal key lookup sequence then continues.
Normally, MAP is used only once. If the optional argument
KEEP-PRED is t, MAP stays active if a key from MAP is used.
KEEP-PRED can also be a function of no arguments: if it returns
non-nil then MAP stays active."
(let* ((clearfunsym (make-symbol "clear-temporary-overlay-map"))
(overlaysym (make-symbol "t"))
(alist (list (cons overlaysym map)))
(clearfun
;; FIXME: Use lexical-binding.
`(lambda()
(unless ,(cond ((null keep-pred) nil)
((eq t keep-pred)
`(eq this-command
(lookup-key ',map
(this-command-keys-vector))))
(t `(funcall ',keep-pred)))
(set ',overlaysym nil) ;Just in case.
(remove-hook 'pre-command-hook ',clearfunsym)
(setq emulation-mode-map-alists
(delq ',alist emulation-mode-map-alists))))))
(set overlaysym overlaysym)
(fset clearfunsym clearfun)
(add-hook 'pre-command-hook clearfunsym)
;; FIXME: That's the keymaps with highest precedence, except for
;; the `keymap' text-property ;-(
(push alist emulation-mode-map-alists)))
我推測,滅活當前覆蓋鍵盤映射的機制如下:
- 函數
clearfun
定義每個命令之前運行,檢查是否之前調用的命令在地圖中。 - 如果在地圖上沒有,下面的代碼被執行:
(爲什麼沒有這種格式正確好了,現在呢?)
(set ',overlaysym nil) ;Just in case.
(remove-hook 'pre-command-hook ',clearfunsym)
(setq emulation-mode-map-alists
(delq ',alist emulation-mode-map-alists))
因此,我真的想要使用適當的變量來執行上面的代碼。但是這個代碼是閉包的一部分,並且我在確定閉包內部的值如overlaysym
,clearfunsym
,alist
時遇到問題。我試着尋找clearfunsym
eval
-ing pre-command-hook
,但奇怪的是沒有任何東西(除了另一個無關的鉤子)。
我試着重新評估函數defintion和edebugging它,並且在(add-hook 'pre-command-hook clearfunsym)
,pre-command-hook
仍然是nil
之後我忘記了,這讓我很困惑。我將繼續深入研究源代碼,也許我會重寫自己的這個函數版本,以便生成force-clear
函數,稍後可以調用它,但也許有人可以看到更清晰的解決方案。
大問題(S)。期待來自@Stefan(或者其他人)的有趣和翔實的答案。期待更多地瞭解這一點,我自己。 – Drew
謝謝,德魯,雖然我很失望,因爲我認爲可以回答所有與emacs/elisp相關的問題。我現在要回到這個問題上來,我可能會重寫這個函數,給我一個我可以稍後使用的'force-clear',但我絕對認爲可以對標準版本進行一些改進。 – erjoalgo
請解釋你的意思是「我需要手動停用疊加鍵盤映射表」。 – Stefan