[apple] 쉘 명령을 통해 터미널에서 스크롤 백을 어떻게 재설정합니까?

Terminal.app를 사용하는 경우 셸 내장을 사용 clear하거나 ^+ L(Control-L)를 눌러 화면을 지울 수 있습니다 .

그러나이 모든 것은 현재 화면 내용을 한 화면 높이 뒤로 밀고 첫 번째 줄에서 커서 / 입력을 재설정하는 것입니다. 다시 스크롤하여 볼 수 있음을 의미합니다.

당신이 할 수있는 일은 + K(Command-K)를 눌러 전체 스크롤 백을 재설정하는 것 입니다.

이 작업을 수행 한 후에는 전혀 뒤로 스크롤 할 수 없습니다.

특정 상황 (특히 실행하기 전에 screen또는 vim)에서 명령이 실제로 실행되기 전에 스크롤을 다시 설정하고 싶습니다.

clearOS X에서 구현 되는 명령 (예 :)이 있습니까? 의 존재를 감안 pbcopy하고 pbpaste, 나는 나이 작업을 수행 할 수 있도록 뭔가 비슷한 힘의 존재를 생각하고 있어요.



답변

터미널은 ED (Erase in Display) 이스케이프 시퀀스 확장을 지원하여 스크롤 백을 지 웁니다. xterm에서도 지원됩니다. VT100 매뉴얼에 설명 된 ED 명령 은 Ps 매개 변수에 다음 값을 허용합니다.

ESC [Ps J

매개 변수 매개 변수 의미

0 활성 위치에서 화면 끝까지 지우기
1 화면 시작에서 활성 위치로 삭제
2 모든 디스플레이 지우기

터미널 ( 및 xterm )은 다음을 추가합니다.

3 스크롤 백 지우기 (일명“저장된 줄”)

이렇게하면 화면이 아니라 스크롤 백만 지워집니다. 이를 통해 두 개의 이스케이프 시퀀스를 전송하여 둘 중 하나를 지울 수 있습니다.

예를 들어 다음 쉘 명령을 사용하여 화면과 스크롤을 지울 수 있습니다. clear && printf '\e[3J'

(이 clear명령은 현재 터미널의 화면을 지우는 데 적합한 순서를 찾지 만 “스크롤 백 지우기”이스케이프 시퀀스는 사용자 지정이며 하드 코딩해야합니다.이 스크립트를 모르는 쉘 스크립트에 넣으면 일부는 오직 터미널 실행됩니다를 들어, 당신은 확인해야 $TERM_PROGRAM입니다 Apple_Terminal전송하기 전에.)


답변

⌘K, ‘보기> 스크롤 백 지우기’바로 가기

업데이트 : 다음 명령으로 AppleScript를 사용하여 자동화 할 수 있습니다.

osascript -e 'tell application "System Events" to keystroke "k" using command down'

… 물론 alias원하는대로 또는 ~/.profile로그인 스크립트에 함수에 저장할 수 있습니다 🙂

보안 상, 잘못된 프론트 앱에 키 스트로크를 발생시킬 위험없이 백그라운드에서이 기능을 사용할 수 있으려면 다음 테스트로이를 둘러 보는 것이 좋습니다.

if application "Terminal" is frontmost

… 다음 코드를 제공합니다.

osascript -e 'if application "Terminal" is frontmost then tell application "System Events" to keystroke "k" using command down'

… 차례로, 제대로 탈출하고 aliased :

alias clear="osascript -e 'if application \"Terminal\" is frontmost then tell application \"System Events\" to keystroke \"k\" using command down'"

그리고 여기 새로운 것이 있습니다 clear! 🙂


답변

다음은 macOS ‘Terminal 및 iTerm2 모두에서 작동하는 코드입니다. 창을 전경에 둘 필요도 없습니다.

printf '\033[2J\033[3J\033[1;1H'

작동 원리

이것은 3 개의 ANSI 이스케이프 시퀀스 , 특히 “Control Sequence Introducer”명령으로 구성 됩니다.

\033은 나타내는 문자의 코드 포인트를 하드 코드하는 이스케이프 시퀀스입니다. 리딩 0은 나머지 시퀀스가 ​​8 진수 값 (이 경우 8 진수)을 인코딩 함을 나타냅니다 33. 그 10 진수 값은 27( 3 * 8^1 + 3 * 8^0= 3 * 8 + 3= 24 + 3= 27)입니다. ASCII에서 코드 포인트 27는 “ESC”(이스케이프) 문자입니다.

CSI명령은 ESC [, aka로 시작 \033[합니다. 이것을 알면 문자열을 3 부분으로 나눌 수 있습니다.

  1. CSI 2 J
    • “ED – Erase in Display”명령의 인스턴스이며 다음과 같은 형식입니다. CSI n J
    • 이 경우 n값이 설정되어 2두 번째 변형을 호출합니다. “n이 2 인 경우 전체 화면을 지우고 커서를 DOS ANSI.SYS에서 왼쪽 위로 이동합니다.”
  2. CSI 3 J:
    • “ED – Erase in Display”명령의 인스턴스이며 다음과 같은 형식입니다. CSI n J
    • 이 경우 n값이 3으로 설정되어 3“n이 3이면 전체 화면을 지우고 스크롤 백 버퍼에 저장된 모든 행을 삭제합니다 (이 기능은 xterm 용으로 추가되었으며 다른 터미널 응용 프로그램에서 지원됨”).
  3. CSI 1 ; 1 H:
    • “ED – Erase in Display”명령의 인스턴스이며 다음과 같은 형식입니다. CSI n ; m H

      커서를 행 n, 열로 이동합니다 m. 값은 1을 기준으로하며 생략하면 기본값은 1 (왼쪽 상단)입니다. CSI 17H와 CSI ;5H동의어 CSI 1;5H일뿐만 아니라 같은 시퀀스CSI 17;HCSI 17;1H

    • nm값으로 설정되어 1이 명령 움직이면 왼쪽 상단의 코너에 커서를 말한다.

답변