如果我使用以下 .emacs 文件,我就可以像我预期的那样使用 home/end 键转到当前行的开头/结尾。
(keyboard-translate ?\C-h ?\C-?)
(add-to-list 'load-path "/home/sam/programs/go/go/misc/emacs/" t)
(require 'go-mode-load)
(global-set-key [kp-home] 'beginning-of-line) ; [Home]
(global-set-key [home] 'beginning-of-line) ; [Home]
(global-set-key [kp-end] 'end-of-line) ; [End]
(global-set-key [end] 'end-of-line) ; [End]
但是,如果我打开屏幕会话,它就不会像这样运行(由于某种原因,[home] 键仍然会将我带到缓冲区的开头)。
这是我的 .screenrc 文件,如果有人能发现其中有什么奇怪的东西:
term xterm
defutf8 on
defflow off
startup_message off
# terminfo and termcap for nice 256 color terminal
# allow bold colors - necessary for some reason
attrcolor b ".I"
# tell screen how to set colors. AB = background, AF=foreground
termcapinfo xterm 'Co#256:AB=\E[48;5;%dm:AF=\E[38;5;%dm'
#use bash as the default login shell
defshell -bash
编辑:显然,使用 Mx describe-key(如 nschum 所建议的)表示,当我在 screen 中运行 emacs 时,按下键盘上的 home 键时会触发 [begin]。当我在 screen 之外运行 emacs 时,describe-key 会按预期引用 [home]。看起来“defutf8 on”是我 .screenrc 中唯一与键盘相关的条目 - 其中还有其他可能导致问题的内容吗?
答案1
当您在中运行程序时screen
,该screen
程序可以(并且将会)执行以下操作:
screen
有自己的终端描述。它会尝试将底层终端的按键序列映射(转换)到其中。- 转换未完成。作为解决方法,
screen
请查找以 开头的自定义终端描述screen.$TERM
。ncurses 提供了一些有用的描述。 screen
过滤掉(忽略)一些不符合其输入概念的键序列。
最有可能的是,你的问题属于第一种情况。如果你
infocmp xterm screen
(假设你使用最常建议的值TERM
,无论你是否是使用xterm
),你可能会注意到这样的几行:
kend: '\E[4~', '\EOF'.
khome: '\E[1~', '\EOH'.
最后一列是序列(\E
是逃脱字符),screen
当程序从 等处接收到中间列时,该字符将发送给您的程序xterm
。
问题.screenrc
是覆盖该$TERM
值至xterm
,令人困惑screen
:
term xterm
您可能认为转换已经完成,但测试表明并非如此。这类问题是为什么ncurses 提供了自定义条目。例如,此条目来自 ncurses 数据库的设置在我的计算机上生效.screenrc
(因为“xterm”的别名为“xterm-new”):
screen.xterm-xfree86|screen.xterm-new|screen customized for modern xterm,
bce@, bw,
invis@, kIC@, kNXT@, kPRV@, meml@, memu@,
sgr=%?%p9%t\E(0%e\E(B%;\E[0%?%p6%t;1%;%?%p2%t;4%;%?%p1%p3%|%t;7%;%?%p4%t;5%;%?%p5%t;2%;m,
E3@, use=screen+italics, use=screen+fkeys, use=xterm-new,
您可能会注意到use=screen+fkeys
。这实际上是说:继续使用screen
将要使用的键,因为这是最简单的解决方法。现在有一个微妙的问题:screen+fkeys
看起来像这样:
screen+fkeys|function-keys according to screen,
kend=\E[4~, kf1=\EOP, kf2=\EOQ, kf3=\EOR, kf4=\EOS, kfnd@,
khome=\E[1~, kslt@,
因为(在测试屏幕中),它发送的是这些键,而不是外部$TERM
终端描述中的键。内部$TERM
设置为xterm
,但screen
在将特殊键(例如 home/end)传送到您的会话时使用此中间条目。