Não é possível retroceder entre linhas quebradas no terminal

Não é possível retroceder entre linhas quebradas no terminal

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, xexceto a última, que deveria ser um arquivo y. Meu problema é que a saída que recebo é uma linha cheia xe 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 catum 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, sconteria 79 xe 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, urxvtcomporte-se da maneira que desejar. xtermpode 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?

informação relacionada