基本上我有一个底部栏,总是在左侧显示当前目录,在右侧显示 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
您面临的问题是终端底行的“状态栏”与 shell 提示符同时写入(因为它实际上是 shell 提示符的一部分)。此过程部分决定了您的终端的大小当提示被写入屏幕时。因此,如果您随后调整终端的大小,则已写入终端的项目无法知道终端的大小(或者实际上根本无法调整终端的大小)。不幸的是,如果没有西西弗斯式的辛劳,即使不是不可能,也很难做出即时生成的渲染,例如对终端几何变化做出反应的渲染。