qualcosa di confuso su define-key (e il problema di quando citare un argomento)
Domanda
Sembra che non si debba citare KEYMAP quando si usa define-key.
(define-key org-remember-mode-map "\C-c\C-r" 'org-remember-kill)
Sono confuso perché penso che tutti gli argomenti di una funzione non quotata vengano valutati e, in base alla guida, define-key è una funzione, non una macro. Non vedo perché il valore di KEYMAP possa essere modificato dopo una chiamata a define-key.
(defun increment-value (a)
(setq a (+ 1 a)))
(setq my-num 10)
(increment-value my-num)
my-num ; ===> 10
Aggiornamento: le risposte spiegano tutto, ma per quelli ancora confusi, vorrei chiarire con altri esempi.
Il mio esempio di valore di incremento sopra è equivalente a questo:
(let ((n 0))
(print n) ; prints 0
(let ((a n))
(setq a (+ 1 a))
(print a) ; prints 1
)
(print n) ; prints 0
)
Quello che sta succedendo sopra è, penso, simile a quello che sta succedendo in questo esempio di alcune mappe:
(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)
)
Quello che sta succedendo in define-key è simile a questo secondo esempio di alcune mappe:
(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)
)
Ora leggi di nuovo le risposte con questi tre esempi in mente e lo otterrai. Leggi anche http://www.emacswiki.org/emacs/ListModification
Soluzione
In realtà non stai cambiando cosa sia 'org-remember-map
(un puntatore a una particolare struttura di elenco), stai modificando la struttura effettiva. Leggi questa pagina di informazioni per dettagli sulla modifica liste.
In particolare, se dai un'occhiata alla documentazione per 'make-keymap
:
(make-keymap & amp; stringa opzionale)
Costruisci e restituisci una nuova keymap, di il modulo (keymap CHARTABLE. ALIST). CHARTABLE è un char-table che contiene le associazioni per tutti i personaggi senza modificatori. Tutte le voci in esso sono inizialmente nulli, il che significa "comando" undefined " ;. ALIST è un elenco assoc che contiene collegamenti per la funzione tasti, eventi del mouse e qualsiasi altro cose che compaiono nell'input ruscello. Inizialmente, ALIST è zero.
Vedrai che la keymap è un elenco con tre elementi. Lascia che lo disegni per te (yay M-x artist-mode ):
org-remember-map
|
|
v
+----+----+ +----+----+
| | | --+--->+ / | \ |
+-+--+----+ +-/--+--\-+
| | |
v v v
keymap CHARTABLE ALIST
Quindi, il valore del 'org-remember-map
è qualcosa come la struttura sopra, e quando definisci una chiave, quello che stai facendo sta cambiando ciò che è indicato nel ALIST
blob parte della struttura.
Altri suggerimenti
stai confondendo valore e mappatura nome-valore.
nella funzione del valore di incremento, non stai cambiando il valore di a
tanto quanto cambiando la mappatura del nome a
in un nuovo valore.
Fondamentalmente, non c'è modo di cambiare il valore di 10. 10 è 10!
Ma nel primo caso, puoi modificare la mappatura del nome org-remember-mode-map
su una mappa completamente diversa (impostare un nuovo valore), oppure puoi alterare la mappa indicata da quel nome (il suo valore attuale). Questo è ciò che fa define-key.
Illustrazione:
(setq a '(1 2)) -> (1 2)
(setcar a 4) -> 4
a -> (4 2)
Tutto ciò che scrivi è completamente corretto. Quello che ti manca è che gli elenchi (le keymap sono rappresentate come elenchi) non sono valori stessi, ma contenitori di valori. Pertanto, puoi passare un elenco a una funzione e fare in modo che tale funzione cambi i valori dell'elenco, ma l'elenco che hai è sempre lo stesso elenco.
Tutti i dettagli sono nei Contro Tipo di cella del manuale elisp.