
zsh에서 여러 줄 프롬프트를 정의할 수 있다는 것을 알고 있습니다.
PROMPT='
test
→ '
그런데 왜 여러 줄의 오른쪽 프롬프트를 정의할 수 없는지 궁금합니다. 나는 시도했다:
RPROMPT='
test
still test '
하지만 아무것도 나타나지 않습니다. 이것이 가능한가?
답변1
precmd
프롬프트가 표시되기 전에 매번 실행되는 함수를 사용하여 프롬프트 위에 추가 줄을 인쇄하면 원하는(제 생각이 맞다면) 효과를 얻을 수 있습니다 .
예를 들어 다음 코드를 사용하십시오.
precmd() {
LEFT="The time is"
RIGHT="$(date) "
RIGHTWIDTH=$(($COLUMNS-${#LEFT}))
print $LEFT${(l:$RIGHTWIDTH::.:)RIGHT}
}
PS1="foo > "
RPS1="bar"
설명
$LEFT
$RIGHT
왼쪽과 오른쪽의 끈을 잡습니다 . 구문 과 함께 명령 출력을 사용할 수 있습니다$(...)
.$RIGHTWIDTH
현재 터미널 너비의 차이입니다(다음으로 저장됨).zsh매개변수 에서$COLUMNS
) 및 왼쪽 문자열의 너비.$((...))
수학적 표현을 위한 것입니다${(l:$RIGHTWIDTH::.:)RIGHT}
매개변수가 의 길이만큼 점으로$RIGHT
왼쪽으로 채워지는(l
)(공백을 원할 경우 마지막 생략 ) 마법이 제공됩니다 .:.:
$RIGHTWIDTH
- 추가 줄을 인쇄합니다. 더 많은 줄을 원하면 명령을 반복하십시오.
PS1
및 에RPS1
대해서는 더 짧습니다 .PROMPT
RPROMPT
데모
The time is............................................Fri, Sep 18, 2015 8:20:22 PM
foo > _ bar
답변2
여러 줄의 올바른 프롬프트를 설정하는 것은 분명히 불가능하지 않습니다.이 하나그것을 관리합니다. 그러나 나는 다음과 같이 말하고 싶습니다.
local top_left='%F{blue}%~%f'
local top_right="%F{green}${git_branch}%f"
local bottom_left='%B%F{%(?.green.red)}%#%f%b '
local bottom_right='%F{yellow}%T%f'
local REPLY
fill-line "$top_left" "$top_right"
PROMPT=$REPLY$'\n'$bottom_left
RPROMPT=$bottom_right
PROMPT
왼쪽 상단과 오른쪽 상단, 왼쪽 하단을 점유하고 RPROMPT가 오른쪽 하단을 점유 함으로써 가능합니다 . 그래도 RPROMPT 적절한 명령은 한 줄만 갖게 됩니다.