Ein Teil der Terminalzeile verschwindet, wenn Sie den Pfeil nach unten drücken

Ein Teil der Terminalzeile verschwindet, wenn Sie den Pfeil nach unten drücken

Ich verwende ein benutzerdefiniertes PS1, um relevantere Informationen in meinem Terminal anzuzeigen, z. B. ob ich mich in einem Git-Verzeichnis befinde und ob es sauber ist oder Änderungen vorgenommen werden müssen. Manchmal verschwindet jedoch ein Teil der Terminalzeile, wenn ich mit den Pfeiltasten durch die Befehle blättere:

@ ~/tests/testing [tests] > grunt
# up arrow, down arrow
@ ~/tests/testing [t

Im Wesentlichen wird das ests] >abgeschnitten und mir bleibt nur das übrig [t.

Gibt es einen bestimmten Grund, warum bei dieser PS1-Konfiguration ein Teil der Leitung abgeschnitten wird?

Hier sind einige zusätzliche Informationen:

Meine TERM-Umgebungsvariable ist xterm-256color. Hier ist meine .bash_profile:

red='\033[0;31m'
yellow='\033[0;32m'
orange='\033[0;33m'
blue='\033[0;34m'
pink='\033[0;35m'
NC='\033[0m'

function is_git {
  if git rev-parse --is-inside-work-tree 2>/dev/null; then
    return 1
  else
    return 0
  fi
}

function stuff {
  if [ $(is_git) ]; then
    git_dir="$(git rev-parse --git-dir 2>/dev/null)"

    if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
      echo -en " [${orange}init${NC}]"
      return
    fi

    echo -n " ["
    if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
      echo -en "${red}"
    else
      echo -en "${blue}"
    fi
    echo -en "$(git rev-parse --abbrev-ref HEAD)${NC}]"
  fi
}

export PS1="@ \w\[\$(stuff)\]\[\$(tput sgr0)\] > "

Antwort1

Der Vorschlag von @i_am_root, das \[und \]in die Definition von redund dergleichen einzufügen, ist gut. AllerdingsDas, Bash verarbeitet \[und nur \]in PS1, nicht in Text, der in PS1von enthalten ist $(). Verwenden Sie daher \001und \002(oder \x01und \x02) innerhalb redvon und dergleichen anstelle von \[und \].

Hinweis: Prodiese Antwort, nur die Escape-Codes sollten in \001und stehen \002. Der für den Benutzer sichtbare Text sollte außerhalb von \001und stehen \002, damit Bash weiß, dass er Platz auf dem Bildschirm einnimmt und dies beim Neuzeichnen berücksichtigen kann.

Antwort2

Bash-Farbcodes, Escape-Zeichen, Zuweisungen und dergleichen können schnell verwirrend sein.

Probieren Sie dieses Codebeispiel aus, das die echoBefehle durch Hinzufügen zur PS1Variablen ersetzt.

red='\[\033[0;31m\]'
yellow='\[\033[0;32m\]'
orange='\[\033[0;33m\]'
blue='\[\033[0;34m\]'
pink='\[\033[0;35m\]'
NC='\[\033[0m\]'

export PS1="@ \w"

function is_git {
  if git rev-parse --is-inside-work-tree 2>/dev/null; then
    return 1
  else
    return 0
  fi
}

function stuff {
  if [ $(is_git) ]; then
    git_dir="$(git rev-parse --git-dir 2>/dev/null)"

    if [ -z "$(ls -A ${git_dir}/refs/heads )" ]; then
      PS1="${PS1} [${orange}init${NC}]"
      return
    fi

    PS1="$PS1 ["
    if [ $(git status --porcelain 2>/dev/null| wc -l | tr -d ' ') -ne 0 ]; then
      PS1="${PS1}${red}"
    else
      PS1="${PS1}${blue}"
    fi
    PS1="${PS1}$(git rev-parse --abbrev-ref HEAD)${NC}]"
  fi
}

stuff
PS1="${PS1}$(tput sgr0) > "

verwandte Informationen