quelque chose de déroutant à propos de define-key (et la question de savoir quand citer un argument)

StackOverflow https://stackoverflow.com/questions/1636336

  •  06-07-2019
  •  | 
  •  

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

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top