首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >bash提示符无法在调整大小的窗口上正确重新绘制。

bash提示符无法在调整大小的窗口上正确重新绘制。
EN

Unix & Linux用户
提问于 2021-07-28 14:21:07
回答 1查看 302关注 0票数 0

基本上,我有一个底部栏,它总是在左边显示当前目录,在右边显示git分支。我试着使用电力线,但它的工作只有在提示符上方有一个栏,这不是我想要的。

现在,当调整窗口大小时,我会遇到一些问题,因为我有一些奇怪的底部条工件。我正在使用标准终端,它附带一个标准的ubuntu20.04安装。

这是我的提示(我知道,这很复杂,可能有点难看……)

代码语言:javascript
复制
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"
EN

回答 1

Unix & Linux用户

发布于 2021-07-28 14:28:43

您面临的问题是,终端底线上的“状态栏”与shell提示符同时写入(因为它实际上是shell提示符的一部分)。这个过程在一定程度上决定了在提示符写入屏幕时终端的大小。因此,如果随后调整终端的大小,那么已经写入终端的项目无法知道终端的大小(或者根本不会调整其大小)。不幸的是,如果没有辛辛苦苦,如果不是不可能的话,就很难做出快速生成的渲染,比如对终端几何学的改变做出反应。

票数 0
EN
页面原文内容由Unix & Linux提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://unix.stackexchange.com/questions/660328

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档