Usando regiões de rolagem no xterm com menos

Usando regiões de rolagem no xterm com menos

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

informação relacionada