每次我使用emacs时,我都可以使用箭头键来移动光标。但是当我在屏幕上运行emacs时,我将emacs推送到后台(ctrl-Z)然后将其返回到前台,我的箭头键不再有效,例如。
M-[ a is undefined
当我在屏幕外运行emacs时,不会发生此行为。
有什么想法吗?这是一些屏幕设置吗?
答案 0 :(得分:29)
对于它的价值,这恰好发生在我身上,我能够通过断开屏幕然后重新连接来纠正它:
Ctrl+A, d
screen -R
答案 1 :(得分:24)
屏幕(以及几乎所有其他终端仿真器)模拟的vt100终端有两种模式,正常模式和应用模式。普通模式用于逐行应用程序和全屏应用程序的应用程序模式。模式之间的区别在于箭头键发送different control sequences(我不知道为什么):例如全屏模式下为ESC O A
,正常模式下为ESC [ A
。似乎当你按 Ctrl + Z 时,Emacs会将终端切换回正常模式,但当你将它返回到前台时,它不会切换到全屏再次模式,或屏幕没有正确响应Emacs的命令。
一种可能的解决方法是在.screenrc
的两种模式下bind the same character sequences,例如
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数据库中的错误或错误配置。如果你想调查一下,首先要提到你的操作系统,运行什么终端(模拟器)屏幕,你在哪里获得屏幕(或者你如何编译它,如果这就是你所做的)以及什么版本,同上Emacs,无论你是否在屏幕外观察到同样的问题,屏幕内的echo $TERM
和echo -E "$TERMCAP"
的输出。
答案 2 :(得分:3)
我的xterm窗口全屏,并且在屏幕上,这发生了。 我双击xterm边框以全屏显示。 Ctrl-z到后台emacs。然后fg把它带回来然后箭头键工作。我可以毫无问题地进入全屏。
我应该学习所有的emacs导航命令,但是我迁移到箭头键的旧习惯很难:/
答案 3 :(得分:2)
首先,将emacs推送到后台。
Ctrl+z
再次走在前列。
fg
答案 4 :(得分:1)
不是答案,但值得注意的是,在Ubuntu的终端或xterm上运行tmux上的GNU emacs时也会出现所描述的行为
快速解决方法是不在tmux中运行emacs。
版本
Emacs: 2014-06-06关于布朗尼的GNU Emacs 24.3.1(x86_64-pc-linux-gnu),由Debian修改)
tmux: 1.9
Ubuntu: 14.10
答案 5 :(得分:1)
我们在这里遇到同样的问题,我们发现的解决方法(但我们仍然需要找到问题的根源)是从emacs中手动设置“应用程序序列”:
*scratch*
缓冲区(send-string-to-terminal "\e[?1h")
M-x eval-buffer
和voilà。
此外,简单C-z
fg
可能已足够,输入速度更快
答案 6 :(得分:0)
这是一个解决方案,对我来说,一旦破坏就会破坏它(ubuntu 14.04,emacs 24.1)。如果不从屏幕上分离,请尝试以下操作:
1)Ctrl-z停止emacs。
2)启动另一个emacs:emacs -nw
3)在第二个emacs中按Ctrl-z,瞧!,第一个emacs将再次运行。 (然后我重新打开第二个emacs并关闭它Ctrl-x Ctrl-c)。