我对 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
是在提示的开头,它始终是一个零长度字符,而不是可变长度的负宽度字符,因为它可以被视为出现在提示的中间,所以这应该有效。