我的.bashrc:
export COLOR_RST=$(tput sgr0)
export COLOR_WHI=$(tput setaf 15)$(tput bold)
export COLOR_gra=$(tput setaf 7)
export COLOR_GRA=$(tput setaf 8)$(tput bold)
export COLOR_BLK=$(tput setaf 16)$(tput bold)
export COLOR_red=$(tput setaf 1)
export COLOR_RED=$(tput setaf 9)$(tput bold)
export COLOR_grn=$(tput setaf 2)
export COLOR_GRN=$(tput setaf 10)$(tput bold)
export COLOR_yel=$(tput setaf 3)
export COLOR_YEL=$(tput setaf 11)$(tput bold)
export COLOR_blu=$(tput setaf 4)
export COLOR_BLU=$(tput setaf 12)$(tput bold)
export COLOR_pur=$(tput setaf 5)
export COLOR_PUR=$(tput setaf 13)$(tput bold)
export COLOR_cya=$(tput setaf 6)
export COLOR_CYA=$(tput setaf 14)$(tput bold)
git_branch_info () {
local _bra="$(git branch 2> /dev/null | grep -e ^* | cut -d\ -f2)"
local status_por="$(git status --porcelain 2>/dev/null)"
local _mod="±$(echo -e "$status_por" | grep -E '^( M|M |MM)' | wc -l)"
local _add="+$(echo -e "$status_por" | grep -E '^( A|A |AA)' | wc -l)"
local _del="-$(echo -e "$status_por" | grep -E '^( D|D |DD)' | wc -l)"
local _ren="r$(echo -e "$status_por" | grep -E '^( R|R |RR)' | wc -l)"
local _unt="?$(echo -e "$status_por" | grep -E '^\?\?' | wc -l)"
# echo "b=$_bra:m=$_mod:a=$_add:d=$_del:r=$_ren:"
[[ "$_bra" = '' ]] && _bra="" || _bra=" ${COLOR_PUR}$_bra"
[[ "$_mod" = '±0' ]] && _mod="" || _mod=" ${COLOR_YEL}$_mod"
[[ "$_add" = '+0' ]] && _add="" || _add=" ${COLOR_GRN}$_add"
[[ "$_del" = '-0' ]] && _del="" || _del=" ${COLOR_RED}$_del"
[[ "$_ren" = 'r0' ]] && _ren="" || _ren=" ${COLOR_YEL}$_ren"
[[ "$_unt" = '?0' ]] && _unt="" || _unt=" ${COLOR_GRN}$_unt"
echo -e "$_bra$_mod$_add$_del$_ren$_unt${COLOR_RST}"
}
color_prompt () {
if [[ "$USER" = "root" ]]; then
local lv_col="${COLOR_RED}"
local lv_sym="#"
else
local lv_col="${COLOR_GRN}"
local lv_sym="$"
fi
local usr_host="${lv_col}${USER}${COLOR_GRA}@${COLOR_BLU}\h${COLOR_GRA}:${COLOR_RST}"
local time="$COLOR_WHI\d \t${COLOR_RST}"
local curr_path="${COLOR_blu}\w${COLOR_RST}"
local git='$(git_branch_info)'
local prompt="${lv_col}${lv_sym} ${COLOR_RST}"
export PS1="\n$time\n${usr_host}${curr_path}${git}\n${prompt}"
export PS2="${lv_col}>${COLOR_RST} "
}
color_prompt
它按预期工作(我得到一个包含三行提示的提示,时钟、路径和命令提示符。颜色看起来不错。
但是,当我输入命令后,点击C-a
(返回行首)时,光标不会一直移动到左边:部分命令“卡”在开头,多余的空白处连接到提示符的末尾。这就像光标忘记了命令的位置,并认为它向右移动了。基本上,光标没有任何意义,我需要重新C-c
绘制提示符。
阅读Bash:PS1 与 Prompt 命令用于设置提示和标题我更加困惑 PS1 版本的方法是否正确。
什么原因可能导致这个错误?
答案1
打开终端,输入
$ man bash
...hit Enter。
在这种情况下,您将less
显示 bash“手册页”。
如果您点击,h 您将看到有关可用键的简明帮助。q退出帮助。
在帮助中,你会发现/用于启动对模式(正则表达式!)的搜索。因此:
/^PROMPTING
将带您进入手册页的部分,其中介绍了可以在提示中使用的特殊功能(转义!PS0
)PS4
。
在那里注意\[
并\]
逃脱;
这些会告诉 bash 你包含了不可打印的内容,并在这两者之间包含任何转义符(例如颜色变化),将使提示按你期望的方式工作。