2

私のログインスクリプトには、端末の右上に $foo を保持するこのようなものがあります。動作しますが、注意が必要です。非常に長いコマンドを入力すると、折り返されません。(まあ、それが 2 行を超える場合は折り返されますが、それが理にかなっていれば、2 行目が 1 行目を上書きします。)

$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
4

1 に答える 1

3

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\]"

\[ ... \]つまり、すべてのアウトオブラインのものをラップします。

于 2011-09-30T17:33:58.617 に答える