쉘에서 페이저나 유사한 편집기 less
(내 쉘은 GNU bash)와 같은 것을 사용할 때마다 설명할 수 없는 동작이 나타납니다. 이는 . 이런 행동이 어떻게 발생하는지 묻고 싶습니다.nano
cat
ls
쉽게 설명되지 않는 동작은 일반적으로 stdout/stderr에 대한 모든 출력이 결국 터미널 에뮬레이터 백 버퍼에 기록되므로 뒤로 스크롤할 수 있다는 것입니다. 이는(일반적으로 저에게는 해당되지 않음) less
or 를 사용하는 경우 입니다 nano
. 출력은 터미널 에뮬레이터에 의해 표시되지만 프로그램을 종료한 후에는 콘텐츠가 "마법처럼 사라집니다".
나는 다음 두 가지 예를 들어보고 싶습니다.
seq 1 200
(백버퍼에 200라인 생성)seq 1 200 | less
(200개 행을 통해 페이징할 수 있지만 결국 "정리"되고 백 버퍼에 아무것도 기록되지 않습니다)
어떤 종류의 이스케이프 코드가 작동 중인 것으로 의심되며 누군가가 관찰된 동작의 차이에 대한 설명을 알려줄 수 있기를 바랍니다.
일부 의견과 답변은 동작을 변경하려는 것처럼 표현되어 있으므로 "알아두면 좋습니다". 그러나 실제로 원하는 답변은 메커니즘을 변경하는 방법이 아니라 메커니즘에 대한 설명이어야 합니다.
답변1
여기에는 두 가지 세계관이 있습니다.
- termcap/terminfo를 사용하는 프로그램의 경우 터미널에는 두 가지 모드가 있을 수 있습니다.커서 주소 지정 모드그리고스크롤 모드. 후자는 일반 모드입니다. 프로그램이 행 및 열 주소로 화면에서 커서를 이동해야 할 경우 프로그램은 커서 주소 지정 모드로 전환하여 화면을 2차원 개체로 처리합니다.
termcap과 terminfo는 프로그램이 보는 세계관을 터미널이 보는 세계관으로 변환하는 일을 담당합니다.
- 터미널(에뮬레이션 또는 실제)의 경우 두 개의 화면 버퍼가 있으며 언제든지 그 중 하나만 표시됩니다. 메인 스크린 버퍼와대체 화면 버퍼. 프로그램에 의해 발행된 제어 시퀀스는 둘 사이에서 터미널을 전환합니다.
- 일부 터미널(일반적으로 에뮬레이트된 터미널)의 경우 대체 화면 버퍼는 termcap/terminfo 사용을 기반으로 사용자 정의됩니다. 그들의 디자인은 다음 지식을 기반으로 합니다.커서 주소 지정 모드대체 화면 버퍼로 전환 및 전환의 일부스크롤 모드메인 스크린 버퍼로 전환 중입니다. 이것이 termcap/terminfo가 번역하는 방법입니다. 따라서 이러한 터미널은 대체 화면 버퍼가 표시될 때 스크롤 UI 위젯을 표시하지 않으며 해당 화면 버퍼에 대한 스크롤백 메커니즘이 전혀 없습니다.
- 다른 터미널(보통 실제 터미널)의 경우 대체 화면 버퍼는 기본 화면 버퍼와 매우 유사합니다. 둘 다 기본적으로 지원하는 내용은 동일합니다. 일부 에뮬레이트된 터미널이 이 범주에 속합니다. 예를 들어 유니코드 rxvt에는 기본 화면 버퍼와 대체 화면 버퍼 모두에 대한 스크롤백 기능이 있습니다.
제시된 프로그램전체 화면 텍스트 사용자 인터페이스(예 vim
: nano
, less
, , mc
등) 시작할 때 커서 주소 지정 모드로 전환하고 일시 중지, 종료 또는 종료할 때 스크롤 모드로 다시 돌아가려면 termcap/terminfo를 사용하십시오. ncurses 라이브러리가 이를 수행할 수 있지만 ncurses가 아닌 사용자도 termcap/terminfo 위에 직접 구축할 수 있습니다.
less
vim
스크롤백으로 표시되거나 스크롤백과 아무 관련이 없는 TUI 내에서 스크롤합니다 . 이는 스크롤 시 전체 화면 텍스트 사용자 인터페이스를 적절하게 다시 그리는 이러한 프로그램에 의해 내부적으로 구현됩니다.
이러한 절차를 참고하세요.원하지 않는다대체 화면 버퍼에 "아무 것도 유지하지 않습니다". 터미널에는 더 이상 남겨둔 내용이 표시되지 않습니다.
- 이는 커서 주소 지정 모드로 전환하는 데 사용되는 termcap/terminfo 시퀀스가 대체 화면 버퍼를 암시적으로 지우지 않는 일부 플랫폼의 유니코드 rxvt에서 특히 주목할 만합니다. 따라서 이러한 전체 화면 TUI 프로그램을 여러 개 연속해서 사용하면 적어도 새 프로그램이 출력을 쓸 때까지(특히
less
파이프 끝에서) 잠시 동안 이전 프로그램이 남긴 예비 화면 버퍼의 이전 내용이 표시될 수 있습니다. . - xterm을 사용하면 터미널 에뮬레이터의 GUI 메뉴에서 전환하여 대체 화면 버퍼를 표시하고 아직 남아 있는 내용을 확인할 수 있습니다.
실제 제어 순서는 관련 표준에 나와 있습니다.비공개 모드 설정제어 순서. 관련 개인 모드 번호는 47, 1047, 1048 및 1049입니다. 대체 화면 버퍼로 전환하거나 대체 화면 버퍼에서 전환하는 것 외에 각 모드에서 암시하는 추가 작업 간에는 차이가 있습니다.
추가 읽기
답변2
여러 가지 방법으로 노클리어를 추가할 수 있습니다. less
매개변수를 사용하여 호출하면 화면이 지워지는 문제를 해결할 수 있습니다 -X
.
참고하세요$
아래 명령줄의 기호. 일반 사용자를 위한 터미널 프롬프트입니다.
$ seq 1 200 | less -X
이것이 원하는 동작이라면 이 less
기본값의 별칭을 다음과 같이 지정할 수 있습니다.
$ alias less='less -X'
다른 프로그램에도 비슷한 해결 방법이 있습니다.
또는 각 애플리케이션을 개별적으로 구성하는 대신 자체 터미널 정의를 추가할 수 있습니다. 이 경우에는 전화하겠습니다.xterm-noclear이 예에서는.
새로운 xterm 정의를 생성하려면 다음 단계를 실행하십시오.
$ infocmp -I xterm > xterm-noclear.src
$ gedit xterm-noclear.src
이제 편집기의 두 번째 줄을 에서 로 변경 xterm
합니다 xterm-noclear
.
검색을 통해 화면을 지우는 명령 제거컵그리고smcup을 클릭하고 다음 두 명령어를 삭제하세요.
smcup=\E[?1049h,
그리고
rmcup=\E[?1049l,
파일을 저장하고 터미널 정의를 추가합니다.
$ tic ~/xterm-noclear.src
다음을 사용하여 시스템 전체 터미널 정의로 만들 수 있습니다.
$ sudo tic ~/xterm-noclear.src
이제 다음 용도로 사용할 수 있습니다 TERM
.
$ export TERM=xterm-noclear
답변3
사용 중인 터미널 유형을 알고 올바른 이스케이프 시퀀스를 보내는curses라는 라이브러리입니다. 터미널은 다른 수직 버퍼와 더 많은 제어를 허용하는 모드로 전환해야 합니다.