在使用定义键时,似乎不应该引用 KEYMAP。
(define-key org-remember-mode-map "\C-c\C-r" 'org-remember-kill)
我很困惑,因为我认为未引用的函数的所有参数都被评估,并且根据帮助,define-key 是一个函数,而不是一个宏。我不明白为什么在调用定义键后可以修改 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
)
我认为,上面发生的事情类似于这个 some-map 示例中发生的事情:
(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 中发生的事情类似于第二个 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