In most terminal emulators, long command lines […] are wrapped to a new line before the user submits the command by pressing Enter.
Esta não é uma função do emulador de terminal.
É uma função do seu shell. Seu shell não é um aplicativo de tela cheia, mas está fazendo endereçamento de cursor .
Quando você está editando uma linha de comando em um shell, a biblioteca de edição de linha no shell está com a carga total de como a linha que está sendo editada é exibida. No shell Bourne Again, esta é a biblioteca readline do GNU. O shell Almquist usa o libedit. Outros shells, como o Z Shell, possuem suas próprias bibliotecas.
Essas bibliotecas são colocadas sobre as bibliotecas termcap / terminfo, que registram os recursos do terminal do emulador de terminal. Esses recursos incluem, entre outras coisas, as seqüências de controle para posicionar o cursor em termos relativos ou absolutos, as seqüências para limpeza até o final da linha e o final da tela, e se o terminal possui ou não margens automáticas > em>.
Com isso e informações sobre a largura do terminal determinada a partir do TIOCGWINSZ
ioctl
(voltando para a variável COLUMNS
para algumas bibliotecas, ou o banco de dados termcap / terminfo para outros) em mãos, a edição de linha A biblioteca no shell rastreia o comprimento da linha de comando e quantas linhas de terminal são exibidas. Ele inteligentemente move o cursor para repintar a linha de entrada à medida que ela é editada. Às vezes, pode confiar nas margens automáticas, se o seu terminal as tiver. Às vezes, ele pode reposicionar explicitamente o cursor usando sequências de controle.
O fato de estar fazendo isso é o que causa efeitos como os discutidos no link . Alguém pode atrapalhar a idéia de onde o cursor está e quais movimentos de cursor ele precisa emitir para gravar em um local específico na tela, com sequências de controle delimitadas incorretamente em uma string de prompt.
Seu emulador de terminal não trata das noções de linhas de comando ou edição de linha. Não faz parte dessas camadas. Ele vê um fluxo simples de caracteres e seqüências de controle, que ele deve renderizar. É de sua responsabilidade do emulador de terminal implementar as seqüências de controle que são anunciadas para ele em sua entrada termcap / terminfo. A linha de leitura do GNU, libedit, ZLE, vim
, screen
e outros usarão o que encontrarem anunciado. Se você declarar em termcap / terminfo que seu terminal tem margens automáticas, por exemplo, o emulador deve fazer uma quebra de linha quando um caractere é impresso na margem direita. Se você afirmar que o seu terminal pode mover o cursor para cima e para baixo, então ele deve fazer isso quando receber as seqüências de controle apropriadas.
A propósito: Se a linha de leitura do GNU achar que não pode mover o cursor para cima, porque a entrada termcap / terminfo não indica uma maneira de fazer isso, não se vê realmente a quebra de linha. readline volta para um modo em que ele rola lateralmente a linha de entrada, tudo em uma linha.