Estou usando o bash no cygwin em um laptop Windows. Gostaria de poder alterar a cor de fundo do meu terminal para verde (a cor real é irrelevante) e, para isso, posso usar um destes comandos:
tput setb 2; echo
printf '\e]11;#00FF00\a'
Para obter mais informações sobre o que isso printf
está fazendo, consulte how-to-set-the-background-color-of-the-linux-console-screen e o uso específico de 11
for background está documentado na página 34 de https://invisible- ilha.net/xterm/ctlseqs/ctlseqs.pdf ( Ps = 1 0 → Change VT100 text foreground color to Pt.
e Ps = 1 1 → Change VT100 text background color to Pt.
)
O printf
altera imediatamente o fundo de todo o terminal enquanto tput
apenas define a cor do que é digitado a seguir, daí echo
começar na próxima linha vazia, mas não me importo muito com isso. O que mais me importa é o seguinte:
Deixa tput
uma pequena borda na cor de fundo original (bege claro, definido pela GUI "Opções" que obtenho clicando no canto superior esquerdo do terminal), como pode ser visto nesta imagem (o cinza claro ao redor da esquerda/inferior da imagem é a cor da minha área de trabalho do Windows):
O printf
muda a cor da borda (é um tom de verde mais claro, tput
mas isso é irrelevante):
mas isso não altera a área do plano de fundo definida, tput
a menos que eu primeiro reinicialize o que meu original tput
fez tput init; echo
e depois execute printf
:
Posso apenas usar o printf
para conseguir o que quero, desde que não use tput setb
primeiro, mas prefiro usar apenastput setb
se puder para portabilidade, então - por que está tput
deixando uma pequena borda da cor de fundo existente e existe alguma maneira dizer tput
para definir a cor de fundo de uma forma que não deixe aquela pequena borda?
Eu também gostaria de saber se existe uma maneira de definir tput
todo o plano de fundo do terminal imediatamente, como printf
acontece, em vez de após a próxima string digitada, mas isso não é tão importante quanto se livrar dessa borda.
Informações adicionais agora que @MarcusMüller me deu a dica em um comentário de que isso pode ser um mintty
problema -
Vejo esse mesmo comportamento quando uso git bash
o Windows em uma máquina diferente. Aparentemente, ambos usam mintty
como emulador de terminal. Como tenho que fazer login em muitas máquinas Windows diferentes e usar cygwin
or git bash
, gostaria de poder resolver esse problema sem precisar alterar o emulador de terminal toda vez que uso uma dessas máquinas (nem tenho certeza se/como eu poderia fazer isso). Na verdade, se fosse necessário mudar o emulador de terminal para resolver o tput
problema, eu simplesmente usaria a printf
abordagem.
Encontrei em set-border-width-for-mintty-window-on-cygwin-windows-10 uma maneira de controlar a largura da borda ~/.minttyrc
definindo a Padding
variável e se eu atualizá-la para dizer:
Padding=0
então isso resolve o tput
problema acima, mas
- Isso significaria que eu teria que alterar o
.minttyrc
em cada máquina em que fizer login e reiniciar o terminal depois, e - Quando abro a GUI "Opções" para alterar qualquer coisa no terminal e salvá-lo, ele sobrescreve o
.minttyrc
arquivo e remove aPadding
configuração
então eu ainda gostaria de encontrar uma maneira de simplesmente tput
preencher essa área de "preenchimento" assim como faz com o resto do plano de fundo.
@Vilinkameni também aponta em um comentário que, com o acima exposto tput
em um terminal mintty
and MSYS2 MINGW64
, qualquer troca de cor ANSI SGR por um ls --color
comando subsequente ou outro que use cores irá efetivamente redefinir a cor novamente. Isso não acontece se eu usar o acima, printf
então posso perguntar sobre isso em uma pergunta subsequente.
Consulte também "Alterar cores" na parte inferior https://code.google.com/archive/p/mintty/wikis/Tips.wiki#Changing_colours para obter mais informações sobre o acima printf
e outras coisas relacionadas a mintty
. Meu $TERM
valor é xterm
.
O melhor que posso dizer com base em leituras adicionais e na discussão nos comentários da minha pergunta é que a resposta é - não use
tput setb 2
para isso e use aprintf
abordagem:porque:
tput
abordagem apenas define a cor de fundo para a próxima coisa que você digita, enquanto oprintf
faz para todo o terminal.tput
abordagem sai da fronteira descrita na minha pergunta enquantoprintf
preenche todo o terminal.Padding=0
,~/.minttyrc
você terá que reiniciar o terminal para que isso tenha efeito e se/quando você abrir a GUI "Opções" para alterar qualquer outra coisa sobre o terminal e salvá-lo, ele substituirá esseminttyrc
arquivo e remove essaPadding
configuração novamente.tput
abordagem é redefinido se/quando você executa um comando subsequentels --color
ou outro comando que usa cores, enquanto com aprintf
abordagem o plano de fundo permanece conforme desejado.