정의 키에 대한 혼란스러운 점(및 인수를 인용할 시기 문제)
문제
정의 키를 사용할 때 KEYMAP을 인용하면 안 되는 것 같습니다.
(define-key org-remember-mode-map "\C-c\C-r" 'org-remember-kill)
인용되지 않은 함수의 인수는 모두 평가되는 것 같은데 도움말에 따르면 정의 키는 매크로가 아닌 함수인 것 같아서 헷갈립니다.정의 키 호출 후 KEYMAP 값이 수정될 수 있는 이유를 알 수 없습니다.
(defun increment-value (a)
(setq a (+ 1 a)))
(setq my-num 10)
(increment-value my-num)
my-num ; ===> 10
업데이트:답변은 모든 것을 설명하지만 여전히 혼란스러운 분들을 위해 더 많은 예를 들어 설명하겠습니다.
위의 증분 값 예는 다음과 같습니다.
(let ((n 0))
(print n) ; prints 0
(let ((a n))
(setq a (+ 1 a))
(print a) ; prints 1
)
(print n) ; prints 0
)
위에서 일어나는 일은 내 생각에 이 지도 예제에서 일어나는 일과 유사합니다.
(let ((some-map '(1 2)))
(print some-map) ; prints (1 2)
(let ((a some-map))
(setq a (list 4 (second a)))
(print a) ; prints (4 2)
)
(print some-map) ; prints (1 2)
)
정의 키에서 진행되는 작업은 두 번째 some-map 예제와 유사합니다.
(let ((some-map '(1 2)))
(print some-map) ; prints (1 2)
(let ((a some-map))
(setcar a 4)
(print a) ; prints (4 2)
)
(print some-map) ; prints (4 2)
)
이제 이 세 가지 예를 염두에 두고 답을 다시 읽으면 답을 얻을 수 있을 것입니다.또한 읽어보세요 http://www.emacswiki.org/emacs/ListModification
해결책
당신은 실제로 무엇을 바꾸지 않습니다 'org-remember-map
(특정 목록 구조에 대한 포인터)는 실제 구조를 수정합니다. 읽다 이 정보 페이지 목록 수정에 대한 자세한 내용.
구체적으로, 당신이 'make-keymap
:
(Make-Keymap 및 선택적 문자열)
양식의 새로운 키 맵을 구성하고 반환합니다 (Keymap 차트 가능. Alist). 차트 가능은 수정자가없는 모든 문자의 바인딩을 보유하는 숯 테이블입니다. 그것의 모든 항목은 처음에 "명령을 정의하지 않은"것을 의미합니다. Alist는 기능 키, 마우스 이벤트 및 입력 스트림에 나타나는 다른 것들에 대한 바인딩을 보유하는 Assoc-List입니다. 처음에 Alist는 NIL입니다.
Keymap은 세 가지 요소가있는 목록이라는 것을 알 수 있습니다. 당신을 위해 그것을 그려 보겠습니다 (예 MX 아티스트 모드):
org-remember-map
|
|
v
+----+----+ +----+----+
| | | --+--->+ / | \ |
+-+--+----+ +-/--+--\-+
| | |
v v v
keymap CHARTABLE ALIST
그래서,의 가치 'org-remember-map
위의 구조와 같은 것이며 키를 정의 할 때, 당신이하고있는 일은 ALIST
구조의 블로브 부분.
다른 팁
당신은 혼란스러운 가치와 이름 값 매핑입니다.
증분 가치 기능에서는 변경되지 않습니다 a
이름의 매핑을 변경하는 것만 큼 많은 가치 a
새로운 가치로.
기본적으로 10의 값을 변경할 방법은 없습니다. 10은 10입니다!
그러나 첫 번째 경우 이름의 매핑을 수정할 수 있습니다. org-remember-mode-map
완전히 다른 맵 (새 값 설정)으로 바꾸다 지도는 해당 이름 (현재 값)을 가리 킵니다. 이것이 Define-Key가하는 일입니다.
삽화:
(setq a '(1 2)) -> (1 2)
(setcar a 4) -> 4
a -> (4 2)
당신이 쓴 모든 것은 완전히 정확합니다.당신이 놓치고 있는 것은 목록(키맵은 목록으로 표시됨)이 값 자체가 아니라 값의 컨테이너라는 것입니다.따라서 목록을 함수에 전달하고 해당 함수가 목록의 값을 변경하도록 할 수 있지만, 가지고 있는 목록은 여전히 동일한 목록입니다.
모든 세부 사항은 단점 셀 유형 elisp 매뉴얼의 섹션.