2009-10-28 1 views
4

define-key를 사용할 때 KEYMAP을 인용하지 않는 것으로 보입니다.define-key (그리고 인수를 인용 할 때의 문제)에 대해 혼란스러운 내용이 있습니다.

(define-key org-remember-mode-map "\C-c\C-r" 'org-remember-kill) 

은 내가 인용되지 않은 함수의 모든 인수가 평가되는 것으로 생각하기 때문에 혼란 스러워요, 그리고 도움에 따라 정의 키는 함수가 아니라 매크로입니다. 나는 왜 KEYMAP의 값이 define-key의 호출 후에 수정 될 수 있는지 알지 못한다.

(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) 
) 

define-key의 내용은 두 번째 일부지도 예제와 비슷합니다.

(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) 
) 

이제 ans 이 세 가지 예를 염두에두고 다시 생각해 보면 당신은 그것을 얻을 것입니다. 또한 http://www.emacswiki.org/emacs/ListModification

답변

2

실제로는 'org-remember-map (특정 목록 구조에 대한 포인터)을 변경하지 않고 실제 구조를 수정하고 있습니다. 목록 수정에 대한 자세한 내용은 this info page을 참조하십시오.

Specificially, 당신은 'make-keymap에 대한 문서 봐 걸릴 경우 :

(메이크업 키맵 & 선택적 문자열)

구축 및 의 양식 (키맵 CHARTABLE를 새로운 키 맵을 반환합니다. 목록). CHARTABLE은 수정자를 사용하지 않고 모든 문자 에 대해 바인딩을 저장하는 문자표입니다. 의 모든 항목은 처음에는 nil이며 " 명령이 정의되지 않음"을 의미합니다. ALIST는 키, 마우스 이벤트 및 입력 스트림에 나타나는 다른 항목에 대한 바인딩을 보유하는 연관 목록 입니다. 처음에는 ALIST가 없습니다.

키맵은 세 가지 요소로 구성된 목록입니다. 내가 당신을 위해 그려 보자 (야호 M-x artist-mode) :

org-remember-map 
    | 
    | 
    v 
+----+----+ +----+----+ 
| | | --+--->+/| \ | 
+-+--+----+ +-/--+--\-+ 
    |    |  | 
    v    v  v 
keymap  CHARTABLE ALIST 

그래서, 'org-remember-map의 값이 상기 구조 같은 것을, 그리고 당신이 키를 정의 할 때, 당신이 가리키는 어떤 변화 뭐하는거야 ALIST 구조의 얼룩 부분.

2

값과 이름 - 값 매핑을 혼동스럽게 생각합니다.

을 증분 값 함수로 변경하면 a의 값이 a의 매핑을 새 값으로 변경하는만큼 변경되지 않습니다.

기본적으로 10의 값을 변경할 방법이 없습니다. 10은 10입니다!

그러나 첫 번째 경우에

, 당신은 (새로운 값을 설정) 완전히 다른 맵에 이름 org-remember-mode-map의 매핑을 수정하실 수 있습니다, 또는 당신은 그 이름 (현재 값)가 가리키는지도를 변경할 수 있습니다. 이것은 define-key가하는 것입니다.

그림 : 당신이 쓰는

(setq a '(1 2)) -> (1 2) 
(setcar a 4) -> 4 
a -> (4 2) 
1

모든 것이 완벽하게 맞습니다. 당신이 놓치고있는 것은리스트 (키맵은리스트로 표현된다)는 값 그 자체가 아니라 값의 컨테이너라는 것이다. 따라서 함수에 목록을 전달하고 해당 함수가 목록의 값을 변경하도록 할 수 있지만 보유한 목록은 여전히 ​​동일한 목록입니다.

자세한 내용은 elisp 매뉴얼의 Cons Cell Type 부분을 참조하십시오.

관련 문제