Usando regiones de desplazamiento en xterm con menos

Usando regiones de desplazamiento en xterm con menos

He estado experimentando con la secuencia de escape DECSTBM en xterm (v353). Aunque en general funciona, tuve un problema:

Establecería la región de desplazamiento en una línea menos que la altura de la ventana. Al ver archivos con menos (o man), imprimiría líneas dentro de la región de desplazamiento, pero genera una línea más de las que caben. Al volver a desplazarse hacia arriba, la línea de estado se desliza fuera de la región de desplazamiento y el desplazamiento generalmente parece interrumpirse.
Otro ejemplo es el mensaje de finalización "más" de readline (bash), imprimiría tantas líneas como informe el tamaño de la ventana, en mi caso desplazando la primera línea fuera de la pantalla.

Al investigar el código, descubrí que menos parece pedirle al sistema directamente el tamaño de la ventana (usando ioctl), por lo que pasa por alto el tamaño dado por las variables de entorno COLUMNAS o LÍNEAS. ¿Hay alguna manera de comunicar la región de desplazamiento disponible en lugar del tamaño de la ventana a los programas que consultan el tamaño del terminal?

Respuesta1

¿Hay alguna manera de comunicar la región de desplazamiento disponible en lugar del tamaño de la ventana a los programas que consultan el tamaño del terminal?

Intentar stty rows <lines>; establecerá (a través de ioctl(TIOCSWINSZ)) el valor devuelto por el kernel ioctl(TIOCGWINSZ)a los programas que lo soliciten.

Su emulador de terminal lo actualizará cuando cambie el tamaño de la ventana.

Esto funcionó para mí (en pruebas no muy exhaustivas):

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

información relacionada