Использование областей прокрутки в xterm с less

Использование областей прокрутки в xterm с less

Я экспериментировал с escape-последовательностью DECSTBM в xterm (v353). Хотя в целом все работало, у меня возникла одна проблема:

Я бы установил область прокрутки на одну строку меньше высоты окна. При просмотре файлов с less (или man) он печатал бы строки внутри области прокрутки, но генерировал бы на одну строку больше, чем помещается. При прокрутке назад строка состояния выскальзывает за пределы области прокрутки, и прокрутка, как правило, прерывается.
Другой пример — приглашение на завершение «more» из readline (bash), он печатал бы столько строк, сколько сообщает размер окна, в моем случае прокручивая первую строку за пределы экрана.

Покопавшись в коде, я обнаружил, что less, похоже, напрямую запрашивает у системы размер окна (используя ioctl), тем самым обходя размер, заданный переменными окружения COLUMNS или LINES. Есть ли способ сообщить доступную область прокрутки вместо размера окна программам, запрашивающим размер терминала?

решение1

Есть ли способ сообщить программам, запрашивающим размер терминала, доступную область прокрутки вместо размера окна?

Попробуйте stty rows <lines>; он установит (через ioctl(TIOCSWINSZ)) значение, возвращаемое ядром через ioctl(TIOCGWINSZ)программы, которые его запрашивают.

Ваш эмулятор терминала обновит его при изменении размера окна.

Мне это помогло (при не очень тщательном тестировании):

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

Связанный контент