我的 Bash 提示符(基于Mike Kasberg 的)通常工作正常。但是当我收到错误代码,然后写入下一行时,不会生成换行符,因此文本会返回到我之前的提示符。
有问题的代码:
# gets error code
__mkps1_inject_exitcode() {
local code=$1
local bg_red='\033[41m'
local white='\033[37m'
local red='\033[31m'
if [ "$code" -ne "0" ]; then
echo -e " ${bg_red}${white} $code${red}"
fi
}
__mkps1_exitcode() {
# We need to run a function at runtime to evaluate the exitcode.
echo "\$(__mkps1_inject_exitcode \$?)"
}
PROMPT_COMMAND='__git_ps1 "${yellow}\u ${bg_grey}${black} $(__pwd_fancy)${grey}" "$(__mkps1_exitcode) ${reset_bg}${reset} " " ${bg_blue}${bold}${black}${bg_blue} %s${unbold}${blue}"'
我已经研究这个问题一段时间了,所以出现的问题各不相同。有时,换行符工作正常,但当我尝试返回上一行(ctrl+左箭头)时,却无法返回,或者我最终删除了前一个提示的文本,或者出现了一些奇怪的情况。我确信这是转义颜色代码的问题,因为类似的问题散布在堆栈交换的各个角落。但如果我用\[...\]
括号括住颜色,颜色就会显示在提示中。我不确定我的薄弱环节在哪里,真的很希望得到一些帮助!
出于相同的原因,您仍然需要用括号将每个颜色代码括起来,但它们必须是 ,而不是
\[
和。\]
\001
\002
后者是 Readline 库真正期望的,而
\[
\]
仅仅是 Bash 为其 PS1 提供的别名 - 但似乎 Bash在处理替换之前$()
将它们转换为 Readline 等效项,而不是之后,因此翻译不适用于命令输出。的使用
\001
\002
也适用于所有其他使用 Readline 并具有可自定义提示的程序(例如 Python REPL)。