Home键在长输入字符串上以bash(tty和X)起作用


11

当我打Home,如果我的电流输入足够短(比如<36个字符),它工作正常。但是,当我键入一个较长的命令,然后又想回到开头时,它似乎已经完成了工作,但是该命令不再正确显示。好像我不是刚开始,但要离开大约10个字符。尽管如果我键入“ blindly”,它可以正常工作,但看起来像是一团糟,好像整个输入都移到了右边,但没有重绘。因此,我键入了它,但实际上没有键入,因为我要“擦除”的位置在右边“实际上”是10个字符。因此,如果我尝试擦除该命令,则仍显示前10个字符,但是如果我单击Enter它,则仅显示另一个提示,就好像先前的输入为空。

我知道这不是有史以来最好的解释,但关键是bash能够识别它并尝试做正确的事情,但经常失败。

我在tty和X会话的终端中都重现了这一点。当我按下Ctrl+时VHome我看到了不同的序列(^[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)-发行版(i686-pc-linux-gnu)

有人对此有线索吗?


1
您的提示多长时间?键入大约36个字符长的命令行是否会填满终端机的一行,从而导致侧面滚动?如果使用此提示,是否仍然会发生?PS1='$ '
Mikel 2012年

@Mikel我不知道您的想法,但是您很可能走在正确的轨道上。当我使用简约提示时,似乎没有发生。与默认设置相比,我使用的修改了一点PS1="\e[0;36m[\u@\h \W]\$ \e[m"。这有什么问题吗?到目前为止,键入36个字符不会占一行。另外,我在tty中没有侧面滚动:)
Lev Levitsky'3者

@Mikel我遵循jw013的建议并调整了提示,似乎可以解决它。也许您可以详细说明问题出在什么地方,以便我能以一些代表的身分来回报您:)
Lev Levitsky 2012年

Answers:


13

你需要围绕你的提示与非印刷部分(包括但不限于逃避改变颜色序列)\[\]

您的原始提示:\e[0;36m[\u@\h \W]\$ \e[m
固定提示:\[\e[0;36m\][\u@\h \W]\$ \[\e[m\]

\[\]告诉bash之间实际上并没有打印到屏幕上的一切,即长度为零。需要计算出的提示长度,才能知道在何处回显您键入的字符。忽略\[ \]导致bash计算不正确的提示长度的原因,由于bash光标在哪里与现实不匹配的想法,通常会导致奇怪的与终端几何形状相关的行为。


谢谢,这解决了问题。不过,我希望能得到一些解释:这种行为的原因是什么,方括号是做什么的,等等。将它们全部放在一页上会很好,并且将来可以帮助其他人。
列夫·列维茨基2012年

@LevLevitsky我在答案中添加了简短说明。
2012年

十分感谢!现在对我来说更有意义。
列夫·列维茨基2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.