문제

정의 키를 사용할 때 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 매뉴얼의 섹션.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top