繁体   English   中英

Home/End 键在 tmux 中不起作用

[英]Home/End keys do not work in tmux

我目前正在使用带有 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 内部和外部时生成的序列不同? 如何解决这个问题,使其在任何程序中都不是问题?

看来主要问题是将 xterm-256color 用于 $TERM。 我将 $TERM 切换到 screen-256color 并且问题消失了。

在 tmux 2.0 中,您只需在.tmux.conf添加以下两行:

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

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

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

你完成了!


解释

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

这是在从这篇有点相关的文章中引入相同的试验/错误和逻辑后发现的。 唯一的区别是翻译发生的位置; 在我的情况下,出现这种情况我内.tmux.conf ,而不是.bashrc.zshrc (主要是因为我的家/结束工作的罚款外tmux

调试

您可以使用cat -v来调试这个问题,就像上面文章中提到的那样。

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

$ cat -v

这是我在tmux using zshzshbash

多路复用器

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

zsh

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

猛击

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

解决方案

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

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

结论

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

bind-key -n NAME_OF_KEY send Escape SEQUENCE_GOES_HERE

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

如果您出于某种原因想在 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

在我的情况下,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

来自tmux 常见问题解答

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

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

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

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

set -g default-terminal tmux-256color

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

set-window-option -g xterm-keys on

这应该适用于 tmux 2.6 及更高版本。 tmux -V来检查)如果您使用的是比那个旧的版本,那么您可能正在运行一个旧的 Ubuntu,您绝对应该考虑指向一个带有 backports 的 ppa。

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

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

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

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

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

sudo apt purge tmux
sudo apt install tmux

为我修好了。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM