이것은 약간 복잡한 질문입니다. 차례대로 귀하의 질문에 대답하려고 노력하지만 먼저 일반적인 설명을 드리겠습니다.
스크롤 백 버퍼는 터미널 에뮬레이터 ( 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
터미널에서 예상하지 못한 방식으로 텍스트를 맨 위에 다시 그렸기 때문에 스크롤 백에 중복되거나 누락 된 줄이 생길 수 있습니다. 다른 프로그램은 때때로 전체 디스플레이의 여러 복사본으로 버퍼를 채 웁니다.