Pergunta

Parece não é suposto Citação KEYMAP quando se usa definir-chave.

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

Estou confuso porque eu acho que todos os argumentos de uma função que não é citado são avaliados, e de acordo com a ajuda, definem-chave é uma função, não um macro. Eu não vejo por que o valor de KEYMAP podem ser modificados após uma chamada de definir-chave.

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

(setq my-num 10)

(increment-value my-num)

my-num ; ===> 10

Update:. As respostas explicar tudo, mas para aqueles que ainda estão confusos, deixe-me esclarecer com mais exemplos

Meu exemplo incremento de valor acima é equivalente a esta:

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

O que está acontecendo acima é, penso eu, à semelhança do que está acontecendo neste algum-map exemplo:

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

O que está acontecendo em definir-chave é semelhante a este exemplo segunda some-mapa:

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

Agora, leia as respostas novamente com estes três exemplos em mente e você vai buscá-la. Leia também http://www.emacswiki.org/emacs/ListModification

Foi útil?

Solução

Você não está realmente mudando o que 'org-remember-map é (um ponteiro para uma estrutura de lista particular), você está modificando a estrutura real. Leia esta página Informações para obter mais detalhes sobre a modificação listas.

specificially, se você der uma olhada na documentação para 'make-keymap:

(make-keymap & cadeia opcional)

Construção e retornar um novo mapa de teclado, de a forma (CHARTABLE mapa de teclas. ALIST). CHARTABLE é um char-tabela que mantém as ligações para todos os caracteres sem modificadores. Todas as entradas nele são inicialmente zero, comando que significa" undefined". ALIST é uma lista de assoc que detém ligações para função chaves, eventos de mouse e quaisquer outros coisas que aparecem na entrada corrente. Inicialmente, ALIST é nulo.

Você verá que keymap é uma lista com três elementos. Deixe-me tirar isso para você (yay M-x-mode artista ):

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

Assim, o valor do 'org-remember-map é algo como a estrutura acima, e quando você definir uma chave, o que você está fazendo é mudar o que é apontado na parte ALIST blob da estrutura.

Outras dicas

Você está confundindo mapeamento valor e nome-valor.

na sua função de incremento de valor, você não está mudando o valor da a tanto quanto mudando o mapeamento do nome a para um novo valor.

Fundamentalmente, não há nenhuma maneira de mudar o valor de 10. 10 é 10!

Mas no primeiro caso, você pode modificar o mapeamento do nome org-remember-mode-map a um mapa totalmente diferente (definir um novo valor), ou você pode alter do mapa apontado por esse nome (seu valor atual). Isto é o que define-chave faz.

Ilustração:

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

Tudo o que você escreve é ??completamente correto. A coisa que está faltando é que listas (keymaps são representados como listas) não são valores em si, mas os recipientes de valores. Assim, você pode passar uma lista para uma função e tem que a mudança de função dos valores da lista, mas a lista que você tem ainda a mesma lista.

Todos os detalhes estão no Contras seção Tipo de célula do manual elisp.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top