Parte da linha do terminal desaparece ao pressionar a seta para baixo

2

Eu uso um PS1 personalizado para exibir informações mais relevantes no meu terminal, como se eu estivesse em um diretório git e estivesse limpo ou precisasse confirmar alterações. No entanto, às vezes, quando estou passando por comandos, parte da linha terminal desaparece:

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

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

Existe alguma razão em particular por que parte da linha está sendo cortada com essa configuração do PS1?

Veja algumas informações adicionais:

Meu TERM env var é xterm-256color . Aqui está o meu .bash_profile :

red='3[0;31m'
yellow='3[0;32m'
orange='3[0;33m'
blue='3[0;34m'
pink='3[0;35m'
NC='3[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)\] > "
    
por josh 10.06.2015 / 16:15

2 respostas

2

A sugestão do @ i_am_root de colocar \[ e \] dentro da definição de red e similares é boa. No entanto, por this , o bash processa apenas \[ e \] em PS1 , não no texto incluído em PS1 por $() . Portanto, use \x0121 e \x02 (ou red e \[ ) dentro de \] e similares em vez de %code%2121 e %code% .

Observação: por esta resposta , somente os códigos de escape devem estar em %code% e %code% . O texto que ficará visível para o usuário deve estar fora do %code% e %code% , de modo que o bash saiba que ocupa espaço na tela e pode ser responsável por isso ao redesenhar.

    
por 10.06.2015 / 17:05
1

Códigos de cores bash, caracteres que escapam, atribuições e tais se confundem rapidamente.

Experimente este exemplo de código que substitui os comandos echo adicionando à variável PS1 .

red='\[3[0;31m\]'
yellow='\[3[0;32m\]'
orange='\[3[0;33m\]'
blue='\[3[0;34m\]'
pink='\[3[0;35m\]'
NC='\[3[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) > "
    
por 10.06.2015 / 16:54