python152
python152

Reputation: 1941

Why this two-line bash prompt is messing up the command history

I have my bash prompt as:

\u@\H: \w$(__git_ps1 "[\[\e[0;32m\]%s\[\e[0m\]\[\e[0;33m\]$(parse_git_dirty)\[\e[0m\]]")\n\e[1m\t\e[0m $

so the second line is to display current time.

However, I have found it is messing up the history - when use arrow key to move up, a port of command seems get "stuck" and won't change it anymore. The only way I get back is to press Enter again. How to fix it?

Upvotes: 2

Views: 249

Answers (1)

John Kugelman
John Kugelman

Reputation: 361575

\u@\H: \w$(__git_ps1 "[\[\e[0;32m\]%s\[\e[0m\]\[\e[0;33m\]$(parse_git_dirty)\[\e[0m\]]")\n\e[1m\t\e[0m $
#                                                                                         ^^^^^  ^^^^^

All of the ANSI escape sequences on the first line are correctly surrounded by \[ and \], which tell Bash to not to count those characters when figuring out the visual length of the prompt. The ones on the second line are missing these delimiters.

PS1='\u@\H: \w$(__git_ps1 "[\[\e[0;32m\]%s\[\e[0m\]\[\e[0;33m\]$(parse_git_dirty)\[\e[0m\]]")\n\[\e[1m\]\t\[\e[0m\] $'
#                                                                                              ^^     ^^  ^^     ^^

Upvotes: 1

Related Questions