【问题标题】:PS1 line-wrapping with colours problemPS1换行与颜色问题
【发布时间】:2010-09-25 10:04:42
【问题描述】:

这是我的 PS1 变量:

PS1='\u:\W$(__git_ps1 "\e[32m\][%s]\e[0m\]")$ '

非常适合拾取我的 Git 分支,但它具有在颜色处于活动状态时换行的不幸副作用,因此当您使用长命令时它们会重叠。

有神奇的 PS1 技能的人可以帮我解决这个问题吗?

【问题讨论】:

    标签: bash profile environment


    【解决方案1】:

    知道了,需要正确转义颜色。

    修复:

    PS1='\u:\W$(__git_ps1 "\[\e[32m\][%s]\[\e[0m\]")$ '
    

    【讨论】:

    • 对于那些懒得做 diff 的人,终端转义应该被 \[ \] 包围,以便 bash 能够正确地将打印字符计数到行首。 manpages.ubuntu.com/manpages/precise/en/man1/…
    • Aupajo,我遇到了类似的问题,使用生成的 PS1。我知道的不够多,无法正确逃脱。有什么建议?我的命令是:export PS1="\[\e[0;40m\]\h:\W \u\033[0;32m \$(parse_git_branch)\[\e[0m\]$ "
    • @karl 我认为您需要转义和/或关闭\033[0; 周围的括号,但我可能是错的。您可能会发现从一个可用的开始并对其进行修改会更容易。
    • 是的,我玩了一下,最终偶然发现了正确的答案。我也改用\e[而不是\[\033[,这样更容易阅读。
    • 我看不出原版和这个的区别?
    【解决方案2】:

    我可以建议在 Bash 中使用以下颜色方法,它可以使代码更具可读性,并且让您更难错过一两次转义。

    将以下内容放入您的 ~/.bashrc

    BLACK=$(tput setaf 0)
    RED=$(tput setaf 1)
    GREEN=$(tput setaf 2)
    LIME_YELLOW=$(tput setaf 190)
    YELLOW=$(tput setaf 3)
    POWDER_BLUE=$(tput setaf 153)
    BLUE=$(tput setaf 4)
    MAGENTA=$(tput setaf 5)
    CYAN=$(tput setaf 6)
    WHITE=$(tput setaf 7)
    BRIGHT=$(tput bold)
    NORMAL=$(tput sgr0)
    BLINK=$(tput blink)
    REVERSE=$(tput smso)
    UNDERLINE=$(tput smul)
    

    一个示例 PS1(或任何打印到屏幕上的东西)将是:

     PS1="\[${WHITE}\](\[${YELLOW}\]\u@\h\[${WHITE}\])\[${NORMAL}\]$ "
    

    您只需将 \[ \] 放在颜色词周围。

    如果您有一个 256 色终端,您可以尝试使用其他数值来 'tput setaf' 一直到 255。

    【讨论】:

    • 哦,这很简单,清晰,很棒。有一些代表,在房子上。
    • 更通用的问题解决方案,帮助我在几秒钟内解决了我的问题!
    • 重置也很有用RESET=$(tput sgr0)...也就是说,这很慢
    • 这个解决方案对我有用 +1。 @SiegeX 你可以在开始的任务中而不是在 PS1 中是 \[\] 吗? BLACK="\[$(tput setaf 0)\]" 这会正常工作吗?
    【解决方案3】:

    这些是我经常使用的颜色函数...几年前写的并且已经习惯了它们,它们是我脚本的常规部分。只需将此代码块粘贴到您的 .bashrc 文件中,开始一个新会话,就可以了!

    我将这些用作彩色/时尚的 printf 替代品:

    ## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ [ Aesthir's Color Functions ] ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## Normal () { printf '\e[m'"$*"; } ; Tblack () { printf '\e[0;30m'"$*"'\e[m'; } TNormal () { printf '\e[m'"$*"; } ; Tred () { printf '\e[0;31m'"$*"'\e[m'; } Bold () { printf '\e[1m'"$*"'\e[m'; } ; Tgreen () { printf '\e[0;32m'"$*"'\e[m'; } TBold () { printf '\e[1m'"$*"'\e[m'; } ; Tbrown () { printf '\e[0;33m'"$*"'\e[m'; } Underline () { printf '\e[4m'"$*"'\e[m'; } ; Tyellow () { printf '\e[0;33m'"$*"'\e[m'; } TUnderline () { printf '\e[4m'"$*"'\e[m'; } ; Tblue () { printf '\e[0;34m'"$*"'\e[m'; } Flash () { printf '\e[5m'"$*"'\e[m'; } ; Tmagenta () { printf '\e[0;35m'"$*"'\e[m'; } TFlash () { printf '\e[5m'"$*"'\e[m'; } ; Tpurple () { printf '\e[0;35m'"$*"'\e[m'; } Invert () { printf '\e[7m'"$*"'\e[m'; } ; Taqua () { printf '\e[0;36m'"$*"'\e[m'; } TInvert () { printf '\e[7m'"$*"'\e[m'; } ; Tcyan () { printf '\e[0;36m'"$*"'\e[m'; } Invisible () { printf '\e[8m'"$*"'\e[m'; } ; Tgrey () { printf '\e[0;37m'"$*"'\e[m'; } TInvisible () { printf '\e[8m'"$*"'\e[m'; } ; Twhite () { printf '\e[0;37m'"$*"'\e[m'; } ## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ Bold Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞∞∞∞∞ Underlined Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞ ## TblackB () { printf '\e[1;30m'"$*"'\e[m'; } ; TblackU () { printf '\e[4;30m'"$*"'\e[m'; } TgreyB () { printf '\e[1;30m'"$*"'\e[m'; } ; TredU () { printf '\e[4;31m'"$*"'\e[m'; } TredB () { printf '\e[1;31m'"$*"'\e[m'; } ; TgreenU () { printf '\e[4;32m'"$*"'\e[m'; } TgreenB () { printf '\e[1;32m'"$*"'\e[m'; } ; TbrownU () { printf '\e[4;33m'"$*"'\e[m'; } TbrownB () { printf '\e[1;33m'"$*"'\e[m'; } ; TyellowU () { printf '\e[4;33m'"$*"'\e[m'; } TyellowB () { printf '\e[1;33m'"$*"'\e[m'; } ; TblueU () { printf '\e[4;34m'"$*"'\e[m'; } TblueB () { printf '\e[1;34m'"$*"'\e[m'; } ; TmagentaU () { printf '\e[4;35m'"$*"'\e[m'; } TmagentaB () { printf '\e[1;35m'"$*"'\e[m'; } ; TpurpleU () { printf '\e[4;35m'"$*"'\e[m'; } TpurpleB () { printf '\e[1;35m'"$*"'\e[m'; } ; TaquaU () { printf '\e[4;36m'"$*"'\e[m'; } TaquaB () { printf '\e[1;36m'"$*"'\e[m'; } ; TcyanU () { printf '\e[4;36m'"$*"'\e[m'; } TcyanB () { printf '\e[1;36m'"$*"'\e[m'; } ; TgreyU () { printf '\e[4;37m'"$*"'\e[m'; } TwhiteB () { printf '\e[1;37m'"$*"'\e[m'; } ; TwhiteU () { printf '\e[4;37m'"$*"'\e[m'; } ## ∞∞∞∞∞∞∞∞∞∞∞∞∞ Flashing Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞∞∞∞∞∞ Inverted Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## TblackF () { printf '\e[5;30m'"$*"'\e[m'; } ; TblackI () { printf '\e[7;40m'"$*"'\e[m'; } TredF () { printf '\e[5;31m'"$*"'\e[m'; } ; TredI () { printf '\e[7;41m'"$*"'\e[m'; } TgreenF () { printf '\e[5;32m'"$*"'\e[m'; } ; TgreenI () { printf '\e[7;42m'"$*"'\e[m'; } TbrownF () { printf '\e[5;33m'"$*"'\e[m'; } ; TbrownI () { printf '\e[7;43m'"$*"'\e[m'; } TyellowF () { printf '\e[5;33m'"$*"'\e[m'; } ; TyellowI () { printf '\e[7;43m'"$*"'\e[m'; } TblueF () { printf '\e[5;34m'"$*"'\e[m'; } ; TblueI () { printf '\e[7;44m'"$*"'\e[m'; } TmagentaF () { printf '\e[5;35m'"$*"'\e[m'; } ; TmagentaI () { printf '\e[7;45m'"$*"'\e[m'; } TpurpleF () { printf '\e[5;35m'"$*"'\e[m'; } ; TpurpleI () { printf '\e[7;45m'"$*"'\e[m'; } TaquaF () { printf '\e[5;36m'"$*"'\e[m'; } ; TaquaI () { printf '\e[7;46m'"$*"'\e[m'; } TcyanF () { printf '\e[5;36m'"$*"'\e[m'; } ; TcyanI () { printf '\e[7;46m'"$*"'\e[m'; } TgreyF () { printf '\e[5;37m'"$*"'\e[m'; } ; TgreyI () { printf '\e[7;47m'"$*"'\e[m'; } TwhiteF () { printf '\e[5;37m'"$*"'\e[m'; } ; TwhiteI () { printf '\e[7;47m'"$*"'\e[m'; } ## ∞∞∞∞∞∞∞∞∞∞∞∞∞ Invisible Color Text ∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞ Plain Text on Color Background ∞∞∞∞∞∞∞∞ ## TblackV () { printf '\e[8;30m'"$*"'\e[m'; } ; Bblack () { printf '\e[m'"$*"'\e[m'; } TredV () { printf '\e[8;31m'"$*"'\e[m'; } ; Bred () { printf '\e[0;41m'"$*"'\e[m'; } TgreenV () { printf '\e[8;32m'"$*"'\e[m'; } ; Bgreen () { printf '\e[0;42m'"$*"'\e[m'; } TbrownV () { printf '\e[8;33m'"$*"'\e[m'; } ; Bbrown () { printf '\e[0;43m'"$*"'\e[m'; } TyellowV () { printf '\e[8;33m'"$*"'\e[m'; } ; Byellow () { printf '\e[0;43m'"$*"'\e[m'; } TblueV () { printf '\e[8;34m'"$*"'\e[m'; } ; Bblue () { printf '\e[0;44m'"$*"'\e[m'; } TmagentaV () { printf '\e[8;35m'"$*"'\e[m'; } ; Bmagenta () { printf '\e[0;45m'"$*"'\e[m'; } TpurpleV () { printf '\e[8;35m'"$*"'\e[m'; } ; Bpurple () { printf '\e[0;45m'"$*"'\e[m'; } TaquaV () { printf '\e[8;36m'"$*"'\e[m'; } ; Baqua () { printf '\e[0;46m'"$*"'\e[m'; } TcyanV () { printf '\e[8;36m'"$*"'\e[m'; } ; Bcyan () { printf '\e[0;46m'"$*"'\e[m'; } TgreyV () { printf '\e[8;37m'"$*"'\e[m'; } ; Bgrey () { printf '\e[0;47m'"$*"'\e[m'; } TwhiteV () { printf '\e[8;37m'"$*"'\e[m'; } ; Bwhite () { printf '\e[0;47m'"$*"'\e[m'; } ## ∞∞∞∞∞∞∞∞∞ Bold Text on Color Background ∞∞∞∞∞∞∞∞ ## ∞∞∞∞∞∞ Underlined Text on Color Background ∞∞∞∞∞ ## BblackB () { printf '\e[1;40m'"$*"'\e[m'; } ; BblackU () { printf '\e[4;40m'"$*"'\e[m'; } BredB () { printf '\e[1;41m'"$*"'\e[m'; } ; BredU () { printf '\e[4;41m'"$*"'\e[m'; } BgreenB () { printf '\e[1;42m'"$*"'\e[m'; } ; BgreenU () { printf '\e[4;42m'"$*"'\e[m'; } BbrownB () { printf '\e[1;43m'"$*"'\e[m'; } ; BbrownU () { printf '\e[4;43m'"$*"'\e[m'; } ByellowB () { printf '\e[1;43m'"$*"'\e[m'; } ; ByellowU () { printf '\e[4;43m'"$*"'\e[m'; } BblueB () { printf '\e[1;44m'"$*"'\e[m'; } ; BblueU () { printf '\e[4;44m'"$*"'\e[m'; } BmagentaB () { printf '\e[1;45m'"$*"'\e[m'; } ; BmagentaU () { printf '\e[4;45m'"$*"'\e[m'; } BpurpleB () { printf '\e[1;45m'"$*"'\e[m'; } ; BpurpleU () { printf '\e[4;45m'"$*"'\e[m'; } BaquaB () { printf '\e[1;46m'"$*"'\e[m'; } ; BaquaU () { printf '\e[4;46m'"$*"'\e[m'; } BcyanB () { printf '\e[1;46m'"$*"'\e[m'; } ; BcyanU () { printf '\e[4;46m'"$*"'\e[m'; } BgreyB () { printf '\e[1;47m'"$*"'\e[m'; } ; BgreyU () { printf '\e[4;47m'"$*"'\e[m'; } BwhiteB () { printf '\e[1;47m'"$*"'\e[m'; } ; BwhiteU () { printf '\e[4;47m'"$*"'\e[m'; } ## ∞∞∞∞∞∞∞ Flashing Text on Color Background ∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞ Inverted Text on Color Background ∞∞∞∞∞∞ ## BblackF () { printf '\e[5;40m'"$*"'\e[m'; } ; BblackI () { printf '\e[7;30m'"$*"'\e[m'; } BredF () { printf '\e[5;41m'"$*"'\e[m'; } ; BredI () { printf '\e[7;31m'"$*"'\e[m'; } BgreenF () { printf '\e[5;42m'"$*"'\e[m'; } ; BgreenI () { printf '\e[7;32m'"$*"'\e[m'; } BbrownF () { printf '\e[5;43m'"$*"'\e[m'; } ; BbrownI () { printf '\e[7;33m'"$*"'\e[m'; } ByellowF () { printf '\e[5;43m'"$*"'\e[m'; } ; ByellowI () { printf '\e[7;33m'"$*"'\e[m'; } BblueF () { printf '\e[5;44m'"$*"'\e[m'; } ; BblueI () { printf '\e[7;34m'"$*"'\e[m'; } BmagentaF () { printf '\e[5;45m'"$*"'\e[m'; } ; BmagentaI () { printf '\e[7;35m'"$*"'\e[m'; } BpurpleF () { printf '\e[5;45m'"$*"'\e[m'; } ; BpurpleI () { printf '\e[7;35m'"$*"'\e[m'; } BaquaF () { printf '\e[5;46m'"$*"'\e[m'; } ; BaquaI () { printf '\e[7;36m'"$*"'\e[m'; } BcyanF () { printf '\e[5;46m'"$*"'\e[m'; } ; BcyanI () { printf '\e[7;36m'"$*"'\e[m'; } BgreyF () { printf '\e[5;47m'"$*"'\e[m'; } ; BgreyI () { printf '\e[7;37m'"$*"'\e[m'; } BwhiteF () { printf '\e[5;47m'"$*"'\e[m'; } ; BwhiteI () { printf '\e[7;37m'"$*"'\e[m'; } ## ∞∞∞∞∞∞ Invisible Text on Color Background ∞∞∞∞∞∞ ## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ Color Code Notes ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## BblackV () { printf '\e[8;40m'"$*"'\e[m'; } ## Unless I missed something or made a mistake, I ## BredV () { printf '\e[8;41m'"$*"'\e[m'; } ## calculate a total of 7681 different color codes, ## BgreenV () { printf '\e[8;42m'"$*"'\e[m'; } ## none of which produce a duplicate result. ## BbrownV () { printf '\e[8;43m'"$*"'\e[m'; } ## These will be fine for now. ## ByellowV () { printf '\e[8;43m'"$*"'\e[m'; } BblueV () { printf '\e[8;44m'"$*"'\e[m'; } BmagentaV () { printf '\e[8;45m'"$*"'\e[m'; } BpurpleV () { printf '\e[8;45m'"$*"'\e[m'; } BaquaV () { printf '\e[8;46m'"$*"'\e[m'; } BcyanV () { printf '\e[8;46m'"$*"'\e[m'; } BgreyV () { printf '\e[8;47m'"$*"'\e[m'; } BwhiteV () { printf '\e[8;47m'"$*"'\e[m'; } ## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## ``

    唯一要记住的是,当需要% 百分号或\ 反斜杠时,您需要将它们加倍:
    喜欢:printf "$(Tblue "%%s")\n" 'hi'
    但不适用于Tblue "%s\n" 'hi'
    printf "$(Tblue "%s" 'hi')\n"

    由于这些使用 printf,您可以执行以下操作:

     printf "hi $(Tred there) man $(BaquaI "%c" '!') $(Bold 'This \\t is %%s') %s\n" "$(BgreenB 'super')" "$(Bblue mega Colorful)"
    或在回声中:
     echo "hi $(Tred there) man $(BaquaI "%c" '!') $(Bold 'This \\t is %s' "$(BblackB 'super')") $(Bblue mega Colorful)"
    一个更有用的例子:
    printf "\t%s Volume \"%s\" is not connected.\n" "$(TwhiteB [)$(TredB Error)$(TwhiteB \]:)" "$(Tbrown $Volume)"
    或使用其他命令:
    eval "echo 'This is OSX' | sed 's:OSX:$(Invert [)$(TaquaF OSX)$(Invert ]):'"
    或者更时髦的东西:
    find . -exec stat -f "Name: $(Tbrown %%N)%t%t$(Tpurple "->")%tPermissions: $(Tgreen %%Sp)" {} \;

    发挥你的想象力!随意使用这些......我唯一要问的是,如果有人在那里输入更多,混合/匹配它们,比如 TcyanBgreenUI,或者自己起名字......你能帮我发布它们吗?让我知道这个帖子?或通过 aesth1r@me.com 将它们发送给我。我懒得输入所有种可能性。

    享受吧!

    -- 艾斯提

    【讨论】:

    • 感谢分享这项出色的工作——不幸的是,它与 OP 的原始问题存在相同的问题,即 Bash 提示特别需要 \[\] 序列才能计算正确的字符串长度。不幸的是,我无法从 printf 语句中找到正确提供这些序列的方法。
    • 啊,好吧,我终于找到了一种方法,可以将这些函数与正确的转义序列一起用于命令提示符。我没有尝试为 $PS1 提供一个始终有效的字符串,而是定义了一个每次都重建提示的函数,并将其添加到 $PROMPT_COMMAND。例如:TredB () { echo -n "\[\e[1;31m\]$*\[\e[m\]"; }build_prompt () { PS1="$(TredB \\w) #"; }PROMPT_COMMAND="${PROMPT_COMMAND} build_prompt;"
    猜你喜欢
    • 2014-04-23
    • 1970-01-01
    • 2017-11-29
    • 2011-10-28
    • 2012-08-25
    • 2021-06-16
    • 1970-01-01
    • 2023-03-17
    • 2018-01-22
    相关资源
    最近更新 更多