Recentemente ajustei um pouco meu PS1. O código da seguinte forma:
PS1='$(if [[ $? != 0 ]]; then echo " \e[91m\e[0m"; fi) \u $(assemble_prompt)$ '
O caractere que falta é defontes nerde não importa na minha pergunta (assim como assemble_prompt
na função).
O problema que encontrei é um PS1 quebrado quando reduzo o tamanho da janela do terminal para o tamanho de um prompt (aproximadamente). Então parece ignorar a configuração do PS1 e definir o PS1 $
apenas para caracteres (veja a captura de tela). Observe que, quando começo a digitar, ele simplesmente substitui meu prompt personalizado nesta ocasião.
Limitei o problema a uma cláusula if que adiciona o caractere "fail" se o comando anterior não tiver êxito. Se eu remover essa parte, tudo funcionará conforme o esperado.
Existe uma maneira de manter if
parte da cláusula, mas corrigir o problema de redefinição do PS1 quando o tamanho da janela é muito pequeno?
PS Eu uso rxvt-unicode
como meu terminal, mas o problema persiste em todos os outros terminais também (testado xterm
, st
).
Responder1
Você provavelmente deseja incluir os códigos de controle do terminal para \[...\]
informar ao Bash que eles não estão realmente imprimindo caracteres. Caso contrário, eles confundirão o shell ao tentar contar a largura do prompt.
Então use "\[\e[91m\]xxx\[\e[0m\]"
.
Demanual:
\[ Begin a sequence of non-printing characters.
This could be used to embed a terminal control sequence into the prompt.
\] End a sequence of non-printing characters.