
Tenho experimentado a sequência de escape DECSTBM no xterm (v353). Embora geralmente funcione, tive um problema:
Eu definiria a região de rolagem para uma linha a menos que a altura da janela. Ao visualizar arquivos com less (ou man), ele imprimiria linhas dentro da região de rolagem, mas geraria uma linha a mais do que caberia. Ao rolar para cima, a linha de status sai da região de rolagem e a rolagem geralmente parece quebrar.
Outro exemplo é o prompt de conclusão 'mais' do readline (bash), que imprimiria tantas linhas quanto o tamanho da janela relatasse, no meu caso, rolando a primeira linha para fora da tela.
Ao pesquisar o código, descobri que less parece solicitar diretamente ao sistema o tamanho da janela (usando ioctl), ignorando, portanto, o tamanho fornecido pelas variáveis de ambiente COLUMNS ou LINES. Existe uma maneira de comunicar a região de rolagem disponível em vez do tamanho da janela para programas que consultam o tamanho do terminal?
Responder1
Existe uma maneira de comunicar a região de rolagem disponível em vez do tamanho da janela para programas que consultam o tamanho do terminal?
Tentar stty rows <lines>
; ele definirá (via ioctl(TIOCSWINSZ)
) o valor retornado pelo kernel ioctl(TIOCGWINSZ)
para os programas que o solicitarem.
Seu emulador de terminal irá atualizá-lo quando você redimensionar a janela.
Isso funcionou para mim (em testes não muito completos):
winch(){
[ "$LINES" = "$winch_l" ] && return
winch_l=$((LINES-1));
stty rows "$winch_l"
printf '\033[S\033[A' # scroll 1 up, cursor 1 up
printf '\0337' # save cursor (DECSC)
printf '\033[1;%dr' "$winch_l" # set scroll region (DECSTBM)
printf '\0338' # restore cursor (DECRC)
kill -WINCH "$$" # force prompt redraw; ymmv
}
trap winch WINCH
winch