Ich habe eine Bash-Eingabeaufforderung (mit PROMPT_FUNCTION) wie folgt definiert:
function get_hg_prompt_prefix() {
local APPLIED_COLOR=$1; shift
local UNAPPLIED_COLOR=$1; shift
local ALERT_COLOUR=$1; shift
local TEXTCOLOR=$1; shift
local mercurial_prompt_line="{{patches|join(:)|pre_applied(${APPLIED_COLOR})|post_applied(${TEXTCOLOR})|pre_unapplied(${UNAPPLIED_COLOR})|post_unapplied(${TEXTCOLOR})}\n\r}"
local mercurial_status_prompt="{ ${ALERT_COLOUR}{status}${TEXTCOLOR}}"
echo "$(hg prompt "${mercurial_prompt_line}" 2>/dev/null)$(hg prompt "${mercurial_status_prompt}" 2>/dev/null)"
}
function set_prompt() {
bright='\[[01m\]'
colors_reset='\[[00m\]'
HOSTCOLOR=${colors_reset}='\[[34m\]'
USERCOLOR=${colors_reset}='\[[01m\]'
TEXTCOLOR=${colors_reset}='\[[32m\]'
APPLIED_COLOR=${colors_reset}='\[[32m\]'
UNAPPLIED_COLOR=${colors_reset}='\[[37m\]'
ALERT_COLOUR=${colors_reset}='\[[31m\]'
hg_status="$(get_hg_prompt_prefix $APPLIED_COLOR $UNAPPLIED_COLOR $ALERT_COLOUR $TEXTCOLOR)"
ps1_prefix="${hg_status}$colors_reset($bright$(basename $VIRTUAL_ENV)$colors_reset) "
PROMPTEND='$'
PS1="${ps1_prefix}${USERCOLOR}\u${colors_reset}${TEXTCOLOR}@${colors_reset}${HOSTCOLOR}\h${colors_reset}${TEXTCOLOR} (\W) ${PROMPTEND}${colors_reset} "
}
PROMPT_COMMAND=set_prompt
Im Allgemeinen erhalte ich dadurch eine mehrzeilige Eingabeaufforderung, die einige Informationen zum HG-Status sowie meine aktuelle virtuelle Umgebung anzeigt und (ohne Farbe) folgendermaßen aussieht:
buggy-wins.patch
! (saas) user@computer (~) $
Das Problem ist, dass dies mit der Berechnung der Länge der Eingabeaufforderung (glaube ich!) Verschraubt wird und seltsame Probleme beim Umschließen des Terminals und bei der Platzierung des Cursors verursacht. In einem 80-Zeichen-Terminal wird beispielsweise die Eingabeaufforderung angezeigt (das ** - umgebene Zeichen ist die Cursorposition):
~) $ **a**nis) crose@chris-rose (~
In Terminals, die breit genug sind, um die Eingabeaufforderung anzuzeigen, erfolgt der Zeilenumbruch viel früher als erwartet. Hier ist der meiste Text, den ich in die erste Zeile der Eingabeaufforderung in einem 108 Zeichen breiten Terminalfenster einfügen kann (wieder markiert das ** meine Cursorposition):
**(**advanis) crose@chris-rose (~) $ sdkfjlskdjflksdjff
Wenn die Zeile umbrochen wird, wird die Eingabeaufforderung überschrieben. Die zweite Eingabezeile verläuft jedoch bis zum Rand des Terminals und wird dann korrekt umbrochen.
Es ist also klar, dass etwas mit der Breite der Eingabeaufforderung zu tun hat. Wie kann ich veranlassen, dass bash die Länge der PS1-Zeichenfolge nicht anhand der ANSI-Escape-Codes, sondern anhand der tatsächlich angezeigten Länge der Eingabeaufforderung ermittelt?