기본적으로 왼쪽에는 항상 현재 디렉토리를, 오른쪽에는 git 브랜치를 표시하는 하단 표시줄이 있습니다. 나는 전력선을 사용해 보았지만 내가 원하는 것이 아닌 프롬프트 위에 막대가 있어야만 작동했습니다.
지금 창 크기를 조정하는 데 문제가 있습니다. 하단 표시줄에 이상한 표시가 있습니다. 저는 표준 우분투 20.04 설치와 함께 제공되는 표준 터미널을 사용하고 있습니다.
내 팁은 다음과 같습니다. (알아요. 매우 복잡하고 어쩌면 약간 추악할 수도 있습니다...)
plen() {
local ps len
ps="$(perl -pe 's|\\\[.*?\\\]||g' <<<" \u \w")"
len="$(wc -m <<<"${ps@P}")"
printf '%s\n' "$((len))"
}
getCPos () {
local v=() t=$(stty -g)
stty -echo
tput u7
IFS='[;' read -rd R -a v
stty $t
CPos=(${v[@]:1})
}
update-ps() {
local EXIT="$?"
local CSI=$'\e'"["
local LEFT_STATEMENT="${CSI}48;5;32m \u ${CSI}40m \w${CSI}0;0m"
local CURRENT_COLS=$(tput cols)
local RIGHT_STATEMENT=$(__git_ps1 " %s")
local LEFT_LENGTH=$(plen "$LEFT_STATEMENT")
local TOTAL_LENGTH=$(echo "${LEFT_LENGTH} + ${#RIGHT_STATEMENT}" | bc)
local HPA_RIGHT=$(echo "$CURRENT_COLS - ${#RIGHT_STATEMENT}" | bc)
if [[ $TOTAL_LENGTH -gt $CURRENT_COLS ]] || [[ ${#RIGHT_STATEMENT} -lt 1 ]]
then
RIGHT_STATEMENT=""
else
RIGHT_STATEMENT="$(tput hpa ${HPA_RIGHT})${RIGHT_STATEMENT}"
fi
local BOTTOM_BAR="\[${CSI}s${CSI}1;$((LINES-1))r${CSI}$LINES;1f${LEFT_STATEMENT}${CSI}40m${CSI}K${RIGHT_STATEMENT}${CSI}K${CSI}u\]"
if [ $EXIT == 0 ]; then
local USER_INPUT="\[\033[48;5;28m\] $ \[\033[0;0m\] "
else
local USER_INPUT="\[\033[48;5;1m\] $ \[\033[0;0m\] "
fi
# Somehow, e.g. when using vim and prompt was at LINE-1, then it get's stuck in the last line. A small workaround for this issue.
getCPos
if [[ $CPos -gt $((LINES - 1)) ]]
then
export PS1="\n${BOTTOM_BAR}$(tput cup $((LINES-2)))${USER_INPUT}"
else
export PS1="${BOTTOM_BAR}${USER_INPUT}"
fi
}
PROMPT_COMMAND="update-ps;$PROMPT_COMMAND"
답변1
당신이 직면하고 있는 문제는 터미널 맨 아래 줄의 "상태 표시줄"이 쉘 프롬프트와 동시에 작성된다는 것입니다(실제로 쉘 프롬프트의 일부이기 때문입니다). 이 프로세스는 터미널 크기를 부분적으로 결정합니다.프롬프트가 화면에 기록되면. 따라서 이후에 터미널 크기를 조정하는 경우 터미널에 작성된 프로젝트는 터미널 크기를 알 수 없습니다(또는 실제로 터미널 크기를 전혀 조정할 수 없음). 불행하게도 Sisyphean 수고 없이 터미널 형상의 변화에 반응하는 것과 같은 즉석 렌더링을 만드는 것은 불가능하지는 않더라도 어렵습니다.