Home/End键在tmux中不起作用

Ben*_*vis 48 linux bash tmux

我目前正在使用tmux和xterm-256color $ TERM变量.当在tmux下的bash中时,按home/end会插入波形符(〜).在tmux之外,home/end键工作正常.

使用cat和tput,我可以看到生成序列和预期序列之间存在不匹配:

$ cat -v # pressing home, then end
^[[1~^[[4~
$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我决定将以下内容添加到我的.bashrc中:

if [[ -n "$TMUX" ]]; then
    bind '"\e[1~":"\eOH"'
    bind '"\e[4~":"\eOF"'
fi
Run Code Online (Sandbox Code Playgroud)

这解决了bash的问题,但是在其他readline程序中,例如在诸如ipython之类的REPL中,它仍然为home/end插入了代字号.

为什么这首先是一个问题呢?当我在tmux内部与外部时,为什么生成的序列不同?如何解决这个问题,以免在任何程序中出现问题?

Ben*_*vis 43

似乎主要问题是使用xterm-256color作为$ TERM.我将$ TERM切换到屏幕256色,问题就消失了.

  • 编辑`〜/ .tmux.conf`并添加一行`set -g default-terminal"screen-256color"` (5认同)
  • 这个答案也适用于GNU Screen的相同问题.我刚刚在我的〜/ .screenrc中添加了`term"screen-256color"` (2认同)
  • 我不得不终止tmux会话,并关闭终端,然后再次启动所有操作以使其生效。 (2认同)

小智 30

在tmux 2.0中,您可以在以下内容中添加以下两行.tmux.conf:

bind -n End send-key C-e
bind -n Home send-key C-a
Run Code Online (Sandbox Code Playgroud)

  • 这只适用于readline(和Emacs),并会在其他地方产生意想不到的后果. (3认同)
  • 是的,vim并不关心这一点. (2认同)

小智 10

如果你想在tmux中使用xterm-256color出于某种原因 - 使用带有inputrc的arch解决方案.我在tmux中测试了它与rxvt,ruby irb,python,lua和home/end键都可以.可能每个readline应用程序都可以.


som*_*one 7

在我的情况下,tmux 中的 zsh 有问题(tmux 中的 bash 没问题)。这里的其他答案都不适合我。

但是添加这个来.zshrc修复它:

bindkey "\E[1~" beginning-of-line
bindkey "\E[4~" end-of-line
Run Code Online (Sandbox Code Playgroud)

除此之外,我还有:

bindkey "\E[H" beginning-of-line
bindkey "\E[F" end-of-line
bindkey "\E[3~" delete-char
Run Code Online (Sandbox Code Playgroud)

  • 我做了类似的事情,因为实际上这与我的情况下的 tmux 无关,只是写下来以防对其他人有帮助:``bindkey "^[OF" end-of-line`` 和 ``bindkey "^ [OH" 行首`` (2认同)

And*_*ang 6

来自tmux 常见问题解答

请注意:大多数显示问题都是由于错误的术语造成的!在报告问题之前,请确保 tmux 内部和外部的 TERM 设置正确。

tmux 内部的 TERM 必须是“screen”、“tmux”或类似的(例如“tmux-256color”)。不要费心报告不存在的问题!

在外部,它应该与您的终端匹配:特别是,使用“rxvt”表示 rxvt 和衍生产品。

将以下命令添加到您的~/.tmux.conf

set -g default-terminal tmux-256color
Run Code Online (Sandbox Code Playgroud)

PS:任何涉及显式绑定密钥的解决方案都是黑客行为,因此必然会失败。


Swi*_*vel 5

在尝试了每种方法以及其他几种方法并仔细阅读其他答案和文档后,这最终在我提出的每种情况下对我都有效。我不能为您保证相同,因为每个人的情况都不同,但这就是我最终的目的。

将以下内容添加到您的.tmux.conf

bind-key -n Home send Escape "OH"
bind-key -n End send Escape "OF"
Run Code Online (Sandbox Code Playgroud)

这是在此相关文章中引入了相同的尝试/错误和逻辑后发现的。唯一的区别是发生翻译的位置(在内.tmux.conf,而不是.bashrc.zshrc;主要是因为我的家庭/终端在tmux之外工作正常)


调试

您可以使用cat -v上面的文章中引用的类似内容调试此问题。

运行cat -v,然后按HomeEnd键。使用Ctrl+ 退出C

$ cat -v
Run Code Online (Sandbox Code Playgroud)

下面是我的输出看起来像内tmux using zshzshbash

多路复用器

?  ~ cat -v
^[[1~^[[4~^C
Run Code Online (Sandbox Code Playgroud)

sh

?  ~ cat -v
^[[H^[[F
Run Code Online (Sandbox Code Playgroud)

重击

bash-3.2$ cat -v
^[[H^[[F
Run Code Online (Sandbox Code Playgroud)

解决方案

通过tput与配对,将以上示例与我们期望看到的进行比较cat -v

$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF
Run Code Online (Sandbox Code Playgroud)

结论

因为此问题仅存在于tmux,而不存在于仿真器本身内,所以我选择在tmux配置内进行绑定更改。通过使用bind-key与配对send,我们可以将Escape关键字与想要实现翻译的序列配对使用。从而:

bind-key -n NAME_OF_KEY send Escape SEQUENCE_GOES_HERE
Run Code Online (Sandbox Code Playgroud)

此调试和解决过程可以应用于任何其他关键转换问题。但是,不要太疯狂了。由于某些原因,某些键被映射到某些转义序列。注意而不是; 如何bashzsh接收^[[H序列; 除非我们在中遇到重大问题,否则可能不建议您在我们的手册中覆盖它。Home^[OH.zshrczsh

  • 使用 tmux 2.6 和 tmux 中的“set-window-option -g xterm-keys on”,这个问题对我来说消失了,但这看起来是一个很好的答案,可以帮助具有多个终端配置的人。 (2认同)
  • 我喜欢这个选项,因为我想使用 xterm-256color,因为它似乎是我唯一支持斜体的术语。好吧,直到我将两个“bind-key”命令添加到我的配置中之前,它也没有有效的 Home/End。我发现“逃避”非常重要。其他答案忽略了这一点,它们对我不起作用。谢谢您的帮助! (2认同)
  • @zzxyz 你介意把你的建议`set-window-option -g xterm-keys on` 变成答案吗?它也为我解决了这个问题,乍一看我几乎错过了。 (2认同)