Что не так со следующим скриптом unbind? - PullRequest
4 голосов
/ 26 сентября 2011
(dolist (abcc '("C-a" "C-b"))
  (global-unset-key (kbd abcc)))

Продолжает выдавать ошибку:

Debugger entered--Lisp error: (wrong-type-argument integer-or-marker-p abcc)
  read-kbd-macro(abcc)
  #[(keys) "\301!\207" [keys read-kbd-macro] 2 2180088](abcc)
  (kbd abcc)
  (global-unset-key (kbd abcc))
  (while --dolist-tail-- (setq abcc (car --dolist-tail--)) (global-unset-key (kbd abcc)) (setq --dolist-tail-- (cdr --dolist-tail--)))
  (let ((--dolist-tail-- ...) abcc) (while --dolist-tail-- (setq abcc ...) (global-unset-key ...) (setq --dolist-tail-- ...)))
  (dolist (abcc (quote ...)) (global-unset-key (kbd abcc)))
  eval-buffer(#<buffer  *load*> nil "/home/name/.emacs" nil t)  ; Reading at buffer position 63
  load-with-code-conversion("/home/name/.emacs" "/home/name/.emacs" t t)
  load("~/.emacs" t t)
  #[nil "\205\264

Ответы [ 3 ]

6 голосов
/ 26 сентября 2011

Сначала я думал, что это ошибка в Emacs.Я был очень удивлен, что никто не сталкивался с этим раньше.

Вот обходной путь, который вы можете использовать:

(dolist (abcc '("C-a" "C-b"))
  (global-unset-key (read-kbd-macro abcc)))

Что происходит, когда kbd - это макрос, который оборачивает функцию, однако это не такоцените его параметр явно.Таким образом, символ abcc передается прямо в функцию.

Немного подумав (и прочитав документы).Это на самом деле ошибка пользователя.

Строка документа для kbd четко указывает, что она должна использоваться для строковых констант.

Так что kbd следует использовать, когда требуется только внутренний ключпредставление появиться в скомпилированном байт-коде.например,

(define-key foo-mode-map (kbd "C-a") 'foo)

Но read-kbd-macro следует использовать, когда вы хотите, чтобы аргумент был оценен.

1 голос
/ 26 сентября 2011

(keys) - это макрос, который просто проходит до (read-kbd-macro). Первый также почему-то ошибается, а второй нет. Попробуйте вместо этого?

0 голосов
/ 26 сентября 2011

kbd - макрос, поэтому он не оценивает свой аргумент.

...