Когда я запускаю новый emacs в терминале, например, так:
emacs -nw -Q
Я могу попытаться проверить, к чему привязан определенный ярлык, набрав Ch k .Когда я делаю это для ярлыка MS- в буфере *scratch*
сразу после запуска Emacs, я получаю:
запускает команду left-word (находится в global-map), которая представляет собой интерактивную скомпилированную функцию Lisp в 'bindings.el'.
Она связана с,.
[...]
Обратите внимание на отсутствие модификатора «Shift» в распознанной последовательности клавиш.
Теперь первым инстинктом будет то, чтотерминал (gnome-терминал в моем случае) не выдает правильную escape-последовательность, но он делает: набрав CTRL-V ALT-SHIFT-left в терминале (то есть не в Emacs), выдает
^[[1;4D
и ввод Cq CS- внутри Emacs вставляет то же самое в текущий буфер.(Обратите внимание, что ^[
- это один символ, а именно ASCII 27 («Escape»).)
Проверка input-decode-map
показывает следующее значение (некоторые части опущены (помечены как ...
) для краткости):
(keymap
(27 keymap ... )
keymap
(keymap
(27 keymap
...
(91 keymap
...
(51 keymap
...
(59 keymap
(51 keymap
...
(68 .
[M-left])
(52 keymap
...
(68 .
[M-S-left])
...)
...)
...)
...))))
Проверка двух последовательностей клавиш с помощью следующего кода дает ожидаемые результаты:
(mapc '(lambda (c) (insert (format "%c" c))) '(27 91 49 59 51 68)) ; ^[[1;3D
(mapc '(lambda (c) (insert (format "%c" c))) '(27 91 49 59 52 68)) ; ^[[1;4D
Однако я не понимаю, почему эти последовательности встроены во второй уровеньвнутренний (keymap ...)
список?!
Становится страннее.
Назад в *scratch*
, когда я набираю
M-x local-set-key
, а затем MS- , он распознается правильно, так как следующая подсказка в минибуфере показывает:
Set key <M-S-left> locally to command:
Если я продолжу и предоставлю случайную функцию, скажем, beginning-of-line
, последующий вызов Ch k , за которым следует MS- , тогда действительно дает:
запускает команду начало строки (находится в lisp-взаимодействии-режиме-карте), которая является интерактивной встроенной функцией в «исходном коде C».
Она привязана к.
[...]
Локальная установка MS- на nil
восстановит исходное поведение, при котором Ch k сообщает MS- как <M-left>
.
Что здесь происходит?Это проблема конфигурации, или это предполагаемое поведение, или задействованы какие-то другие комбинации клавиш, которые прозрачно добавляют еще один слой переназначения?