背景颜色延伸到行尾的 Bash 提示符

标签 bash sed prompt

对我来说,现在是 bash-prompt-fiddling-time(总有一天……)。

我正在尝试获取两行提示:

  • 第一行包含位置信息,背景颜色到行尾
  • 第 2 行包含时间和上一个命令的退出代码

我快到了,但我无法破解“背景颜色到行尾”部分。不完全是。

将来自多个来源的信息汇集在一起​​,最重要的是来自 herehere , 我得到 this result (terminal screenshot) .

如您所见,COLUMNS 计算出了点问题:

  • 没有到达行尾
  • 这取决于第一行的文本长度
  • 到达终端底部时情况变得更糟;然后它确实到达了行尾;错误的线路...
  • 另一个奇怪的事情:第二个提示行中的小 [ ];并且只有在输入命令后才会出现

这是我的 bashrc 代码:

PROMPT_COMMAND=__prompt_command
__prompt_command()
{
    local EXIT="$?" 

    local Red='\[\033[1;38;5;9m\]'
    local Green='\[\033[1;38;5;10m\]'
    local Gray='\[\033[0;38;5;248m\]'
    local BgBlue='\[\033[48;5;253;1;38;5;12m\]'
    local BgPurple='\[\033[48;5;253;1;38;5;93m\]'
    local None='\[\e[0m\]'

    PS1="${BgPurple}\u@\h:${BgBlue}\$PWD"

    printf -v TC_SPC "%${COLUMNS}s" ''

    COLUMNS=$(tput cols)
    PS1=`echo $PS1 | sed "s/$/$TC_SPC/; s/^\\(.\\{${COLUMNS}\\}\\) */\\1/"`

    PS1+="\n${Gray}\D{%F %T}"

    if [ $EXIT != 0 ]; then
        PS1+=" ${Red} O_o ${None}"      # Add red if exit code non 0
    else
        PS1+="${Green} ^_^ ${None}"
    fi
}

我尝试了更多的黑客攻击,但没有成功。

哦,还有另一个更复杂的 sed 位版本,我也试过了:

    PS1=`echo $PS1 | sed "s/$/$TC_SPC/; s/^\\(\\(\\o33\\[[0-9;]*[a-zA-Z]\\)*\\)\\([^\o033]\\{${COLUMNS}\\}\\) */\\1\\3/"`

Different result (terminal screenshot)但还是不行。

此时我正在寻求帮助!

最佳答案

由于 Eric 的“删除到行尾”提示,这是可行的解决方案。

PROMPT_COMMAND=__prompt_command # Func to gen PS1 after CMDs
__prompt_command()
{
  local EXIT="$?"             # This needs to be first (retrieves last commmand exit code)

  local Red='\[\033[1;38;5;9m\]'
  local Green='\[\033[1;38;5;10m\]'
  local Gray='\[\033[0;38;5;248m\]'
  local BgBlue='\[\033[48;5;253;1;38;5;12m\]'
  local BgPurple='\[\033[48;5;253;1;38;5;93m\]'
  local None='\[\e[0m\]'

  PS1="${BgPurple}\u@\h:${BgBlue}\$PWD"
  PS1+="\033[K"             # erase to end of 1st line (background color stays)

  PS1+="\n${Gray}\D{%F %T}\a"

  if [ $EXIT != 0 ]; then
    PS1+="${Red} O_o ${None}"   # Add red if exit code non 0
  else
    PS1+="${Green} ^_^ ${None}"
  fi
  PS1+="\033[K"             # erase to end of 2nd line (no more background color)
}

here is the result (terminal screenshot) .又一位快乐的提示拥有者...

关于背景颜色延伸到行尾的 Bash 提示符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39305476/

相关文章:

javascript - 使用 Javascript 突出显示相应的名称

python - Jupyter Notebook 打开但看不到内容

bash - 在替换命令 '/' 中获取错误标志以进行 sed 替换

Linux 读取 - x 秒后超时*空闲*

python - linux 以太网驱动程序产品 ID、设备 ID 和地址

bash - 如何使用 awk 追加字段的出现?

javascript - Cypress - 是否可以在提示中验证文本?

bash - 如何将文本文件中的输入提供给交互式 bash 脚本

bash - 如何根据第一列awk拆分文件

awk - 根据字段数添加其他字段