Terminal.app bash 字符回显混乱

Terminal.app bash 字符回显混乱

我的终端最近出了点问题。当我按下右光标键退出“反向搜索”(Control-R)模式时,bash(或者更确切地说是 readline)和 Terminal.app 的组合似乎出现了混乱。之后,光标右侧的字符被复制了。Vim 是一个更复杂的应用程序,它会以错误的顺序复制字符。

我将向您展示一些屏幕截图来说明这个问题。

首先,这是一个运行“GNU bash,版本 3.2.48(1)-release (x86_64-apple-darwin10.0)” (OSX 10.6.4) 的新终端窗口。提示符相当复杂,您可以找到GitHub 上的代码。我不知道我的提示是否导致了问题,但在 Linux 中不会。为了完整起见,我将在某种程度上解释一下:青色部分显示当前目录的 Git 状态并由 生成PROMPT_COMMAND。示例$PS1如下:

\[\e]0;\u@\h:\w\a\]\[\e[1;32m\]\u\[\e[0;32m\]@\[\e[1;30m\]\h\[\e[1;34m\] \w \[\e[0;36m\]di ~? \[\e[1;30m\]\[\e[0;37m\]\A \[\e[0;33m\]\[\e[1;31m\]1\$\[\e[0m\]

作为参考,这是输出stty

speed 9600 baud; 50 rows; 80 columns;
lflags: icanon isig iexten echo echoe -echok echoke -echonl echoctl
 -echoprt -altwerase -noflsh -tostop -flusho pendin -nokerninfo
 -extproc
iflags: -istrip icrnl -inlcr -igncr ixon -ixoff ixany imaxbel iutf8
 -ignbrk brkint -inpck -ignpar -parmrk
oflags: opost onlcr -oxtabs -onocr -onlret
cflags: cread cs8 -parenb -parodd hupcl -clocal -cstopb -crtscts -dsrflow
 -dtrflow -mdmbuf
cchars: discard = ^O; dsusp = ^Y; eof = ^D; eol = <undef>;
 eol2 = <undef>; erase = ^?; intr = ^C; kill = ^U; lnext = ^V;
 min = 1; quit = ^\; reprint = ^R; start = ^Q; status = ^T;
 stop = ^S; susp = ^Z; time = 0; werase = ^W;

这里不应该有任何非默认设置。进入测试用例:

我输入echo 126,然后按一次“左光标”,然后输入 345,然后按回车键。然后,我按 Control-R 并输入“p”。这时我截取了第一张截图:

处于 ^R 模式时

现在,按下“光标向右”退出反向 i 搜索模式后,终端会发出哔哔声并开始变得混乱:

按下向右光标后

为了演示这个问题,我所做的和以前完全相同echo:我输入echo 126,向左移动一个字符345,然后输入,然后回车。

混乱的命令行

如您所见,我输入的每个字符,光标右侧都会显示另一个“6”。当我进入 Vim 时,情况变得更糟。这是我进入插入模式并输入空格字符后刚刚启动的 Vim:

搞砸了 Vim

(空格显示为下划线是正常的,这是'list'选项的作用。)

看到问候信息以一种奇怪的方式向右移动了吗?另一个例子是:在新的 Vim 中输入i126<Left>345<Esc>

i126<Left>345<Esc> 之后的 Vim

现在,知道这是怎么回事了吗?很明显,以这种方式工作几乎是不可能的。使用reset可以,但每次都这样做并不是最方便的事情。

如果您需要任何其他信息,我很乐意提供。此外,我是一位经验丰富的 CLI 用户,因此您不必解释一切万无一失的事情。

答案1

我无法重现此问题。我在 Terminal.app 中使用 Pro-profile,并将“Declare terminal as”设置为 rxvt。也许这会有所帮助。

答案2

我现在无法说出是什么问题,但您使用的 PS1 提示字符串中肯定存在问题,导致终端在使用“xterm-color”仿真时出现问题。我的 BASH 和 MacOS 版本与您相同,并且我在 xterm-color 仿真下运行终端。当我使用您在问题中提供的值导出 PS1 变量并在反向搜索模式中执行您提到的技巧时,我可以看到我的终端上的行为与您在您的终端上看到的行为完全相同。

相关内容