Suponha que sua janela de terminal tenha 80 colunas de largura e você execute um script python contendo apenas:
print("x" * 81 + "\b\by")
Você esperaria que a saída fosse uma linha cheia, x
exceto a última, que deveria ser um arquivo y
. Meu problema é que a saída que recebo é uma linha cheia x
e uma segunda linha contendo um arquivo y
. O fato é que sempre que o caractere de retrocesso for impresso no stdout, ele funciona conforme o esperado, exceto quando há linhas quebradas e deve colocar o cursor uma linha acima: nesse caso, ele parece estar excluído do buffer stdout.
Posso reproduzir esse comportamento de várias maneiras, seguindo as linhas do trecho acima, por exemplo, echo -e "xx...x\b\by"
tentei com bash e sh, printf(...);
para C/C++, cout << ...;
para C++. O mesmo problema quando cat
um arquivo que contém caracteres de retrocesso e também ao digitar uma leitura stdin que ocupa mais de uma linha de janela de terminal. Neste último caso, '\b'
os caracteres são substituídos quando eu pressiono a tecla backspace várias vezes: quando excedo a largura da janela e as linhas quebram, não consigo alcançar as linhas anteriores pressionando backspace repetidamente, mas essas ocorrências são processadas conforme esperado pelo programa de chamada, por exemplo em uma scanf("%s", s);
chamada, s
conteria 79 x
e 1 y
, seguindo o exemplo acima. O engraçado aqui é que se eu redimensionar a janela de forma que a nova posição do cursor não esteja mais na primeira coluna da janela, então poderei voltar para o novo local da primeira coluna e seguir em frente até apenas um a linha terminal é deixada; então acontece que há uma posição que não posso voltar mais - mas não consegui descobrir como prever essa posição.
Finalmente, outra situação em que linhas quebradas e backspace se encontram é ao digitar um comando longo e desejar voltar para a primeira linha. Não enfrento problemas em fazer isso.
Estou usando o Ubuntu 18.04 e tentei tudo acima com vários emuladores de terminal, nomeadamente gnome-terminal, xvt e tilda. Qualquer dica seria muito apreciada. Obrigado!
Responder1
tmux
, screen
, urxvt
comporte-se da maneira que desejar. xterm
pode ser alterado para esse comportamento ativandomodo envolvente reverso: printf '\e[?45h'
.
É um legado, na verdade quebrado pelo design, e ninguém realmente se importou em consertá-lo. Existem mais problemas do que aquele que você apontou. VerProblema de TEV 62para mais detalhes.
ao digitar um comando longo e desejar voltar para a primeira linha. Não enfrento problemas em fazer isso.
Neste caso você está usando a edição de linha do shell (por exemplo, a biblioteca readline), que faz um manuseio de tela mais complexo do que apenas emitir um backspace.
Responder2
Windows 7 Python 3.7.4
print("x" * 81 + "y")
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxy
É isso que você quer?