추가 읽기

추가 읽기

저는 TERM=linux로 Centos7을 실행하고 있습니다. vi나 vim을 사용하여 파일을 열 때마다 bash 창의 처음 30줄을 덮어씁니다. vi는 잘 작동하지만 뒤로 스크롤하면 이 30줄이 영원히 사라집니다. Mac OS, Solaris 또는 Oracle Linux의 vi에서 이러한 동작을 본 적이 없습니다. 이것을 방지하는 방법을 아시나요?

답변1

터미널 콘텐츠를 복구하려면 용어 코드 t_ti및 가 필요합니다 t_te. Vim은 termcap 정의(또는 termlib인가요?)를 기반으로 이 코드를 결정합니다. 이러한 용어 코드는 적용되지 않는 것 같습니다 TERM=linux.

실행하여 테스트해 보세요.

:set t_ti? t_te?

이는 이 두 코드가 설정되지 않았음을 나타냅니다.

다음을 입력하면 작동할 수 있습니다 vimrc.

set t_ti=^[7^[[r^[[?47h t_te=^[[?47l^[8

중요한: ^[는 이스케이프 문자이며 <C-v><esc>입력하여 삽입할 수 있습니다.

:h restorescreen(Windows 전용 옵션).

참고: 일단 Vim이 실행되면 Vim은 터미널의 마스터가 됩니다. 따라서 Vim을 떠난 후에만 롤백할 수 있습니다. 그리고 vi빔도요. :versionVi 내에서 확인하세요.

답변2

당신은 자신도 모르게 다음 의미에 익숙해졌습니다.종이대신 터미널동영상단말기.

이전 용지 터미널에는 (일반적으로 연속, 팬 접힌) 용지가 다음 용지/양식의 시작 부분까지 말려 올라가고 이전 행이 긴 용지 줄 위에 걸려 있게 하는 용지 공급 제어 문자가 있었습니다. 터미널 뒤쪽에 위치해 있습니다.

1960년대, 1970년대, 1980년대의 비디오 단말기에는 고정된 크기의 화면이 있었습니다.문질러 지우는, 명시적으로 커서를 시작 위치로 다시 이동합니다. (보통 페이지 피드 제어 문자아니요이 작업을 수행. 이는 개행 문자와 같으며 화면을 지우는 다른 지우기 디스플레이 제어 순서가 있습니다. PRINT CHR$(12)이러한 점에서 비디오 단말기는 일부 현대 가정용 컴퓨터와 다릅니다. )

터미널 에뮬레이터는 주로 비디오 터미널의 의미를 따릅니다. (실제로 세계는 비디오 단말기의 시대를 거쳤습니다.보통 실제로IBM PC 호환 시스템은 전용 시스템이 아닌 터미널 에뮬레이션 프로그램을 실행합니다. ) 그러나 (주로) Unices 및 Linux 기반 운영 체제에서 실행되는 GUI는 비디오 터미널에는 없는 두 가지 중요한 메커니즘을 포함하여 수년에 걸쳐 무언가를 달성했습니다.스크롤백 버퍼그리고대체 디스플레이 버퍼.

구형 비디오 터미널에서는전체 화면또는 VIM과 같은 프로그램은 vi실제로화면 지우기전체 화면 사용자 인터페이스를 표시하기 위해 목격되는 동작은 다음과 같습니다.매우 정상적인 행동. 대체 화면 버퍼 vi등이 있는 터미널 에뮬레이터에서 실제로 그들은 대체 화면 버퍼로 전환하도록 속아서 완료되면 이를 지우고 다시 전환합니다.

그들은 실제로 대체 화면 버퍼로 전환한다고 생각하지 않습니다. 실제로는 대체 화면 버퍼로 전환한다고 생각합니다. 그들은 "커서 주소 지정 모드로 들어가고 있다"고 생각합니다. 이것은 termcap/terminfo가 고안한 아이디어로, 비디오 터미널은 커서 이동 제어 순서가 완전히 작동하지 않는 일반적인 "프로그레시브" 모드를 가지며 전체 작동을 위해 "커서 주소 지정 모드"로 전환해야 합니다. 화면 프로그램은 화면 전체에서 커서를 이동합니다. 대부분의 최신 터미널에서 소위 "커서 주소 지정 모드"에 대해 termcap/terminfo는 실제로 대체 화면 버퍼로 전환하기 위한 제어 시퀀스를 제공합니다.

따라서 일치하지 않는 첫 번째 기대에 대해 TERM환경 변수를 linuxterminfo의 "커서 주소 지정 모드"로 설정한다는 아이디어에는 대체 화면 버퍼로의 전환이 포함되지 않습니다. 이는 Linux에 내장된 터미널 에뮬레이터( linux터미널 유형으로 표시됨)에 대체 화면 버퍼 메커니즘이 없기 때문입니다. 따라서 해당 termcap/terminfo 레코드는 제어 순서를 제공하지 않습니다.

이는 중요한 점을 제시합니다:TERM환경 변수의 터미널 유형~ 해야 하다프로그램이 로컬 또는 원격으로 통신하는 실제 터미널과 일치합니다. 분명히, Linux에 내장된 터미널 에뮬레이터를 사용하지 않아야 하며 linux터미널 유형을 사용해서는 안 됩니다. 일반적인 MacOS 터미널 에뮬레이터는 iTerm.app터미널 유형 등에 해당합니다. 아니요, 그래야 합니다.아니요xterm또는 xterm-256color.

스크롤백 버퍼는 비디오 터미널 패러다임의 또 다른 변형입니다.오래된 종이 터미널 의미론 재도입, 말아서 만든 것을 단말기 위에 걸어두세요. 시뮬레이션된 비디오 터미널이 스크롤되면 스크롤된 내용이 스크롤백 버퍼로 푸시되고 디스플레이를 지우면(일반적으로) 스크롤백 버퍼 하단 아래 부분만 지워집니다.

여기서 당신을 힘들게 하는 두 가지 일이 있습니다.

첫째, 일부 GUI 터미널 에뮬레이터는 오래된 종이 터미널 의미론으로 돌아가는 아이디어를 채택했습니다. 그놈 터미널은 비디오 터미널처럼 화면을 지우지 않습니다.별말씀을요, 지금. 디스플레이 지우기를 요청하면 페이지 피드가 수행되어 모든 내용이 스크롤백 버퍼로 푸시됩니다. (표시 삭제와 페이지 나누기를 혼동하므로 이는 좋은 생각이 아닙니다.) 사람들에게 발생한 문제의 예는 "https://unix.stackexchange.com/q/375743/5132"를 참조하세요. GNOME 터미널의 작업 방식에 익숙하다면 이러한 방식이 매우 오래되었다는 점에 유의하세요.종이(너무 오래되지 않은) 비디오 터미널 의미보다는 터미널 의미.

둘째, 일부 다른 GUI 터미널 에뮬레이터에서는 대체 화면 버퍼가 기본 화면 버퍼와 같아서는 안 된다고 믿습니다.하다커서 주소 지정 의미를 약간 변경합니다. 흥미롭게도 구현자가 가장 자주 선택하는 것은 스크롤링이 아닌 다른 것입니다. 이는 논리적인 결과입니다.스크롤백 버퍼 없음, 대체 화면 버퍼가 활성화된 경우. (불행히도 이는 실제로 에뮬레이트되는 실제 비디오 터미널 메커니즘, 즉 디스플레이 버퍼에 관계없이 호스트의 제어 시퀀스를 사용하여 "자동 오른쪽 경계 래핑"을 끄고 켜는 기능과 연결되어야 합니다.)

후자는 귀하의 기대에 더 큰 불일치를 초래합니다. vi이러한 터미널 에뮬레이터에서 또는 다른 전체 화면 프로그램이 활성화된 경우 ,~ 아니다전체 화면 프로그램이 대체 화면 버퍼로 전환되었기 때문에 스크롤백이 가능합니다. 스크롤백을 유지하려면 선택적으로 VIM(이것은 t_tiet al.에 의해 제어될 수 있음)을 조작하여 커서 주소 지정 모드로 들어가지 않도록 지시할 수 있습니다. 이는 터미널 에뮬레이터가 대체 화면 버퍼로 전환하지 않음을 의미합니다. 그러나 트레이드오프는 반환 비용을 들여 이 작업을 수행한다는 것입니다... 어... 전체 화면 쇼의 의미를 비디오 터미널로 전달하는 것입니다.모두 지우다기초적인전시하다스크롤백 버퍼 아래.

추가 읽기

  • 조나단 데보인 폴라드(2019). "학기". 여러 가지 잡다한. Nosh 툴셋.

답변3

@JdeBP가 "종이 터미널 의미론"이라고 부르는 솔루션을 우연히 발견한 것 같습니다. 즉, .vimrc에 :set term=builtin_ansi를 추가하세요.

이 작업을 수행한 후 Mac 및 Linux 시스템 모두에서 TERM을 linux로 설정할 수 있으며 백스페이스 및 화살표 키를 포함한 모든 것이 잘 작동합니다.

그런데, 나는 또한 다음을 추가해 보았습니다: set t_ti? .vimrc에 추가했지만 작동하지 않을 뿐만 아니라 vi가 물음표에 대해 불평합니다.

관련 정보