Bash 无法正确计算提示长度

Mat*_*ias 3 bash prompt

我在这个问题上搜索了很多,发现了一些相关的问题,比如这个:终端提示没有正确包装

我的问题是 bash 没有正确计算提示的长度,当我执行诸如ctrl-r?滚动历史记录之类的事情时,这会把它搞砸。这基本上就是它的外观(没有颜色)。

? name@machine ~

01:09 $
Run Code Online (Sandbox Code Playgroud)

例如,当我使用向上箭头滚动浏览以前的命令时,某些字符会卡在提示中:

? name@machine ~

01:09 $m
Run Code Online (Sandbox Code Playgroud)

有时我也会遇到其他奇怪的行为,比如一些提示被覆盖(当我重新加载它时它会消失)。我的提示是这样的:

GIT_PROMPT_START_USER="\n_LAST_COMMAND_INDICATOR_ \[$Magenta\]\u\[$Orange\]@\[$White\]\h \[$Yellow\]\[$PathShort\]\[$ResetColor\]"

GIT_PROMPT_END_USER="\n\[$Blue\]$Time12a\[$ResetColor\] $ "
Run Code Online (Sandbox Code Playgroud)

我使用的东西叫做git-bash-prompt:> https://github.com/magicmonty/bash-git-prompt >。

我认为搞砸的是时间变量,它在另一个文件中定义:

Time12a="\$(date +%H:%M)"
Run Code Online (Sandbox Code Playgroud)

我已经尝试了\[$Time12a\]$Time12ain GIT_PROMPT_END_USER,但它们似乎都不起作用。我的猜测是 bash 计算错误,因为$Time12a表示 5 个字符 (hh:mm)。

bash 是如何计算这个长度的?是否可以明确设置 bash 的长度?答案非常感谢!

Mat*_*ias 5

所以我发现是什么搞砸了,这不是我所期望的 :)

它实际上是 \[$ResetColor\] bash 出于某种原因用来计算向前一步的长度(bash 认为我的提示长了 1 步)。

该变量由“bash-git-prompt”以及所有其他颜色定义(如果您想查看它,请参阅问题中指向 git-repo 的链接)。无论如何,修复很容易。我只是用我自己的定义覆盖了他们的定义:

ResetColor=$(tput sgr0)
Run Code Online (Sandbox Code Playgroud)

固定的!

(顺便说一句,如果其他人也有这个问题,我已经使用 $COLOR=$(tput setaf X) 覆盖了我用自己的定义使用的所有其他颜色,其中 COLOR 是您想要的颜色,X 是该颜色的 xterm- 256 号。)