关于 keymap 和 read-from-minibuffer 的问题

我定义了这样一个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 就是一个 carkeymap 的 列表,后面有一个 数组,是针对 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 里面生效呢?

read-from-minibuffer 有专门的keymap, 好像叫 minibuffer-local-key

很明显,minibuffer-local-keymap 里面没有 winum-select-window-0-or-10 这种东西。