quelque chose de déroutant à propos de define-key (et la question de savoir quand citer un argument)
Question
Il semble qu'on ne soit pas censé citer KEYMAP lors de l'utilisation de define-key.
(define-key org-remember-mode-map "\C-c\C-r" 'org-remember-kill)
Je suis confus parce que je pense que tous les arguments d'une fonction non citée sont évalués et que, d'après l'aide, define-key est une fonction, pas une macro. Je ne vois pas pourquoi la valeur de KEYMAP peut être modifiée après un appel de define-key.
(defun increment-value (a)
(setq a (+ 1 a)))
(setq my-num 10)
(increment-value my-num)
my-num ; ===> 10
Mise à jour: les réponses expliquent tout, mais pour ceux qui sont encore confus, laissez-moi préciser avec plus d'exemples.
Mon exemple de valeur d'incrément ci-dessus est équivalent à ceci:
(let ((n 0))
(print n) ; prints 0
(let ((a n))
(setq a (+ 1 a))
(print a) ; prints 1
)
(print n) ; prints 0
)
Ce qui se passe ci-dessus est, je pense, similaire à ce qui se passe dans cet exemple de carte:
(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)
)
Ce qui se passe dans define-key est similaire à ce deuxième exemple de 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)
)
Maintenant, relisez les réponses en gardant à l’esprit ces trois exemples et vous l’obtiendrez. Lisez aussi http://www.emacswiki.org/emacs/ListModification
La solution
Vous ne changez pas ce qu'est 'org-remember-map
(un pointeur sur une structure de liste particulière), vous modifiez la structure réelle. Lisez cette page d'informations pour plus de détails sur la modification. listes.
Spécifiquement, si vous consultez la documentation de 'make-keymap
:
(make-keymap & amp; chaîne facultative)
Construire et retourner un nouveau keymap, de le formulaire (keymap CHARTABLE. ALIST). CHARTABLE est une table de caractères qui contient les reliures pour tous les personnages sans modificateurs. Toutes les entrées dedans sont initialement nil, ce qui signifie "commande non défini " ;. ALIST est une liste d'associations qui contient des liaisons pour la fonction touches, événements de souris et tout autre les choses qui apparaissent dans l'entrée courant. Au départ, ALIST est nul.
Vous verrez que le clavier est une liste de trois éléments. Laissez-moi vous le dessiner ( M-x mode artiste ):
org-remember-map
|
|
v
+----+----+ +----+----+
| | | --+--->+ / | \ |
+-+--+----+ +-/--+--\-+
| | |
v v v
keymap CHARTABLE ALIST
Ainsi, la valeur de 'org-Remember-Map
ressemble à la structure ci-dessus et lorsque vous définissez une clé, vous modifiez ce que pointe le ALIST
partie de la structure blob.
Autres conseils
vous confondez le mappage valeur / nom / valeur.
dans votre fonction increment-value, vous ne modifiez pas la valeur de a
au lieu de changer le mappage du nom a
sur une nouvelle valeur.
Fondamentalement, il n’existe aucun moyen de modifier la valeur de 10. 10 = 10!
Mais dans le premier cas, vous pouvez modifier le mappage du nom org-Remember-Mode-Map
sur un mappage totalement différent (définir une nouvelle valeur) ou bien modifier la carte désignée par ce nom (sa valeur actuelle). C'est ce que define-key fait.
Illustration:
(setq a '(1 2)) -> (1 2)
(setcar a 4) -> 4
a -> (4 2)
Tout ce que vous écrivez est complètement correct. Ce qui vous manque, c'est que les listes (les keymaps sont représentées sous forme de listes) ne sont pas des valeurs elles-mêmes, mais des conteneurs de valeurs. Ainsi, vous pouvez transmettre une liste à une fonction et demander à cette fonction de modifier les valeurs de la liste, mais cette liste est toujours la même.
Tous les détails figurent dans le inconvénients. Type de cellule du manuel elisp.