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

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top