我在谷歌上搜索了很多关于这个问题的信息,发现了一些相关的问题,比如这个:终端提示未正确换行。
我的问题是 bash 无法正确计算提示的长度,当我执行类似ctrl-r或↑滚动历史记录之类的操作时,这会弄乱它。这基本上就是它应该看起来的样子(没有颜色)。
✔ name@machine ~
01:09 $
例如,当我使用向上箭头滚动浏览以前的命令时,某些字符会卡在提示中:
✔ name@machine ~
01:09 $m
有时我还会遇到其他奇怪的行为,例如某些提示被覆盖(当我重新加载它时,所有提示都会消失)。我的提示如下所示:
GIT_PROMPT_START_USER="\n_LAST_COMMAND_INDICATOR_ \[$Magenta\]\u\[$Orange\]@\[$White\]\h \[$Yellow\]\[$PathShort\]\[$ResetColor\]"
GIT_PROMPT_END_USER="\n\[$Blue\]$Time12a\[$ResetColor\] $ "
我用的东西叫做git-bash-prompt
:>https://github.com/magicmonty/bash-git-prompt>。
我认为搞砸的是时间变量,它是在另一个文件中定义的:
Time12a="\$(date +%H:%M)"
我已经尝试过\[$Time12a\]
和$Time12a
in GIT_PROMPT_END_USER
,但它们似乎都不起作用。我的猜测是 bash 计算错误,因为$Time12a
代表 5 个字符 (hh:mm)。
bash 是如何计算这个长度的?是否可以明确设置 bash 的长度?非常感谢回答!
答案1
所以我发现是什么搞砸了,这不是我所期望的:)
实际上,bash 由于某种原因使用 \[$ResetColor\] 来向前计算一步的长度(bash 认为我的提示符长了 1 步)。
该变量由“bash-git-prompt”以及所有其他颜色定义(如果您想查看它,请参阅问题中 git-repo 的链接)。不管怎样,修复很容易。我只是用我自己的定义覆盖了他们的定义:
ResetColor=$(tput sgr0)
固定的!
(顺便说一句,如果其他人也遇到这个问题,我已经使用 $COLOR=$(tput setaf X) 覆盖了我自己的定义中使用的所有其他颜色,其中 COLOR 是您想要的颜色,X 是该颜色的 xterm- 256号。)