
내 프롬프트가 다음과 같다고 가정해 보겠습니다(_는 내 커서를 나타냄).
~ % _
이렇게 보이게 할 수 있는 방법이 없을까요?
~ % _
[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]
보내는 문자 시퀀스입니다 . 자세한 내용은 (Linux의 경우 섹션 번호가 다른 유닉스에 따라 다를 수 있음)을 참조하세요 .$cap
$cap
man 5 terminfo
동작 순서는 다음과 같습니다. 커서를 한 줄 아래로 이동한 다음( 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
라인은 zsh의 기능을 에뮬레이트하는 해킹 방법입니다 preexec
. 보다https://superuser.com/questions/175799/더 많은 정보를 위해서.
편집하다: Gilles의 의견을 바탕으로 스크립트를 개선했습니다.