【问题标题】:Home/End keys do not work in tmuxHome/End 键在 tmux 中不起作用
【发布时间】:2013-09-03 19:38:36
【问题描述】:

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

【问题讨论】:

  • 这是一个 tmux 配置的好问题,但是我建议你尝试习惯 ctrl-A/E/F/B/ alt-B/F... (emacs bind) 来移动光标
  • 顺便说一句,如果这对你有帮助? stackoverflow.com/questions/8604150/…
  • 我目前使用 ctrl-a 作为 tmux 中的命令键前缀(类似于 screen)。我之前看过那篇文章,但这似乎只适用于 Vim,在 Vim 中这对我来说不是问题。

标签: linux bash tmux


【解决方案1】:

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

【讨论】:

  • 我的类似问题已通过使用.inputrc(参见info readline)或.zshrc 中的zsh 设置键绑定来解决,如http://zshwiki.org/home/zle/bindkeys 中一样
  • 编辑~/.tmux.conf并添加一行set -g default-terminal "screen-256color"
  • 这个答案也适用于 GNU Screen 的相同问题。我刚刚将 term "screen-256color" 添加到我的 ~/.screenrc
  • 我不得不终止 tmux 会话,并关闭终端,然后重新启动一切以使其生效。
  • screen-256color 可能会弄乱一些应用程序。我在 .zshrc 中设置了手动绑定
【解决方案2】:

在 tmux 2.0 中,您只需在 .tmux.conf 中添加这两行即可:

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

【讨论】:

  • 这只适用于 readline(和 Emacs),并且会在其他地方产生意想不到的后果。
  • 是的,vim 不关心这个。
  • @zzxyz 在下面找到了一个更好的解决方案,最终修复了它。好奇它是否也适合您的场景。
【解决方案3】:

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

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

你就完成了!


说明

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

这是在引入与this somewhat related article 相同的试验/错误和逻辑后发现的。唯一的区别是翻译发生在哪里;就我而言,这发生在我的.tmux.conf 中,而不是.bashrc.zshrc(主要是因为我的家庭/终端在tmux 之外工作得很好)

调试

您可以使用上面文章中提到的cat -v 来调试此问题。

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

$ cat -v

这是我在tmux using zshzshbash 中的输出:

tmux

➜  ~ 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,而不存在于 shell 本身中,所以我选择在 tmux 配置中进行绑定更改。通过使用bind-keysend 配对,我们可以将Escape 关键字与我们想要实现翻译的序列配对。因此:

bind-key -n NAME_OF_KEY send Escape SEQUENCE_GOES_HERE

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

【讨论】:

  • 在 tmux 中使用 tmux 2.6 和 set-window-option -g xterm-keys on 对我来说这个问题消失了,但这看起来是一个很好的答案,可以帮助具有多种终端配置的人。
  • 我喜欢这个选项,因为我想使用 xterm-256color,因为它似乎是我唯一支持斜体的 TERM。好吧,在我将您的两个 bind-key 命令添加到我的配置之前,它也没有工作的 Home/End。我发现Escape 非常重要。其他答案省略了这一点,它们对我不起作用。感谢您的帮助!
  • 我正在使用 tmux 3.1,这在我开始使用 set-window-option -g vi 后开始发生,所以我认为这是最好的答案,因为可以在任何关键模式下工作。很好的解释。
  • @zzxyz 你介意把你的建议set-window-option -g xterm-keys on 变成答案吗?它也为我解决了这个问题,乍一看我几乎错过了。
【解决方案4】:

如果您出于某种原因想在 tmux 中保留 xterm-256color - 请将arch solution 与 inputrc 一起使用。我在 tmux 中使用 rxvt、ruby irb、python、lua 和 home/end 键对其进行了测试。可能每个 readline 应用都可以。

来自 Arch wiki:

第一件事:

不要手动设置 $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

【讨论】:

  • 我正在覆盖 TERM,这是我所有问题的原因感谢链接
  • 大多数人会在 xterm-256 下运行 tmux 的原因是因为他们运行的是稍微旧的 Ubuntu 版本,它有一个古老的 tmux 包。升级你的 tmux!
  • 老实说,这里唯一真正的好答案,只是你不应该“只是”在这里放一个 wiki 的链接,还应该放一个关于如何解决问题的 wiki 的摘录。我认为这样很多人都会错过它
【解决方案5】:

在我的情况下,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 无关,只是写下来以防它帮助其他人:bindkey "^[OF" end-of-linebindkey "^[OH" beginning-of-line
【解决方案6】:

来自tmux FAQ

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

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

在外部,它应该与您的终端匹配:特别是,使用“rxvt” rxvt 及其衍生物。

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

set -g default-terminal tmux-256color

PS:任何涉及显式绑定键的解决方案都是一种 hack,因此必然会失败。

【讨论】:

  • 我实际上遇到了问题,因为我在我的.tmux.conf 结尾使用了bind -n End/bind -n Home hack,然后我修复了我的TERM。所以,一定要做好并修正你的 TERM。
【解决方案7】:

set-window-option -g xterm-keys on

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

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

【讨论】:

    【解决方案8】:

    所以我没有足够的积分来评论,所以我会在这里说出来。我相信首选的解决方案是使用 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。

    【讨论】:

      【解决方案9】:

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

      sudo apt purge tmux
      sudo apt install tmux
      

      帮我修好了。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-12-03
        • 2010-09-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-06-23
        • 2014-10-06
        相关资源
        最近更新 更多