ウィンドウのサイズを変更すると、bash プロンプトが正しく再描画されません。

ウィンドウのサイズを変更すると、bash プロンプトが正しく再描画されません。

デフォルトでは、左側には常に現在のディレクトリが表示され、右側にはgitブランチが表示される下部バーがあります。私は電力線を使ってみましたが、私が望むものではなく、プロンプトの上にバーがなければ動作しませんでした。

今、ウィンドウのサイズ変更に問題があります。下のバーに奇妙なマークがあります。私は標準のUbuntu 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

あなたが直面している問題は、端末の一番下の行の「ステータスバー」がシェルプロンプトと同時に作成されることです(実際にはシェルプロンプトの一部であるため)。このプロセスは、端末のサイズを部分的に決定します。プロンプトが画面に記録されると。したがって、後で端末のサイズを変更すると、端末に作成されたプロジェクトは端末のサイズを知りません(または実際には端末のサイズをまったく調整できません)。残念ながら、Sysypheanの苦労なしにターミナルジオメトリの変化に反応するような即時レンダリングを作成することは不可能ではありませんが、困難です。

おすすめ記事