bash:使用花哨的 PS1 进行位置回声的换行



我的登录脚本中有这样的东西,它将$foo保持在我的终端的右上角。它有效,但有一个警告。如果我键入一个非常长的命令,它不会换行。(好吧,如果长度超过两行,它会换行,但如果有意义的话,第二行会覆盖第一行。(

有人知道我如何在$POS上进行bash包装(即插入换行符(吗?甚至是$COLUMNS?

trunc_pwd () { # See http://www.tldp.org/HOWTO/Bash-Prompt-HOWTO/x783.html
   local pwdmaxlen=50 # Number of $PWD chars to keep
   local trunc_symbol="<" # Prepend to truncated $PWD
   if (( ${#PWD} > $pwdmaxlen )); then
      local pwdoffset=$(( ${#PWD} - $pwdmaxlen ))
      echo "${trunc_symbol}${PWD:$pwdoffset:$pwdmaxlen}"
   else
      echo ${PWD} | sed "s%^${HOME}%~%g"
   fi
}
foo="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"
get_pos ()
{
   POS=$((COLUMNS-(${#foo}+4)))
}
if [[ ${PS1} ]]; then
   PROMPT_COMMAND='get_pos ; echo -ne "33]0;${USER}@${HOSTNAME%%.*}:$(trunc_pwd)"; echo -ne "07"'
   export PS1="u@h W $ [e[s][e[1;$(echo -n ${POS})H]$foo[e[u]"
fi

Bash在提示符中使用[]转义符来确定行长度和换行位置。如果你把任何不应该影响行长度的东西(转义序列、$foo等(放在一起,你就应该没事了

我不知道为什么你的提示不起作用(我也不知道一些转义序列,比如\e[s,可能是你在使用vt100以外的东西(,我的尝试效果很好:

PS1='[e7e[0;$((COLUMNS-(${#foo})))H$fooe8][u@h W]$ '

实际上,如果你把PS1改为,它可能会起作用

PS1="u@h W $ [e[se[1;$(echo -n ${POS})H$fooe[u]"

即将[ ... ]包裹在所有越界的填充物周围。

最新更新