내 프롬프트가 다음과 같다고 가정 해 봅시다 (_는 내 커서를 나타냅니다)
~ % _
내가 이렇게 보일 수있는 방법이 있습니까?
~ % _
[some status]
질문은 원래 zsh에 관한 것이었지만 이제 다른 답변이 있습니다.
내 프롬프트가 다음과 같다고 가정 해 봅시다 (_는 내 커서를 나타냅니다)
~ % _
내가 이렇게 보일 수있는 방법이 있습니까?
~ % _
[some status]
질문은 원래 zsh에 관한 것이었지만 이제 다른 답변이 있습니다.
답변:
다음 설정이 작동하는 것 같습니다. 명령 행이 첫 번째 행을 넘으면 두 번째 행의 텍스트가 사라집니다. 이 preexec
기능은 명령을 실행하기 전에 두 번째 줄을 지 웁니다. 유지하려면로 변경하십시오 preexec () { echo; }
.
terminfo_down_sc=$terminfo[cud1]$terminfo[cuu1]$terminfo[sc]$terminfo[cud1]
PS1_2='[some status]'
PS1="%{$terminfo_down_sc$PS1_2$terminfo[rc]%}%~ %# "
preexec () { print -rn -- $terminfo[el]; }
%
이스케이프는 zsh 매뉴얼 ( man zshmisc
)에 설명되어 있습니다.
Terminfo는 터미널 액세스 API입니다. Zsh에는 terminfo
터미널 설명 데이터베이스에 액세스 할 수 있는 모듈이 있습니다. $terminfo[$cap]
터미널의 기능 $cap
을 실행하기 위해, 즉 $cap
명령 을 실행 하기 위해 보낼 문자 시퀀스입니다 . 자세한 내용은 man 5 terminfo
(Linux에서는 섹션 번호가 다른 유니스에 따라 다를 수 있음)를 참조하십시오.
동작 순서는 다음과 같습니다. 커서를 한 줄 아래로 이동 ( cud1
) 한 다음 뒤로 ( cuu1
); 커서 위치를 저장하십시오 ( sc
); 커서를 한 줄 아래로 이동하십시오. 인쇄 [some status]
; 커서 위치를 복원하십시오. 프롬프트가 화면의 맨 아랫 줄에있는 경우에만 시작 부분의 아래 위로 비트가 필요합니다. 사전 실행 줄은 두 번째 줄 ( el
)을 지우 므로 명령의 출력과 섞이지 않습니다.
두 번째 줄의 텍스트가 터미널보다 넓 으면 디스플레이가 왜곡 될 수 있습니다. 수리 하려면 꼬집음에 Ctrl+ L를 사용하십시오 .
다음은 bash
Gilles의 zsh 솔루션과 동일합니다. Bash에는 기본 terminfo 모듈이 없지만 tput
명령 (으로 묶음 terminfo
)은 거의 동일합니다.
PS1_line1='\w \$ '
PS1_line2='[some status]'
if (tput cuu1 && tput sc && tput rc && tput el) >/dev/null 2>&1
then
PS1="
\[$(tput cuu1; tput sc)\]
\[${PS1_line2}$(tput rc)\]${PS1_line1}"
PS2="\[$(tput el)\]> "
trap 'tput el' DEBUG
else
PS1="$PS1_line2 :: $PS1_line1"
fi
터미널이 기능 중 하나를 지원하지 않으면 한 줄 프롬프트로 돌아갑니다.
이 trap
줄은 zsh의 preexec
기능 을 모방하는 해키 방법 입니다. 자세한 내용은 /superuser/175799/ 를 참조 하십시오 .
편집 : Gilles의 의견에 따라 스크립트가 개선되었습니다.