无法让 .bashrc PS1 配置正常渲染

无法让 .bashrc PS1 配置正常渲染

我基本上知道问题是什么,因为我需要使用\[...\]它来转义(非空格?)字符,并允许 bash 正确计算提示符的宽度。

然而,我无法解决所有问题,并且一直在尝试和错误,因为我不太明白我到底需要在哪里\[...\]放置所有位置。

STARTCOLOR='\[\e[0;31m\]'
ENDCOLOR='\[\e[0m\]'
BACKGROUND='\[\e[47m\]'
export PS1="$STARTCOLOR$BACKGROUND\u@\h \[\t\]$ENDCOLOR\w>\$?\$\]"

是我正在使用的。现在唯一的问题似乎是,如果我使用箭头键滚动先前的命令太长时间,\w>\$?\$\PS1 的部分就会消失。如果我在使用之前的命令前进后用箭头键向后退,也会发生这种情况。

答案1

问题是您正在使用非打印标记来打印输出的内容(\t- 时间戳)

STARTCOLOR='\[\e[0;31m\]'
ENDCOLOR='\[\e[0m\]'
BACKGROUND='\[\e[47m\]'
export PS1="$STARTCOLOR$BACKGROUND\u@\h \t$ENDCOLOR\w>\$?\$ "

仅适用\[ ... \]于周围的非打印字符序列,例如颜色代码。

答案2

所以问题是你“过度使用”\[\]。根据以下规定,这些只能用于不可打印的字符序列bash手册:

\[
Begin a sequence of non-printing characters.
This could be used to embed a terminal control sequence into the prompt.
\]

此外,您需要使用一种特殊的语法,以便 Bash 正确呈现选项卡:$'\t'

所以最后,提示代码的或多或少固定版本将如下所示:

#!/usr/bin/env bash

readonly PROMPT_STARTCOLOR='\[\e[0;31m\]'
readonly PROMPT_ENDCOLOR='\[\e[0m\]'
readonly PROMPT_BACKGROUND='\[\e[47m\]'

export PS1="$PROMPT_STARTCOLOR$PROMPT_BACKGROUND\u@\h"$'\t'"$PROMPT_ENDCOLOR\w>$?$"

请注意,我已重命名您的变量,以防止与您的环境发生可能的冲突。

要使用该脚本:

source <path_to_file>

我不久前问过的相关问题:if子句的提示定制问题

相关内容