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
。-ingで探してみましclearfunsym
たが、不思議なことに何もありません (別の関係のないフックを除いて)。eval
pre-command-hook
(add-hook 'pre-command-hook clearfunsym)
関数定義の再評価とデバッグを試みたところ、が , のpre-command-hook
ままであることに気付き、nil
困惑しました。私はソース コードをさらに深く掘り下げていきます。この関数の独自のバージョンを書き直して、force-clear
後で呼び出すことができる関数を追加で作成するかもしれませんが、誰かがよりクリーンなソリューションを見つけることができるかもしれません。