что-то сбивает с толку в ключе определения (и в вопросе, когда цитировать аргумент)
Вопрос
Кажется, при использовании ключа определения не следует указывать KEYMAP в кавычки.
(define-key org-remember-mode-map "\C-c\C-r" 'org-remember-kill)
Я в замешательстве, потому что думаю, что оцениваются все аргументы функции, не заключенной в кавычки, и, согласно справке, define-key - это функция, а не макрос.Я не понимаю, почему значение 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, похоже на второй пример 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 & amp; необязательная строка)
Создайте и верните новую раскладку из форма (таблица ключей CHARTABLE. ALIST). CHARTABLE - таблица символов, которая содержит привязки для всех персонажей без модификаторов. Все записи в нем изначально равны нулю, что означает "команда" не определено & Quot ;. ALIST является ассоциативным списком который содержит привязки для функции ключи, события мыши и любые другие вещи, которые появляются на входе поток. Изначально ALIST равен нулю.
Вы увидите, что раскладка ключей представляет собой список из трех элементов. Позвольте мне нарисовать это для вас (ура M-x Artist-Mode ):
org-remember-map
|
|
v
+----+----+ +----+----+
| | | --+--->+ / | \ |
+-+--+----+ +-/--+--\-+
| | |
v v v
keymap CHARTABLE ALIST
Итак, значение 'org-Remember-Map
похоже на приведенную выше структуру, и когда вы определяете ключ, вы делаете то, на что вы указываете в ALIST
часть структуры BLOB-объекта.
Другие советы
вы путаете значение и сопоставление имени и значения.
в вашей функции приращения значения вы не меняете a
значение так же, как и изменение отображения имени a
к новому значению.
По сути, изменить значение 10 невозможно.10 это 10!
Но в первом случае вы можете либо изменить отображение имени org-remember-mode-map
на совершенно другую карту (установите новое значение), или вы можете изменить карта, на которую указывает это имя (ее текущее значение).Это то, что делает ключ определения.
Иллюстрация:
(setq a '(1 2)) -> (1 2)
(setcar a 4) -> 4
a -> (4 2)
Все, что ты пишешь, совершенно правильно. Вам не хватает того, что списки (таблицы ключей представлены в виде списков) - это не сами значения, а контейнеры значений. Таким образом, вы можете передать список функции и заставить эту функцию изменять значения списка, но список, который у вас есть, остается тем же списком.
Все подробности в минусах. Тип ячейки в разделе руководства elisp.