창 크기를 조정할 때 bash 프롬프트가 올바르게 다시 그려지지 않습니다.

창 크기를 조정할 때 bash 프롬프트가 올바르게 다시 그려지지 않습니다.

기본적으로 왼쪽에는 항상 현재 디렉토리를, 오른쪽에는 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 수고 없이 터미널 형상의 변화에 ​​반응하는 것과 같은 즉석 렌더링을 만드는 것은 불가능하지는 않더라도 어렵습니다.

관련 정보