xterm에서 더 적은 스크롤 영역 사용

xterm에서 더 적은 스크롤 영역 사용

나는 xterm(v353)에서 DECSTBM 이스케이프 시퀀스를 실험해 왔습니다. 이것이 일반적으로 작동하는 동안 문제가 발생했습니다.

스크롤 영역을 창 높이보다 한 줄 작게 설정하겠습니다. less(또는 man)로 파일을 볼 때 스크롤 영역 내에 줄이 인쇄되지만 맞는 것보다 한 줄 더 많이 생성됩니다. 뒤로 스크롤할 때 상태 표시줄이 스크롤 영역 밖으로 미끄러져 스크롤이 중단되는 것처럼 자주 나타납니다.
또 다른 예는 readline(bash)의 "more" 완료 프롬프트입니다. 이 프롬프트는 창 크기 보고만큼 많은 줄을 인쇄합니다. 제 경우에는 화면에서 첫 번째 줄을 스크롤합니다.

코드를 더 깊이 파고들면서 (ioctl을 사용하여) 시스템에 직접 창 크기를 요청하는 경우가 적어서 환경 변수 COLUMNS 또는 LINES에서 제공하는 크기를 우회하는 경우가 더 적은 것으로 나타났습니다. 터미널 크기를 쿼리하는 프로그램에 창 크기 대신 사용 가능한 스크롤 영역을 전달할 수 있는 방법이 있습니까?

답변1

터미널 크기를 쿼리하는 프로그램에 창 크기 대신 사용 가능한 스크롤 영역을 전달할 수 있는 방법이 있습니까?

try 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

관련 정보