![Home 键在 bash(tty 和 X)中对长输入字符串表现奇怪](https://linux22.com/image/21971/Home%20%E9%94%AE%E5%9C%A8%20bash%EF%BC%88tty%20%E5%92%8C%20X%EF%BC%89%E4%B8%AD%E5%AF%B9%E9%95%BF%E8%BE%93%E5%85%A5%E5%AD%97%E7%AC%A6%E4%B8%B2%E8%A1%A8%E7%8E%B0%E5%A5%87%E6%80%AA.png)
当我点击Home当前输入是否足够短(例如,<36 个字符)时,它工作正常。但是,当我输入较长的命令然后想返回到开头时,它似乎完成了其工作,但该命令却没有显示的对了。看来我不在开头,而是落后了大约 10 个字符。虽然如果我“盲目”输入,它工作正常,但看起来完全一团糟,就好像整个输入向右移动,但没有重新绘制。所以我打字覆盖它,但“事实上”没有,因为我“删除”的地方“实际上”是右边10个字符。因此,如果我尝试删除该命令,前 10 个字符仍会显示,但如果我点击Enter它,只会显示另一个提示,就好像之前的输入为空一样。
我知道这不是最好的解释,但重点是 bash 认识到它并尝试做正确的事情,但经常失败。
我在 tty 和 X 会话的终端中重现了这一点。当我点击Ctrl+V时,Home我看到不同的序列(^[OH
在 X 中,^[[1~
在 tty 中),但两者似乎都在我的/etc/inputrc
:
# do not bell on tab-completion
#set bell-style none
set meta-flag on
set input-meta on
set convert-meta off
set output-meta on
$if mode=emacs
# for linux console and RH/Debian xterm
"\e[1~": beginning-of-line
"\e[4~": end-of-line
"\e[5~": beginning-of-history
"\e[6~": end-of-history
"\e[7~": beginning-of-line
"\e[3~": delete-char
"\e[2~": quoted-insert
"\e[5C": forward-word
"\e[5D": backward-word
"\e\e[C": forward-word
"\e\e[D": backward-word
"\e[1;5C": forward-word
"\e[1;5D": backward-word
# for rxvt
"\e[8~": end-of-line
# 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
echo $TERM
显示linux
在 tty 和xterm
X 会话中。
它是
GNU bash,版本 4.2.24(2)-release (i686-pc-linux-gnu)
有人有这方面的线索吗?
答案1
您需要用 和 包围提示的非打印部分(包括但不限于用于更改颜色的转义序列)\[
。\]
您原来的提示:\e[0;36m[\u@\h \W]\$ \e[m
修正提示:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]
和\[
告诉\]
我们bash
之间的所有内容实际上并不打印到屏幕上,即长度为零。需要计算出的提示长度才能知道在哪里回显您键入的字符。忽略\[ \]
会导致bash
计算不正确的提示长度,这通常会导致奇怪的终端几何依赖行为,因为bash
's 的想法是光标与现实不匹配。