쉘 프롬프트에서 프롬프트 아래에 내용을 표시하시겠습니까?

쉘 프롬프트에서 프롬프트 아래에 내용을 표시하시겠습니까?

내 프롬프트가 다음과 같다고 가정해 보겠습니다(_는 내 커서를 나타냄).

~ % _

이렇게 보이게 할 수 있는 방법이 없을까요?

~ % _
[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$capman 5 terminfo

동작 순서는 다음과 같습니다. 커서를 한 줄 아래로 이동한 다음( cud1) 다시 위로 이동합니다( cuu1). 커서 위치를 저장합니다( sc). 커서를 한 줄 아래로 이동합니다. 인쇄 [some status]; 커서 위치를 복원합니다. 시작 부분의 아래쪽 및 위쪽 비트는 프롬프트가 화면 맨 아래 줄에 있는 경우에만 필요합니다. preexec 라인은 el명령의 출력과 혼동되지 않도록 두 번째 라인( )을 지웁니다.

두 번째 줄의 텍스트가 터미널보다 넓으면 디스플레이가 깨질 수 있습니다. 수리하려면 Ctrl+를 L살짝 사용하세요 .

답변2

다음은 bashGilles의 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의 의견을 바탕으로 스크립트를 개선했습니다.

관련 정보