"屏幕"以某种方式在^ Z之后取消映射emacs中的箭头键

Aar*_* Fi 24 emacs gnu-screen

每次我使用emacs时,我都可以使用箭头键来移动光标.但是当我在屏幕上运行emacs时,我将emacs推送到后台(ctrl-Z)然后将其返回到前台,我的箭头键不再有效,例如

M-[ a is undefined
Run Code Online (Sandbox Code Playgroud)

当我在屏幕外运行emacs时,不会发生此行为.

有任何想法吗?这是一些屏幕设置吗?

小智 29

对于它的价值,这恰好发生在我身上,我能够通过断开屏幕然后重新连接来纠正它:

Ctrl+A, d

screen -R
Run Code Online (Sandbox Code Playgroud)


Gil*_*il' 24

屏幕(以及几乎所有其他终端仿真器)模拟的vt100终端有两种模式,正常模式和应用模式.普通模式用于逐行应用程序和全屏应用程序的应用程序模式.模式之间的差异在于箭头键发送不同的控制序列(我不知道为什么):例如ESC O A在全屏模式和ESC [ A正常模式下.看起来当你按Ctrl+时Z,Emacs会将终端切换回正常模式,但是当你将它返回到前台时,它不会再次切换到全屏模式,或者屏幕不能正确响应Emacs的命令.

一种可能的解决方法是在您的两种模式中绑定相同的字符序列.screenrc,例如

bindkey -k ku stuff ^[OA
bindkey -k kd stuff ^[OB
bindkey -k kr stuff ^[OC
bindkey -k kl stuff ^[OD
Run Code Online (Sandbox Code Playgroud)

另一种可能的解决方法是告诉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])
Run Code Online (Sandbox Code Playgroud)

真正的解决方案将涉及找出导致问题的原因.它可能是Screen中的错误,Emacs中的错误,Screen运行的终端(模拟器)中的错误,termcap或terminfo数据库中的错误或错误配置.如果你想调查一下,首先要提到你的操作系统,运行什么终端(模拟器)屏幕,你在哪里获得屏幕(或者你如何编译它,如果这就是你所做的)以及什么版本,同上Emacs,无论你是否在屏幕外观察到同样的问题,屏幕内部echo $TERMecho -E "$TERMCAP"内部的输出.