Терминал vt100, который эмулирует Screen (и почти любой другой эмулятор терминала), имеет два режима: обычный режим и режим приложения.Обычный режим используется для построчных приложений и режим приложений для полноэкранных приложений.Среди различий между режимами в том, что клавиши со стрелками отправляют различные последовательности управления (я не знаю почему): например, ESC O A
в полноэкранном режиме и ESC [ A
в обычном режиме.Кажется, что когда вы нажимаете Ctrl + Z , Emacs переключает терминал обратно в обычный режим, но когда вы возвращаете его на передний план, он не переключается в полноэкранный режим снова, или Screen не реагирует на команды Emacs должным образом.
Один из возможных обходных путей - связывает одинаковые последовательности символов в обоих режимах в .screenrc
, например
bindkey -k ku stuff ^[OA
bindkey -k kd stuff ^[OB
bindkey -k kr stuff ^[OC
bindkey -k kl stuff ^[OD
Другой возможный обходной путь - заставить Emacs интерпретировать обе последовательности клавиш независимо от того, что говорит терминал.Хотя в принципе это плохая идея, поскольку некоторые терминалы могут использовать эти последовательности клавиш для разных ключей, я никогда не сталкивался с таким несовместимым терминалом, и я подозреваю, что ни один из них не был создан за последние 20 лет или более.
(define-key function-key-map "\eOA" [up])
(define-key function-key-map "\e[A" [up])
(define-key function-key-map "\eOB" [down])
(define-key function-key-map "\e[B" [down])
(define-key function-key-map "\eOC" [right])
(define-key function-key-map "\e[C" [right])
(define-key function-key-map "\eOD" [left])
(define-key function-key-map "\e[D" [left])
Истинное решение будет включать в себя поиск причины проблемы.Это может быть ошибка в Screen, ошибка в Emacs, ошибка в терминале (эмуляторе), в котором работает Screen, ошибка или неверная конфигурация в вашей базе данных termcap или terminfo.Если вы хотите исследовать это, начните с упоминания вашей операционной системы, в каком терминале (эмуляторе) работает Screen, где вы получили Screen (или как вы его скомпилировали, если это то, что вы сделали) и какую версию, то же самое дляEmacs, если вы наблюдали ту же проблему вне экрана, вывод echo $TERM
и echo -E "$TERMCAP"
внутри экрана.