O prompt do Bash não quebra linhas longas, e eu acho que tudo é escapado?

0

Aqui está o meu .bash_profile

export CLICOLOR=1
export LSCOLORS=exfxcxdxbxegedabagacad

# define colors
C_DEFAULT="\[3[m\]"
C_WHITE="\[3[1m\]"
C_BLACK="\[3[30m\]"
C_RED="\[3[31m\]"
C_GREEN="\[3[32m\]"
C_YELLOW="\[3[33m\]"
C_BLUE="\[3[34m\]"
C_PURPLE="\[3[35m\]"
C_CYAN="\[3[36m\]"
C_LIGHTGRAY="\[3[37m\]"
C_DARKGRAY="\[3[1;30m\]"
C_LIGHTRED="\[3[1;31m\]"
C_LIGHTGREEN="\[3[1;32m\]"
C_LIGHTYELLOW="\[3[1;33m\]"
C_LIGHTBLUE="\[3[1;34m\]"
C_LIGHTPURPLE="\[3[1;35m\]"
C_LIGHTCYAN="\[3[1;36m\]"
C_BG_BLACK="\[3[40m\]"
C_BG_RED="\[3[41m\]"
C_BG_GREEN="\[3[42m\]"
C_BG_YELLOW="\[3[43m\]"
C_BG_BLUE="\[3[44m\]"
C_BG_PURPLE="\[3[45m\]"
C_BG_CYAN="\[3[46m\]"
C_BG_LIGHTGRAY="\[3[47m\]"

# Prompt
if [ -f $(brew --prefix)/etc/bash_completion ]; then
  . $(brew --prefix)/etc/bash_completion
fi

source $(brew --prefix)/etc/bash_completion.d/git-prompt.sh
GIT_PS1_SHOWDIRTYSTATE=true

# PS1="\h:\W \u\$(__git_ps1 \" (%s) \")\$"
PS1="$C_YELLOW\w $C_PURPLE\$(__git_ps1 \"(%s) \")$C_DEFAULT\n ☠️   "

Quando eu insiro / copio e colo uma linha longa, ela não é quebrada em uma nova linha. Em vez disso, substitui o existente. Ele também não apagará todos os caracteres se eu voltar ao início.

Eu olhei para algumas outras respostas, e todas elas sugerem que o envolvimento pode ser o problema, mas tudo parece estar bem envolvido?

    
por Kevin Whitaker 24.10.2017 / 16:06

2 respostas

1

O BASH está contando todos os caracteres, imprimíveis ou não, como o tamanho do prompt. O comprimento calculado do prompt determina onde o envoltório ocorre. O comprimento calculado é a variável que precisa ser alterada. Remover o espaço depois de ☠️ e adicionar outro \[ \] faz com que o BASH calcule a posição para o wrap corretamente em minha máquina atual usando o macOS High Sierra, BASH 4.4.12 e iTerm 3.1.4.

PS1="$C_YELLOW\w $C_PURPLE\$(__git_ps1 \"(%s) \")$C_DEFAULT\n☠️\[ \]"
    
por 24.10.2017 / 16:51
3

** Se a resposta de Christopher não resolver isso para você ...

Todo código de escape precisa estar cercado por \[ e \] . Perder apenas um único ou ter um par incompatível e você provavelmente vai acabar com problemas como você está vendo. Eu não sei o que está em __git_ps1 , então é difícil dizer o que está errado.

Se você ainda está preso, aqui está uma pequena "dica de depuração". :) Você pode fazer uma inspeção manual simples, descarregando seu prompt em um arquivo de texto e exibindo-o em vi . Isso garantirá que nada seja renderizado e você verá os caracteres reais (por exemplo, versus apenas echo $PS1 da linha de comando).

echo $PS1 > ps1
vi ps1

Se houver muitos códigos, você poderá verificar se encontrou o número de colchetes correspondente inserindo :%s/\[//n e, em seguida, :%s/\]//n . Isso lhe dará uma contagem de abertura e fechamento de colchetes de escape ... pelo menos você será capaz de descartar qualquer parêntesis não pareados confirmando que ambas as contagens são as mesmas. (Eu tenho prompts bastante complexos e fui mordido pelo erro de incompatibilidade mais de uma vez!)

Ainda não consegue descobrir? Copie o conteúdo desse arquivo aqui para que possamos inspecioná-lo.

    
por 24.10.2017 / 16:57

Tags