60

我目前正在使用带有 xterm-256color $TERM 变量的 tmux。在 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

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

if [[ -n "$TMUX" ]]; then
    bind '"\e[1~":"\eOH"'
    bind '"\e[4~":"\eOF"'
fi

这解决了 bash 的问题,但是在其他 readline 程序中,例如在 ipython 等 REPL 中,它仍然为 home/end 插入波浪号。

为什么首先这是一个问题?为什么当我在 tmux 内部和外部时生成的序列不同?如何解决此问题,使其在任何程序中都不是问题?

4

9 回答 9

57

看来主要问题是使用 xterm-256color 作为 $TERM。我将 $TERM 切换到 screen-256color,问题就消失了。

于 2013-09-03T20:34:49.787 回答
34

在 tmux 2.0 中,您只需在您的 2 中添加这两行.tmux.conf

bind -n End send-key C-e
bind -n Home send-key C-a
于 2015-09-21T16:13:16.503 回答
32

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

bind-key -n Home send Escape "OH"
bind-key -n End send Escape "OF"

你完成了!


解释

在尝试了其中的每一个,以及我在阅读其他答案和文档时看到的其他几个之后,这最终在我投入的每一个场景中都对我有用。我不能对你做出同样的承诺,因为每个人的场景都不一样,但这就是我最终的结果。

这是在从这篇有点相关的文章中引入相同的试验/错误和逻辑之后发现的。唯一的区别是翻译发生在哪里;就我而言,这发生在 my .tmux.conf,而不是.bashrcor .zshrc(主要是因为我的家/端在 之外工作正常tmux

调试

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

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

$ cat -v

tmux using zsh这是我的输出在,zsh和中的样子bash

多路复用器

➜  ~ cat -v
^[[1~^[[4~^C

zsh

➜  ~ cat -v
^[[H^[[F

重击

bash-3.2$ cat -v
^[[H^[[F

解决方案

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

$ tput khome | cat -v; echo
^[OH
$ tput kend | cat -v; echo
^[OF

结论

因为这个问题只存在于tmux. 而不是 shell 本身,所以我选择在 tmux 配置中进行绑定更改。通过使用bind-keypaired with send,我们可以使用Escape关键字与我们想要实现翻译的序列配对。因此:

bind-key -n NAME_OF_KEY send Escape SEQUENCE_GOES_HERE

此调试和解决过程可应用于任何其他关键翻译问题。但是,不要太疯狂。出于某种原因,某些键被映射到某些转义序列。注意如何接收序列bash而不是; 除非我们在.zsh^[[HHome^[OH.zshrczsh

于 2019-04-10T15:52:37.593 回答
11

如果您出于某种原因想在 tmux 中保留 xterm-256color - 使用带有 inputrc 的arch 解决方案。我在 tmux 中使用 rxvt、ruby irb、python、lua 和 home/end 键对其进行了测试。可能每个 readline 应用程序都可以。

来自拱维基:

第一件事:

不要手动设置 $TERM - 让终端来做。


许多命令行应用程序使用 Readline 库来读取输入。所以在很多情况下,正确配置 Readline 可以修复 Home 和 End。

默认的 /etc/inputrc 文件不包含 home/end 键的映射。

要检查这些键发出的转义序列是什么:

1. Ctrl + V
2. Home
3. Spacebar
4. Ctrl + V
5. End

这可能会打印:$ ^[[1~ ^[[4~. 因此,您必须将这些序列的映射添加到您的 inputrc(/etc/inputrc 是全局的,或者仅适用于您的用户 ~/.inputrc):

"\e[1~": beginning-of-line
"\e[4~": end-of-line
于 2014-12-14T08:13:43.863 回答
7

就我而言,tmux 中的 zsh 存在问题(tmux 中的 bash 没问题)。这里的其他回答者都没有为我工作。

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

bindkey "\E[1~" beginning-of-line
bindkey "\E[4~" end-of-line

除此之外,我还有:

bindkey "\E[H" beginning-of-line
bindkey "\E[F" end-of-line
bindkey "\E[3~" delete-char
于 2019-11-13T17:52:57.380 回答
4

来自tmux 常见问题解答

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

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

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

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

set -g default-terminal tmux-256color

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

于 2020-05-20T23:33:37.667 回答
2

set-window-option -g xterm-keys on

这应该适用于 tmux 2.6 及更高版本。(tmux -V检查)如果您使用的是旧版本,那么您可能运行的是较旧的 Ubuntu,您绝对应该考虑指向带有反向端口的 ppa。

这绝对不适用于kitty,并且在输入方面有效地“硬编码”终端,但它比硬编码特定键更好。

于 2021-07-26T17:09:02.347 回答
1

所以我没有足够的积分来评论,所以我会在这里说出来。我相信首选的解决方案是 set -g default-terminal "screen-256color"在您的~/.tmux.conf. 实际上我不久前遇到了这个问题,并决定采用 sumanta 的解决方案:

bind -n End send-key C-e
bind -n Home send-key C-a

但是我忘记了我把它留在了这里,最后遇到了与 vim 类似的问题(home 和 end 是从寄存器复制粘贴)而不是 zsh。简而言之,绑定确实会影响 vim。

于 2018-12-13T08:47:26.973 回答
0

我浪费了很多时间尝试上述所有内容。最后我回到野蛮状态:

sudo apt purge tmux
sudo apt install tmux

为我修好了。

于 2020-04-13T12:07:39.270 回答