在 GNU Screen 中运行 emacs 会覆盖 FreeBSD 8.2 中 [home] 键绑定的 .emacs 设置

在 GNU Screen 中运行 emacs 会覆盖 FreeBSD 8.2 中 [home] 键绑定的 .emacs 设置

如果我使用以下 .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覆盖该$TERMxterm,令人困惑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)传送到您的会话时使用此中间条目。

相关内容