2008-12-04 10 views
24

Hier ist meine PS1 Variable:PS1 Zeilenumbruch mit Farben Problem

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

zum Aufgreifen meines Git-Zweigs großer Arbeiten, aber es hat die unglückliche Nebenwirkung die Linien Einwickeln, wenn die Farben aktiv sind, so dass sie sich überlappen, wenn Sie lange Befehle verwenden.

Kann mir jemand mit magischen PS1 Fähigkeiten helfen, dies zu beheben?

Antwort

39

Bekam es, um den Farben richtig zu entkommen.

Fix:

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

Danke, dass mein Tag! – Viktiglemma

+5

Und für diejenigen, die zu faul sind, ein Diff zu machen, sollten terminale Escape-Zeichen von '\ [' '\]' umgeben sein, damit bash Druckzeichen am Anfang der Zeile korrekt zählen kann. http://manpages.ubuntu.com/manpages/precise/en/man1/bash.1.html#contenttoc26 – alberge

+0

Aupajo, ich habe ein ähnliches Problem, mit einer generierten PS1. Ich weiß nicht genug, um zu sehen, was nicht richtig entkommt. Irgendwelche Vorschläge? Mein Befehl ist: 'Export PS1 =" \ [\ e [0; 40m \] \ h: \ W \ u \ 033 [0; 32m \ $ (parse_git_branch) \ [\ e [0m \] $ "' – karl

16

Darf ich vorschlagen, die folgende Methode für Farben in Bash, es der Code viel besser lesbar macht und viel schwieriger für Sie, eine Flucht oder zwei zu verpassen.

gebe folgende in Ihrer ~/.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) 

Eine Probe PS1 (oder wirklich alles, was auf dem Bildschirm ausgibt) sein würde:

PS1="\[${WHITE}\](\[${YELLOW}\]\[email protected]\h\[${WHITE}\])\[${NORMAL}\]$ " 

Sie brauchen setzen \ nur [\ ] um die Farbwörter.

Wenn Sie eine 256-Farben-Terminal haben, können Sie mit anderen numerischen Werten experimentieren zu ‚tput setaf‘ den ganzen Weg bis zu 255

+0

Oh, das ist einfach, klar und großartig. Habt ein paar Repräsentanten, auf dem Haus. – Aupajo

1

Dies sind die Farbfunktionen ich regelmäßig verwenden ... schrieb sie Jahre Vor und haben sich so an sie gewöhnt, dass sie ein fester Bestandteil meines Scripting sind. Kleben Sie diesen Codeblock einfach in Ihre .bashrc-Datei, starten Sie eine neue Sitzung und schon sind Sie fertig!

Ich benutze diese so bunt/modisch printf Ersatz:

## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ [ 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'; } 
## ∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞∞ ## 
``

Das einzige, was im Auge zu behalten, wenn ein % Prozentzeichen oder einen \ Backslash will, müssen Sie sie im Innern verdoppeln:
mag: printf "$(Tblue "%%s")\n" 'hi'
aber nicht für Tblue "%s\n" 'hi'
oder printf "$(Tblue "%s" 'hi')\n"

Da diese Verwendung printf können Sie tun Sachen wie:

printf "hi $(Tred there) man $(BaquaI "%c" '!') $(Bold 'This \\t is %%s') %s\n" "$(BgreenB 'super')" "$(Bblue mega Colorful)"
oder in einem Echo:
echo "hi $(Tred there) man $(BaquaI "%c" '!') $(Bold 'This \\t is %s' "$(BblackB 'super')") $(Bblue mega Colorful)"
Ein nützliches Beispiel:
printf "\t%s Volume \"%s\" is not connected.\n" "$(TwhiteB [)$(TredB Error)$(TwhiteB \]:)" "$(Tbrown $Volume)"
Oder mit anderen Befehlen:
eval "echo 'This is OSX' | sed 's:OSX:$(Invert [)$(TaquaF OSX)$(Invert ]):'"
Oder etwas mit ein bisschen mehr Swank:
find . -exec stat -f "Name: $(Tbrown %%N)%t%t$(Tpurple "->")%tPermissions: $(Tgreen %%Sp)" {} \;

Nutzen Sie Ihre Vorstellungskraft! Fühlen Sie sich frei, diese zu benutzen ... das einzige, was ich frage, ist, wenn jemand da draußen mehr von ihnen tippt, sie mischt/zusammenbringt, wie TcyanBgreenUI, oder sich eigene Namen zusammensetzt ... können Sie sie bitte für mich und lassen Sie mich wissen über die Post? oder mailen Sie sie mir unter [email protected]. Ich bin zu faul zum tippen alle Möglichkeiten.

Viel Spaß!

- Aesthir

+1

Danke für das Teilen dieser genialen Arbeit - leider hat es das gleiche Problem wie das Original von OP, das ist, dass die Bash-Eingabeaufforderung speziell die '\ [' und '\]' Sequenzen benötigt, um die richtige Stringlänge zu berechnen. Leider konnte ich keine Möglichkeit finden, diese Sequenzen in einer printf-Anweisung korrekt zur Verfügung zu stellen. –

+0

Ah, okay, ich habe endlich einen Weg gefunden, Funktionen wie diese mit den richtigen Escape-Sequenzen für eine Eingabeaufforderung zu verwenden. Anstatt zu versuchen, eine einzige Zeichenfolge für $ PS1 zu entwickeln, die immer funktioniert, habe ich eine Funktion definiert, die die Eingabeaufforderung jedes Mal neu erstellt und zu $ ​​PROMPT_COMMAND hinzugefügt hat. z.B.: 'TredB() {echo -n" \ [\ e [1; 31m \] $ * \ [\ e [m \] "; } ' ' build_prompt() {PS1 = "$ (TredB \\ w) #"; } ' ' PROMPT_COMMAND = "$ {PROMPT_COMMAND} build_prompt;" –