MS- <left>не обработан, как ожидалось - PullRequest
0 голосов
/ 08 февраля 2019

Когда я запускаю новый 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>.

Что здесь происходит?Это проблема конфигурации, или это предполагаемое поведение, или задействованы какие-то другие комбинации клавиш, которые прозрачно добавляют еще один слой переназначения?

1 Ответ

0 голосов
/ 08 февраля 2019

Это особенность.

Mx elisp-index-search RET shift-translation говорит:

Если входной символ верхний-case (или имеет модификатор shift) и не имеет привязки клавиш, но его эквивалент в нижнем регистре имеет единицу, затем read-key-sequence преобразует символ в нижний регистр.Обратите внимание, что «ключ поиска» не выполняет преобразование регистра таким способом.

Когда чтение ввода приводит к такому «сдвигу-переводу», Emacs устанавливает переменную «this-command-keys-shift-translation»к ненулевому значению.Программы на Лиспе могут исследовать эту переменную, если им нужно изменить свое поведение при вызове с помощью клавиш с переводом смещения.Например, функция 'handle-shift-selection' проверяет значение этой переменной, чтобы определить, как активировать или деактивировать регион (* note handle-shift-selection: The Mark.).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...