스크롤 백과 스크롤 백 버퍼는 정확히 무엇입니까?


23

and와 같은 프로그램에서 "스크롤 백"및 "스크롤 백 버퍼"란 무엇 bash이며 screen, tty, 실행중인 프로그램 및 stdin / stdout / stderr와 어떤 관련이 있습니까?

지금까지 내가 찾은 "스크롤 백"에 대한 유일한 정의는 다음과 같습니다 ( archlinux wiki에서 ).

스크롤 백은 텍스트 콘솔에서 구현되어 사용자가 화면 밖으로 스크롤 한 텍스트 줄을 다시 볼 수 있도록하는 기능입니다. 이것은 비디오 어댑터와 디스플레이 장치 사이에 이러한 목적을 위해 만들어진 버퍼에 의해 가능합니다. 스크롤 백 버퍼

그러나 이것은 나에게 더 많은 질문을 제기합니다.

  • "서브 루틴"또는 "기능"과 같이 "기능"을 의미합니까?
  • 이 스크롤 백 버퍼에 유닉스 표준 또는 API가 있습니까?
  • 터미널 에뮬레이터 vim에서 screen시작하여 bash시작된 것과 같이 시작된 "스택" 에서 ssh이러한 프로그램 중 어느 것이 스크롤 백 버퍼를 제어하고 있습니까?

또한 스크롤 백을 파일screen덤프했습니다 . 이 파일은 맨 위에 많은 공백이 있었고 터미널 에뮬레이터가 버퍼의 맨 아래 몇 줄을 보여주는 "보기"인 것 같습니다.

  • 이것이 vim부모 쉘의 스크롤 백 버퍼에 일시적으로 액세스하기 때문에 이와 같은 프로그램이 터미널 창 전체를 "지울"수 있는 이유는 무엇입니까?
  • 아니면 vim부모 스크롤 백 버퍼 위에 겹쳐져있는 자체 스크롤 백 버퍼를 사용합니까?

답변:


28

이것은 약간 복잡한 질문입니다. 차례대로 귀하의 질문에 대답하려고 노력하지만 먼저 일반적인 설명을 드리겠습니다.

스크롤 백 버퍼는 터미널 에뮬레이터 ( xterm, Konsole, GNOME 터미널)에 의해 구현됩니다 . 터미널에서 실행하는 모든 프로그램의 표준 출력 및 표준 오류를 포함하여 화면에 표시된 모든 텍스트가 포함됩니다. 그것은 당신을 지나서 스크롤했을지도 모르는 과거의 출력을 보거나 이전에 무엇을 말했는지 확인하는 전적으로 터미널 기능입니다.

스크롤 백 버퍼는 로깅 된 출력의 긴 페이지로, 터미널 창은 한 번에 일부만 보는 창으로 생각할 수 있습니다. 스크롤하지 않은 경우 버퍼의 꼬리 부분이 표시됩니다. 일반적으로 터미널에는 잊어 버리기 전에 추적 할 행 수를 제한하는 제한이 있습니다.

한계가 1000 행이라고 가정하십시오. 세션에서 처음 수천 줄의 출력을 위해 버퍼에 추가하기 만하면 세션 시작 부분으로 바로 스크롤 할 수 있습니다. 1001 번째 출력 라인을 확보하자마자 버퍼의 첫 번째 라인이 지워지고 가장 뒤쪽으로 스크롤하면 세션의 두 번째 라인이됩니다. 버퍼에는 항상 화면에 표시된 가장 최근의 수천 줄의 출력이 포함되며 언제든지 위로 올라가서 이전 출력을 볼 수 있습니다.

  • "서브 루틴"또는 "기능"과 같이 "기능"을 의미합니까?

    이것은 "기능"에서와 같이 "기능"입니다. 터미널 에뮬레이터에는 화면의 내용을 기록하고 위아래로 스크롤 할 수있는 기능이 있습니다. 일부 시스템의 콘솔은 제한된 스크롤 백도 지원합니다.

    일단 screen믹스에 들어가면 조금 더 복잡해집니다 . 그 시점 screen에서 스크롤 백 버퍼 자체를 에뮬레이트하고 있습니다. 따라서 X 선택 만 사용하지 않고 프로그램 내에서 복사하여 붙여 넣을 수 있습니다.

  • 이 스크롤 백 버퍼에 유닉스 표준 또는 API가 있습니까?

    짧은 대답은 아니요, 터미널에서 제공 한 것입니다. 더 긴 답변은 하단에 있습니다.

  • 터미널 에뮬레이터에서 시작된 ssh에서 시작된 bash에서 시작된 화면에서 시작된 vim과 같은 프로그램의 "스택"에서 이러한 프로그램 중 어느 것이 스크롤 백 버퍼를 제어하고 있습니까?

    vim및 의 경우 bash에는 전혀 제어하지 않습니다 (캐비티, 아래, 아래). 터미널은 쉘에서 시작하여 내부의 모든 프로그램에 대한 스크롤 백 버퍼를 제공합니다. screen위에서 언급했듯이 스크롤 백 자체를 시뮬레이션합니다.

  • 또한 screen을 사용하여 스크롤 백을 파일로 덤프했습니다. 이 파일은 맨 위에 많은 공백이 있었고 터미널 에뮬레이터가 버퍼의 맨 아래 몇 줄을 보여주는 "보기"인 것 같습니다.

    이다 screen의 내부 버퍼. 당시 화면에 표시되는 것은 일반적으로 버퍼의 맨 아래에있는 것입니다.

  • 이것이 vim과 같은 프로그램이 부모 쉘의 스크롤 백 버퍼에 일시적으로 접근하기 때문에 터미널 윈도우 전체를 "지울"수있는 이유는 무엇입니까?

    여기에 훨씬 더 복잡한 부분이 있습니다. 사실상 모든 X 기반 터미널 에뮬레이터는 VT100을 시뮬레이트하고 있으며 그 중 하나는 "Alternate Screen Buffer"를 지원하는 것입니다 . 순차 출력과 대부분의 터미널 상호 작용에 사용되는 일반 버퍼와 달리 대체 화면 버퍼는 터미널의 정확한 크기입니다. 표시된 것보다 크지 않기 때문에 위 또는 아래로 스크롤되지 않습니다.

    아이디어는 전체 화면 응용 프로그램이 이미 화면에 있던 것을 방해하지 않고 필요한 작업을 수행 한 다음 이전의 표시로 정확하게 돌아갈 수 있도록하는 것입니다. 그렇기 때문에 입력 vim하면 전체 화면이 채워지지만 화면을 떠나면 이전에 사용한 모든 프롬프트와 명령 출력이 다시 표시됩니다. vim시작시 대체 화면 버퍼로 전환하고 종료시 일반 버퍼로 돌아갑니다.

    이 대체 버퍼는 위에서 언급 한 경고 중 하나입니다. 때때로 프로그램은 실제로 터미널에 버퍼로 무엇을할지 알려주는 기능을 가지고 있습니다.

    screen이 작업을 수행하는 또 다른 프로그램이므로 화면 세션 중에 터미널의 스크롤 기능이 일반적으로 작동하지 않습니다  screen. 스크롤 백 버퍼 자체를 에뮬레이트하므로 내부 기능을 사용하여 이전 출력을 가져와야합니다.

  • 아니면 vim은 부모 스크롤 백 버퍼 위에 겹쳐져있는 자체 스크롤 백 버퍼를 사용합니까?

    필자는 이전 질문에서 주로 대답했지만이 특정 질문에 대한 짧은 대답 vim은 터미널에서 스크롤 백없이 자체 임시 버퍼를 얻은 다음 문서 자체를 내부적으로 스크롤하는 것입니다.

내가 언급 한 모든 예외 :

다시 약간 더 복잡해집니다. 응용 프로그램은 스크롤 백을 제어 할 수 없으며 터미널에서 완전히 제공한다고 말했습니다. 경우에 따라 일부 터미널에서는 상호 작용이 제한적입니다. 이 프로그램은 특정 이스케이프 시퀀스를 인쇄합니다. 과거에 수동으로 터미널 색상을 사용한 적이 있다면 그 모양을 보았을 것입니다. 터미널은이를 해석하여 동작을 변경하거나 정보를 프로그램으로 다시 보낼 수 있습니다. 사용 가능한 이스케이프 시퀀스는 termcap (터미널 기능) 데이터베이스에 설명되어 있습니다 .

일부 터미널은 스크롤 백 버퍼의 제한된 쿼리 및 조작을 지원합니다. 많은 xterm파생 상품에는 터미널이 해당 뷰를 스크롤하도록 지시하는 이스케이프 시퀀스가 ​​있습니다. 많은 터미널이 화면의 특정 영역을 지정하여 스크롤 할 수 있도록 지원하고 나머지는 그대로 둡니다. 그것은 스크롤 백 버퍼를 깨는 경향이 있습니다.

거의 모든 터미널은 화면에서 커서를 움직이기위한 시퀀스를 지원하므로 ncurses라이브러리가 디스플레이의 모든 다른 부분을 업데이트 할 수 있습니다. 에서 지원xterm 하는 VT100 시퀀스를 볼 수 있습니다 . 이것들이 스크롤 백 버퍼와 상호 작용하는 방식은 때로는 less명령 과 같이 자체 스크롤 동작을 구현하는 경우 약간 이상 할 수 있습니다 . less터미널에서 예상하지 못한 방식으로 텍스트를 맨 위에 다시 그렸기 때문에 스크롤 백에 중복되거나 누락 된 줄이 생길 수 있습니다. 다른 프로그램은 때때로 전체 디스플레이의 여러 복사본으로 버퍼를 채 웁니다.


1
이 위대한 답변에 감사드립니다! 복잡한 주제에도 불구하고 매우 완전하고 이해하기 쉽습니다. 여분의 세부 사항은 모두 더 배우고 싶어하고 어디를보아야하는지 보여줍니다.
Oleg

1
일부 터미널에는 무제한 스크롤 백 옵션이 있습니다. 이는 전체 스크롤 백이 RAM임을 의미합니다 (따라서 터미널에 malloc 실패 또는 OOM이 발생 함). 그렇지 않으면 디스크에 쓰고 디스크에서로드하려고합니다 스크롤? 채팅 프로그램의 종류.
CMCDragonkai

쿼리를위한 이스케이프 시퀀스는 일반적으로 termcap이 아닙니다 (일반적으로 terminfo도 아니므로 더 완벽합니다).
Thomas Dickey

@CMCDragonkai Konsole은 메모리에서 유한 스크롤 백을 유지하지만 디스크에 부적절한 스크롤 백을 암호화되지 않은 디스크에 배치합니다. 설정 대화 상자에 경고가 표시됩니다. VTE (gnome-terminal 및 기타)는 압축 및 암호화 된 디스크에 스크롤 백 (유한 또는 무한)을 저장합니다. 다른 에뮬레이터가 무엇을하는지 모르겠습니다.
egmont
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.