在 bash PS1 中使用 \r

在 bash PS1 中使用 \r

我对 Bash 中的预输入功能感到有些厌倦,因为它搞乱了 PS1。例如,我会执行一个命令,比如ls,在它运行时,开始输入下一个命令,比如echo,然后预输入echo会出现在 PS1 之前,比如

/$ls
...
ec/$echo

(这里/$PS1)。我的解决方案是将其添加\r到 PS1 的前面,这样它就可以先清除线路。

这似乎工作得很好,但似乎有一个奇怪的问题。在我.inputrc

"\ep": history-search-backward

让我可以M-p向后输入(iTerm 2 映射选项以正确退出)。

问题是,有时当我输入一些内容,然后M-p获取上一个命令时,我会执行C-u C-k清除该行,第一个字符会保留下来,并成为 的一部分(它从执行的行中删除,但显示在 PS1 上)。当我执行命令时,它会消失,但每当我点击历史记录中的该项目时,即使使用常规向上箭头,第一个字符也会再次卡在那里。这似乎只发生在具有一定长度的命令中。是否实际清除任何文本PS1并不重要。\r

我是不是在 bash 和/或 iTerm 中遇到了一个奇怪的错误?\r在前面添加是PS1清除前面的垃圾的正确方法吗?

答案1

发出信号,表示bash是非\r打印字符,以便计算提示字符串的正确长度,也就是说,而不是

PS1='\rstuff'

使用

PS1='\[\r\]stuff'

我认为,由于\r是在提示的开头,它始终是一个零长度字符,而不是可变长度的负宽度字符,因为它可以被视为出现在提示的中间,所以这应该有效。

相关内容