4

在使用定义键时,似乎不应该引用 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

4

3 回答 3

2

您混淆了值和名称-值映射。

在您的增量值函数中,您不会a像将名称映射更改为a新值那样更改 's 值。

从根本上说,没有办法改变 10 的值。10 就是 10!

但是在第一种情况下,您可以将名称的映射修改为org-remember-mode-map完全不同的映射(设置新值),或者您可以更改该名称指向的映射(其当前值)。这就是定义键的作用。

插图:

(setq a '(1 2)) -> (1 2)
(setcar a 4) -> 4
a -> (4 2)
于 2009-10-28T12:58:16.140 回答
2

您实际上并没有改变什么'org-remember-map是(指向特定列表结构的指针),您正在修改实际结构。有关修改列表的详细信息,请阅读此信息页面

具体来说,如果您查看以下文档'make-keymap

(make-keymap &可选字符串)

构造并返回一个新的键盘映射,形式为 (keymap CHARTABLE . ALIST)。CHARTABLE 是一个字符表,它保存所有字符的绑定,而无需修饰符。其中的所有条目最初都是 nil,意思是“命令未定义”。ALIST 是一个关联列表,它包含功能键、鼠标事件和输入流中出现的任何其他内容的绑定。最初,ALIST 为零。

您会看到 keymap 是一个包含三个元素的列表。让我为你画出来(耶Mx 艺术家模式):

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

所以, 的值'org-remember-map类似于上面的结构,当你定义一个键时,你所做的就是改变ALIST结构的 blob 部分所指向的内容。

于 2009-10-28T13:04:35.787 回答
1

你写的一切都是完全正确的。您缺少的是列表(键映射表示为列表)本身不是值,而是值的容器。因此,您可以将列表传递给函数并让该函数更改列表的值,但您拥有的列表仍然是同一个列表。

所有细节都在 elisp 手册的Cons Cell Type部分。

于 2009-10-28T13:04:23.383 回答