Parte da linha terminal desaparece ao pressionar a seta para baixo

Parte da linha terminal desaparece ao pressionar a seta para baixo

Eu uso um PS1 personalizado para exibir informações mais relevantes em meu terminal, como se estou em um diretório git e se ele está limpo ou precisa confirmar alterações. No entanto, às vezes, quando estou navegando pelos comandos, parte da linha do terminal desaparece:

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

Essencialmente, o arquivo ests] >é cortado e fico apenas com o arquivo [t.

Existe alguma razão específica pela qual parte da linha foi cortada com esta configuração do PS1?

Aqui estão algumas informações adicionais:

Meu TERM env var é xterm-256color. Aqui está o meu .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)\] > "

Responder1

A sugestão de @i_am_root de colocar \[e \]dentro da definição de rede similares é boa. No entanto, poresse, o bash processa apenas \[and \]in PS1, não no texto incluído em PS1by $(). Portanto, use \001and \002(ou \x01and \x02) inside rede similares em vez de \[and \].

Nota: Poresta resposta, apenas os códigos de escape devem estar em \001e \002. O texto que ficará visível para o usuário deve estar fora do \001e \002para que o bash saiba que ocupa espaço na tela e possa contabilizar isso ao redesenhar.

Responder2

Códigos de cores Bash, caracteres de escape, atribuições e outros ficam confusos rapidamente.

Experimente este exemplo de código que substitui os echocomandos adicionando à PS1variável.

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) > "

informação relacionada