Long lines overlap in Bash PS1 customized prompt

15,191

Solution 1

Here is my fancy two-line PS1 for bash prompt.

PS1

\[\e[1;32m\]\H\[\e[0m\] :: \[\e[1;30m\]\d\[\e[0m\] \@ :: \[\e[1;33m\]\w\n\[\e[1;34m\]\u $ \[\033[0m\]

So here is what I did. If this was my color:

\e[1;32m

I changed it to:

\[\e[1;32m\]

Essentially you need to enclose it in:

\[$mycolor\]

Checkout this answer.

Solution 2

Found this solution online, which suggested a closing brackets to color variables:

Change this:

Black='\e[0;30m'        # Black
Red='\e[0;31m'          # Red
Green='\e[0;32m'        # Green

to:

Black='\e[0;30m\]'        # Black
Red='\e[0;31m\]'          # Red
Green='\e[0;32m\]'        # Green

I've committed the change - hope it works as expected.

Solution 3

My preferred solution to the issue of long lines overlap in bash PS1 is to have a \n at the end of PS1 prompt line(s).

e.g.

enter image description here

If you want all my other stuff - time, user, host, directory and git branch(!) you can use this (mac or linux):

https://unix.stackexchange.com/a/124012/10043

Share:
15,191

Related videos on Youtube

Adam Matan
Author by

Adam Matan

Team leader, developer, and public speaker. I build end-to-end apps using modern cloud infrastructure, especially serverless tools. My current position is R&D Manager at Corvid by Wix.com, a serverless platform for rapid web app generation. My CV and contact details are available on my Github README.

Updated on September 18, 2022

Comments

  • Adam Matan
    Adam Matan almost 2 years

    I have configured a fancy two-line PS1 bash prompt, with server name, time, user name and other useful variables.

    PS1="\n\[\033[1;34m\]\342\226\210\342\226\210 \u @ $SERVER_NAME""$BBlue"" \w""$Color_Off  \n\[\033[0;36m\]\342\226\210\342\226\210 \d \t $ \[\033[0;39m\]"
    

    enter image description here

    Full Github source here.

    The problem is that long lines are often wrapped around themselves, meaning that the new line overlaps the previous one.

    The problem is inconsistent: some lines are wrapped correctly, some are not.

    Any idea how to fix this?

  • Adam Matan
    Adam Matan over 11 years
    +1 Thanks. Oddly enough, it doesn't seem to work on mac.
  • dylnmc
    dylnmc almost 8 years
    for git branch you should use if [[ $(git rev-parse --is-inside-git-dir 2> /dev/null) ]]; then branch="$( git symbolic-ref --short -q HEAD 2> /dev/null )"; fi. This is a standard when putting git into a script and evaluating the branch name from what I have read previously.
  • dylnmc
    dylnmc almost 8 years
    not sure what this is supposed to achieve. You need to wrap anything that doesn't take up space (ansi-escapes) in \[ \], so you can't just end all the ansi-escape colors with \] because what if there isn't a \[. When you are putting in non-printable chars, you should just wrap them in \[ \] (e.g. PS1='\[\e[32;1m\] green prompt \[\e[0m\] $').
  • Alex Summers
    Alex Summers over 6 years
    You're a life saver! As for mac, Adam.. It's most likely due to the column count. Try setting the prompt to just a string of characters, like 'this is my prompt: ' and see if the problem persists. If so, your column setting on your terminal is either too wide or too narrow.
  • Alex Summers
    Alex Summers over 6 years
    Indeed! Without the opening \[, this boshes the prompt for us linux users. Maybe it's different for OSX? How strange. \[ and \e[ are interpreted as two different things for linux. The first indicates to bash that the sequence following is unprintable and not to count it as part of the displayed characters of the prompt. The \e[ is the escape bracket to start an ANSI color scheme.
  • user2364305
    user2364305 over 3 years
    This is the only solution to long PS1's breaking when the terminal is small and being resized