Frage

Es scheint, man ist nicht auf Zitat KEYMAP soll bei der Verwendung von define-Taste.

(define-key org-remember-mode-map "\C-c\C-r" 'org-remember-kill)

Ich bin verwirrt, weil ich, dass alle Argumente einer Funktion denken, die nicht zitiert werden ausgewertet, und nach Hilfe definieren-Taste ist eine Funktion, kein Makro. Ich sehe nicht, warum der Wert von KEYMAP kann nach einem Aufruf von define-Taste geändert werden.

(defun increment-value (a)
  (setq a (+ 1 a)))

(setq my-num 10)

(increment-value my-num)

my-num ; ===> 10

Update: Die Antworten alles erklären, aber für diejenigen, die noch verwirrt, lassen Sie mich mit mehr Beispielen deutlich nach oben

.

Mein Erhöhungs-Wert obiges Beispiel entspricht dies:

(let ((n 0))
  (print n) ; prints 0
  (let ((a n))
    (setq a (+ 1 a))
    (print a) ; prints 1
    )
  (print n) ; prints 0
  )

Was ist los oben ist, glaube ich, ähnlich dem, was in diesem some-Karte Beispiel vor sich geht:

(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)
  )

Was ist los in define-Schlüssel ist, um diese zweite ähnliche some-Karte Beispiel:

(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)
  )

Nun, die Antworten wieder mit diesen drei Beispielen vor Augen gelesen und Sie werden es bekommen. Lesen Sie auch http://www.emacswiki.org/emacs/ListModification

War es hilfreich?

Lösung

Sie sind nicht wirklich zu ändern, was 'org-remember-map ist (ein Zeiger auf eine bestimmte Listenstruktur), modifizieren Sie die aktuelle Struktur. Lesen Sie dieser Informationsseite Einzelheiten zum Modifizieren Listen.

Specificially, wenn Sie einen Blick in die Dokumentation für 'make-keymap:

  

(make-keymap & optional string)

     

Konstruieren und eine neue keymap Rückkehr von   die Form (keymap Chartable. ALIST).   Chartable ist ein char-Tabelle, die hält   die Bindungen für alle Charaktere   ohne Modifikatoren. Alle Einträge in es   anfänglich Null ist, was bedeutet, „Befehl   undefined“. ALIST ist eine Assoc-Liste   die gilt Bindungen für Funktions   Tasten, Mausereignisse, und andere   Dinge, die in der Eingabe erscheinen   Strom. Zunächst ALIST ist gleich Null.

Sie werden sehen, dass keymap eine Liste mit drei Elementen ist. Lassen Sie mich das für Sie zeichnen (yay M-x Künstler-Modus ):

 org-remember-map
    |
    |
    v
 +----+----+    +----+----+
 | |  |  --+--->+  / | \  |
 +-+--+----+    +-/--+--\-+
   |              |     |
   v              v     v
keymap      CHARTABLE  ALIST

So ist der Wert des 'org-remember-map so etwas wie die obige Struktur, und wenn Sie eine Taste definieren, was Sie tun, verändert sich, was im ALIST blob Teil der Struktur gerichtet ist.

Andere Tipps

Sie verwirrend Wert und Name-Wert-Zuordnung.

in Ihr Erhöhungs-Wert-Funktion, die Sie nicht a Wert so viel wie die Änderung der Zuordnung des Namens a auf einen neuen Wert zu ändern.

Im Grunde gibt es keinen Weg 10 den Wert von 10. 10 ist zu ändern!

Aber im ersten Fall können Sie entweder die Zuordnung des Namens org-remember-mode-map in eine vollständig andere Karte ändern (einen neuen Wert), oder Sie können ändern die unter diesem Namen hingewiesen Karte (seine aktueller Wert). Dies ist, was definieren-Taste tut.

Abbildung:

(setq a '(1 2)) -> (1 2)
(setcar a 4) -> 4
a -> (4 2)

Alles, was Sie schreiben, ist völlig richtig. Das, was Sie fehlt, ist, dass die Listen (keymaps als Listen dargestellt sind) sind selbst keine Werte, sondern Container von Werten. So können Sie eine Liste an eine Funktion und haben die Funktion, die Werte der Liste ändern, aber die Liste, die Sie haben, ist immer noch die gleiche Liste.

Alle sind die Details in den Cons Zellart Abschnitt des elisp Handbuch.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top