2011-09-30 19 views
2

私の端末の右上に$ fooを残しているログインスクリプトにはこういうものがあります。それは動作しますが、警告があります。私が実際に長いコマンドを入力すると、それは折り返されません。 (それは2行以上であれば折り返しますが、2行目で1行目が上書きされます。)bash:ポジションエコーをするファンシーなPS1で行を折り返す

誰でも$ 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="\[email protected]\h \W \$ \[\e[s\]\[\e[1;\$(echo -n \${POS})H\]$foo\[\e[u\]" 
fi 

答えて

3

バッシュどこラップする行の長さとを決定するために迅速に\[\]エスケープを使用します。行の長さ(エスケープシーケンス、$ fooなど)に影響を及ぼしてはならないものは、大文字小文字にする必要があります。

なぜあなたのプロンプトが機能しないのか分かりません(私はvt100以外の何かにいる可能性があります)うまく:

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

は実際にあなたで再見て、それはあなたがすべてのアウトオブラインのものを中心に\[ ... \]を包む、

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

すなわちに、あなたのPS1を変更する場合はうまくいくかもしれません。

+0

はい、+1。 ( 'ESC [s'は"カーソル位置を保存する "、' ESC [; Hは "カーソル位置を設定"、 "ESC [uは"カーソル位置を復元する]) '$ foo'ウィンドウのどこかにあるので、 '$ foo'の長さは、入力行のプロンプトがどれくらいの間続くかを追跡するために無視されるべきです。つまり、' $ foo'は '\ [' ... ' \] 'を使用してください。 –

+0

あなたたちは岩です。 '\ [... \]'が私の問題でした。これで、PROMPT_COMMANDで関数を呼び出すのではなく、より洗練された '$((COLUMNS - ($ {#foo})))'の解決法が好きです。私は幸せで謙虚だ。ありがとう! –

+0

@ evil-otto - あなたのソリューションを使用して、私はどのように色を追加しますか?私が試してみると、それはラッピングとコマンド編集を混乱させます。私はエスケープシーケンスの地獄にいる! –

関連する問題