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


답변:


17

다음 설정이 작동하는 것 같습니다. 명령 행이 첫 번째 행을 넘으면 두 번째 행의 텍스트가 사라집니다. 이 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를 사용하십시오 .


5

다음은 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기능 을 모방하는 해키 방법 입니다. 자세한 내용은 /superuser/175799/ 를 참조 하십시오 .

편집 : Gilles의 의견에 따라 스크립트가 개선되었습니다.


@Gilles : 입력 주셔서 감사합니다! 나는 지금 더 잘 작동하고 있다고 생각합니다. gnome-terminal 및 xterm에서 bash 4.1.5를 시도하고 OSX 터미널에서 bash 3.2.48을 시도했습니다.
Jander
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.