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

时间:2016-09-03 09:42:18

标签: bash sed prompt

这是我的bash-prompt-fiddling-time(必须在某一天发生......)。

我试图获得2行提示:

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

我几乎就在那里,但是我无法将背景颜色破解到线的末端"部分。不太好。

汇总来自多个来源的信息,最重要的是来自herehere,我得到this result (terminal screenshot)

正如您所看到的,COLUMNS计算出现了一些问题:

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

这是我的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)但仍不行。

此时我正在寻求帮助!

2 个答案:

答案 0 :(得分:0)

而不是:

.-modal-open .fixed,
.-modal-open .content {
  overflow-y:scroll;
}

使用:

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

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

答案 1 :(得分:0)

这是工作解决方案,感谢Eric"擦除到行尾#34;提示。

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)。一个更快乐的提示老板......