GNU Screen - 将默认的转义命令键更改为ALT-X?

30

在GNU Screen中,我想通过调整.screenrc文件将默认的命令绑定改为Alt-s,而不是默认的C-a。原因是我使用emacs,因此GNU Screen绑定了C-a键,将“C-a”发送给emacs变得很麻烦(正如@Nils所说,要发送“C-a”,我应该输入“C-a a”),在bash shell中也是如此,我可以将转义字符更改为C-,但其中一些已经映射到了emacs中,而其他组合键不像ALT-s那样容易。如果有人已经完成了ALT键映射,请告诉我。

7个回答

10

可以使用寄存器:bindkey命令来解决:escape命令的限制问题。只需将以下内容放入.screenrc文件中:

# reset escape key to the default
escape ^Aa

# auxiliary register
register S ^A

# Alt + x produces ^A and acts as an escape key
bindkey "^[x" process S

## Alt + space produces ^A and acts as an escape key
# bindkey "^[ " process S

请查看http://adb.cba.pl/gnu-screen-tips-page-my.html#howto-alt-key-as-escape


10

根据我对man screen的阅读,看起来 screen 可以用于命令绑定的唯一元字符是 CTRL

从我阅读man screen得出结论,screen似乎只能使用CTRL作为命令绑定的特殊字符:

   escape xy

   Set  the  command character to x and the character generating a literal
   command character (by triggering the "meta" command) to y (similar to
   the -e option).  Each argument is either a single character, a two-character
   sequence of the form "^x" (meaning "C-x"), a backslash followed by an octal
   number (specifying the ASCII code of the character),  or a backslash followed
   by a second character, such as "\^" or "\\".  The default is "^Aa".

如果在emacs中有一些映射你从不使用,即使它很不方便,比如 C-|,那么你可以使用终端输入管理器将ALT-X重新映射到它,让你使用ALT绑定,但这可能有点hackish。


谢谢。这有点棘手,也许有一种直接的方法来做到这一点。 - Siva
4
你无需使用Control键先行,即可按下Esc键。我使用“escape `~”来设置Esc键为“backtick”(不需要用到Control键)。但我认为你不能使用Alt键加其他键来模拟Esc键。 - silentbicycle
@silentbicyle 谢谢。是的,我知道我不必以 Control 为前缀,“escape `~” 对我不起作用。当我必须在 shell 上运行的任何程序中实际输入 ~ 时,我会变得很烦琐,这就是为什么我更喜欢 CTL/ALT 映射的原因。 - Siva
“escape”命令使用所谓的插入符号表示法。因此,您可以将^G用作控制字符的G。棘手的部分是,“escape”需要两个连接的参数:控制字符(默认为a)和元字符(默认为[)。 - audiodude

10
我也是Emacs和screen的用户。虽然我很少在终端中使用Emacs,因此也不会在screen会话中使用它,但是我不想放弃用于shell的C-a(它使用Emacs键绑定)。我的解决方案是使用C-j作为screen的前缀键,这是我愿意牺牲的。在Emacs编程模式下,它被绑定为(newline-and-indent),我也将其绑定到RET,所以我真的不会错过它。
顺便说一句:我知道这是一条建议而不是答案,但我觉得这仍然很有价值,值得发布。

8
为了让Alt+X成为命令的默认前缀并释放C-a键,需要在.screenrc文件中添加以下行:
escape ^||
bindkey "^[x" command

作为副作用,C-| 也将成为命令前缀。如果您还需要这些按键变得自由,请相应地修复“escape ^||”。

^[x 如何转换为 Alt-x,其中 ^ 表示 Ctrl(我不确定)?[ 是否表示 Alt?谢谢。 - Leo
如果你有一个“Alt Gr”键(例如在拉丁美洲键盘上),你可以将其作为第三级修饰符来输入一个很少使用的符号,并将其绑定为命令键。例如,在Ubuntu中,我使用我的LA键盘在.screenrc中绑定了“ð”作为命令键。因此,我使用“Alt Gr + d”(发送ð字符)作为我的命令键。 - ARX

7
屏幕没有任何简写语法来表示alt绑定,但是您可以直接给它八进制代码。例如,在我的机器上,Alt-x的十六进制代码是F8,或者370八进制,因此在我的screenrc中放置
escape \370x
将转义码更改为alt-X。
在Linux上使用screen 4.00.03测试并有效。
您可能需要更改转义码,因为我认为这可能取决于您的语言和代码集等因素:我发现我的转义码是通过输入以下内容找到的。
$ echo -n ^QM-x | perl -ne 'printf "%lo\n", ord($_)'

^Q是readline中的引用插入命令(它直接插入您键入的内容而不尝试解释它),而M-x是字面意义上的Alt-X。


我已经尝试过这个技巧,但对我来说没有起作用。有没有一种方法可以调试这个问题? - Siva
嗨Siva - 我认为最可能的区别是由于元键的终端编码造成的。我正在使用带有xterm termcap / terminfo设置的xterm;其他终端如kterm或gnome-terminal,或不同的TERM设置,可能使用不同的编码。我的回显技巧在你的机器上产生了什么结果? - Jack Lloyd

0

顺便说一句,这对我非常有效,因为^G是emacs中的“取消”序列。因此,如果你的肌肉记忆出现抽搐,你不会在emacs中弄乱任何东西。 - audiodude
5
我不太喜欢这个。在Emacs中,C-g是我最不想放弃的按键之一。 - Psyllo
将其更改为“escape ^`[”以使用反引号。在Emacs中,默认情况下未绑定C- `。 - Psyllo

0

我在我的.screenrc文件中已经有多年了:

escape ^Zz

这个对我来说现在已经成为了肌肉记忆。

不知怎么的,我最近不得不和别人的配置共享屏幕,结果现在总是不停地停止进程(bash ^Z)……真的很烦人……


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接