내 프롬프트가 다음과 같다고 가정해 보겠습니다(_는 내 커서를 나타냄).
~ % _
이렇게 보이게 하는 방법 없을까요
~ % _
[some status]
이 질문은 원래 zsh에 관한 것이었지만 이제는 다른 답변이 있습니다.
답변1
다음 설정이 작동하는 것 같습니다. 명령줄이 첫 번째 줄을 초과하면 두 번째 줄의 텍스트가 사라집니다. 이 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의 섹션 번호는 다른 unice와 다를 수 있음)을 참조하세요.
작업 순서는 다음과 같습니다. 커서를 한 줄 아래로 이동한 cud1
다음 ( cuu1
) 커서 위치 를 sc
저장합니다( ). 커서를 한 줄 아래로 이동합니다 [some status]
. 시작 상위 및 하위 비트는 프롬프트가 화면의 맨 아래 행에 있는 경우에만 필요합니다. preexec 라인은 el
명령의 출력과 혼동되지 않도록 두 번째 라인( )을 제거합니다.
텍스트의 두 번째 줄이 터미널보다 넓으면 디스플레이가 깨질 수 있습니다. 필요한 경우 Ctrl+를 사용하여 수정하세요 .L
답변2
이는 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
라인은 preexec
zsh 기능을 에뮬레이트하는 깔끔한 방법입니다. 바라보다https://superuser.com/questions/175799/더 많은 정보를 알고 싶습니다.
편집하다: Gilles의 의견을 바탕으로 스크립트를 개선했습니다.