问题
当我在 tmux 中使用 bash 时,我无法使用左箭头键(在键盘上)将光标移到我输入的文本的左侧。没有其他字符显示,光标不移动,什么都没有发生。
细节
如果我进入 vim,左箭头可用于导航。因此,这似乎不是 tmux 中的一般问题,而只是 bash 命令行中出现的问题。向上和向下箭头在 tmux 中的 bash 中有效。左箭头在 tmux 之外的 bash 中也正常工作。当我在 tmux 中的 bash 中时,按 Shift Left 会将光标向左移动。
基本设置
我从 Windows 中的 PuTTY ssh 连接到 Fedora 24 机器。然后我启动 tmux。
环境
Putty 配置
Terminal -> Keyboard -> keypad: ESC[n~
Terminal -> Features -> nothing checked
Connection -> Data -> term type string: putty-256color
壳
tmux 之外:
$ echo $0
-bash
$ help
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)
tmux 内部:
$ echo $0
-bash
$ help
GNU bash, version 4.3.42(1)-release (x86_64-redhat-linux-gnu)
Bash 变量
tmux 之外:
$ echo $TERM
putty-256color
tmux 内部:
$ echo $TERM
screen-256color
我也尝试过$TERM
在 tmux 内部设置其他值,例如screen.putty-256color
我发现的ls -1 /usr/share/terminfo/s/screen*
-- 似乎没有什么区别。
转储 bash 选项设置,这些设置与 tmux 内部和外部相同:
$ shopt -o
allexport off
braceexpand on
emacs on
errexit off
errtrace off
functrace off
hashall on
histexpand on
history on
ignoreeof on
interactive-comments on
keyword off
monitor on
noclobber off
noexec off
noglob off
nolog off
notify off
nounset off
onecmd off
physical off
pipefail off
posix off
privileged off
verbose off
vi off
xtrace off
我没有个人 .inputrc,但我看到 emacs 在上面,并且 /etc/inputrc 有以下部分:
$if mode=emacs
# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
# commented out keymappings for pgup/pgdown to reach begin/end of history
#"\e[5~": beginning-of-history
#"\e[6~": end-of-history
"\e[5~": history-search-backward
"\e[6~": history-search-forward
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# for rxvt
"\e[8~": end-of-line
"\eOc": forward-word
"\eOd": backward-word
# for non RH/Debian xterm, can't hurt for RH/DEbian xterm
"\eOH": beginning-of-line
"\eOF": end-of-line
# for freebsd console
"\e[H": beginning-of-line
"\e[F": end-of-line
$endif
笔记
我认为这是一周前就起作用了。从那时起,我想到了一些不同之处:
- 我有一个不同的 PuTTY 配置(我可以尝试恢复它,但现在不容易访问)
- 我为 vim 安装了 Solarized colors,也尝试了它们的 PuTTY colors。我这样做时又看了看 $TERM 选项,但我认为我没有做出任何尚未撤消的重大更改。
- 内核头文件已更新,glibc 已更新。
故障排除
安装 zsh 并设置set-option -g default-shell /bin/zsh
并未~/.tmux.conf
解决问题。
su
'ing 为 root 并从 root 启动 tmux 并不能解决问题。
答案1
我今天早上解决了这个问题,因此我发布了这个答案并给出了我的修复方法:
使固定
将 PuTTY 配置更改Connection -> Data -> Terminal-type string
为xterm-256color
。
解释
好吧,这是 kLFT 的 terminfo 值之间的区别,它man terminfo
表示移位的左箭头键:
$ infocmp xterm-256color putty-256color | grep '\\E\[D'
kLFT: '\E[1;2D', '\E[D'
我认为 Bash 理解\E[D
为将光标左移一个的命令,因此 shift-left-arrow 用于将光标左移是有道理的。但是没有其他条目\E[D
,并且
$ infocmp xterm-256color | grep '\\E\[D'
什么也没找到,所以 xterm-256color 似乎没有将任何其他东西绑定到它,而 kLFT 是 putty-256color 中唯一的匹配项。 man terminfo
说
左箭头、右箭头、上箭头、下箭头和 Home 键发送的代码可以分别给出为 kcub1、kcuf1、kcuu1、kcud1 和 khome。
其他地方将 kcub1 列为左箭头键,所以我应该寻找 kcub1:
$ infocmp xterm-256color | grep kcub1
kbs=\177, kcbt=\E[Z, kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC,
$ infocmp putty-256color | grep kcub1
kcub1=\EOD, kcud1=\EOB, kcuf1=\EOC, kcuu1=\EOA,
\EOD
但两者中它都被设置为相同的值。
在屏幕 256 色中,kcub1 的值相同,并且未设置 kLFT。
除此之外,我没有太多的解释——如果这一切对你来说有意义,请发表答案。
注意:我认为这在一周前使用 putty-256color 就可以正常工作,但我记得在安装 Solarized 时更改了一些 $TERM 选项,所以我猜我当时将其更改为 putty-256color 然后就忘记了它。