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

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

나는 xterm(v353)에서 DECSTBM 이스케이프 시퀀스를 실험해 왔습니다. 일반적으로 작동하지만 한 가지 문제가 있습니다.

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

코드를 조사한 결과 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

관련 정보