emacs 24에서 set-temporary-overlay-map
은 활성화 된 키맵을 사용자가 해당 키맵에 정의되지 않은 키를 누르면 바로 비활성화합니다.임시 오버레이 맵을 수동으로 종료
오버레이 키맵을 수동으로 비활성화해야하지만이 작업을 수행하는 기능은 제공되지 않습니다.
- 는 함수
clearfun
, 모든 명령을하기 전에 실행하도록 정의 된 경우 확인하고 있습니다 : 나는 다음과 같이 현재 오버레이 키맵을 비활성화하는 메커니즘이 있음을 수집(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)))
: 나는 소스 코드에 살짝했습니다 이전에 호출 된 명령이 맵에있었습니다. 이지도에 아니었다면
- 은, 다음의 코드가 실행됩니다 :
(이유는 무엇입니까 제대로하지이 형식 좋아, 지금은 무엇입니까?) 내가 정말 이렇게
(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
같은 값을 결정하는 데 문제가 있습니다. eval
-ing pre-command-hook
에 의해 clearfunsym
을 찾으려고했으나 이상하게도 아무 것도 없습니다 (다른 관련없는 후크 제외).
나는 함수 정의를 다시 평가하고 에베 벅징을 시도했는데 (add-hook 'pre-command-hook clearfunsym)
이후에 pre-command-hook
이 여전히 nil
인 퍼즐을 썼다. 앞으로도 계속해서 소스 코드를 파헤쳐 보겠다. 나중에이 함수를 내 자신의 버전으로 다시 작성하여 나중에 호출 할 수있는 force-clear
함수를 추가로 작성하지만 누군가가 더 깨끗한 솔루션을 볼 수있다.
위대한 질문 (들). @Stefan (또는 누군가 다른 사람)의 흥미 있고 유익한 답변을 기대하십시오. 이것에 대해 더 많은 것을 배우기를 고대하고 있습니다. – Drew
고마워요, 드류, 내가 실망 스럽긴하지만, 필자는 이맥스/엘프와 관련된 모든 질문에 대답 할 수 있다고 생각했다. 이제이 문제로 돌아가겠습니다. 나중에 표준 버전을 개선 할 수 있을지는 모르겠지만, 나중에 사용할 수있는'강제력 '을 제공하는 함수를 다시 작성할 것입니다. – erjoalgo
"오버레이 키맵을 수동으로 비활성화해야합니다."라는 의미를 설명하십시오. – Stefan