我定义了这样一个keymap:
(defvar teco:command-keymap
(let ((map (list
'keymap (make-vector 128 'teco:command-self-insert)
'(escape . teco:command-escape) ; Avoid Evil issue.
)))
(define-key map "\^c" 'teco:command-quit)
(define-key map "\^g" 'teco:command-quit)
(define-key map "\^l" 'teco:command-ctrl-l)
(define-key map "\^m" 'teco:command-return)
(define-key map "\^u" 'teco:command-ctrl-u)
;; (define-key map "\e" 'teco:command-escape)
(define-key map "\^?" 'teco:command-delete)
(define-key map "?" 'teco:command-query)
(define-key map "/" 'teco:command-slash)
(define-key map "*" 'teco:command-star)
map)
"Keymap used while reading teco commands.")
目的是为了实现一个类似 evil-ex 的东西:
(read-from-minibuffer teco:prompt nil teco:command-keymap)
一个 keymap 就是一个 car
为 keymap
的 列表,后面有一个 数组,是针对 ASCII 码输入的对应键绑定,以及一串由 (KEY . DEF)
组成的 cons cell。
之前我用 (define-key map "\e" 'teco:command-escape)
来为 ESC 添加键绑定,在没有加载其它配置的 Emacs 中 ESC 能正常使用,但是在 Spacemacs 中按下 ESC 则会变成这样:
似乎 Spacemacs 设置了一些额外的 Meta 开头的按键,导致我的 ESC 被覆盖。我看了 evil-ex 的实现,发现它的 keymap 里面有一个 (escape . xxxx)
,就拿来试试,也就是开头那段代码。在图形界面 Spacemacs 下能正常工作。
但是问题没用完全解决,在终端里面还是被覆盖。
目前我有2个疑问:
-
read-from-minibuffer
对于那些没用被所使用的 keymap 定义的按键是怎么处理的? -
Spacemacs 里面那几个 Meta 开头的键并不在
global-keymap
里,那么是在哪里定义,以至于会在 minibuffer 里面生效呢?