【问题标题】:bash: line wrapping with fancy PS1 that does positional echo'ingbash:用漂亮的 PS1 换行,可以进行位置回显
【发布时间】:2011-11-28 14:45:54
【问题描述】:

我的登录脚本中有类似的东西,它把 $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 "\033]0;${USER}@${HOSTNAME%%.*}:$(trunc_pwd)"; echo -ne "\007"'
   export PS1="\u@\h \W \$ \[\e[s\]\[\e[1;\$(echo -n \${POS})H\]$foo\[\e[u\]"
fi

【问题讨论】:

    标签: bash shell ps1


    【解决方案1】:

    Bash 在提示符中使用\[\] 转义来确定行长和换行位置。如果您将不应该影响行长的任何内容(转义序列、$foo 等)包含在那些您应该没问题的内容中。

    我不确定为什么您的提示不起作用(而且我无法识别某些转义序列,例如 \e[s,可能是您使用的不是 vt100),我的尝试只是有效很好:

    PS1='\[\e7\e[0;$((COLUMNS-(${#foo})))H$foo\e8\][\u@\h \W]\$ '
    

    实际上重新审视你的,如果你把你的 PS1 换成它可能会起作用

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

    即,将 \[ ... \] 包裹在所有不合规的东西周围。

    【讨论】:

    • 是的,+1。 (ESC [ s 是“保存光标位置”,ESC [ &lt;y&gt; ; &lt;x&gt; H 是“设置光标位置”,ESC [ u 是“恢复光标位置”。)它试图在窗口的其他地方打印$foo,所以@ 的长度987654330@ 应该被忽略,以便跟踪输入行上的提示的长度 - 这意味着 $foo 应该按照您的建议在 \[...\] 内部,而不是在原始外部.
    • 你们摇滚。 \[ ... \] 是我的问题。现在,我喜欢$((COLUMNS-(${#foo}))) 更优雅的解决方案,而不是在PROMPT_COMMAND 中调用函数。我很高兴也很谦虚。谢谢!
    • @evil-otto - 使用您的解决方案,我将如何添加颜色?当我尝试时,它会弄乱包装和命令编辑。我在逃亡序列地狱!
    • 纳米,明白了。当然,在 6 个月内我永远不会破译这个 :-) PS1="\[\e[1;32m\]\u@\h \[\e[1;34m\]\W \$ \[\e[1;31m\]\[\e[s\e[1;$((COLUMNS-(${#foo})))H$foo\e[u\]\[\e[0m\]"
    • @Norma Stitz - 你总是可以通过设置RED='\e[1;31m'; NORMAL='\e[0m'; 等变量使其更具可读性,并让你的提示PS1="${RED}\u@\h${NORMAL} ..." 或任何你需要的东西
    猜你喜欢
    • 2010-12-17
    • 1970-01-01
    • 2018-05-13
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2013-11-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多