2011-09-30 14 views
2

我有我的登錄腳本這樣的事情,保持$ foo的在我的終端右上方的包裝。它有效,但有一個警告。如果我輸入一個非常長的命令,它不會換行。 (好吧,如果它超過兩行,它會自動換行,但第二行覆蓋第一行,如果有意義的話)。擊:符合花哨的PS1,做位置echo'ing

任何人都知道如何讓bash換行(即插入換行符)在$ POS ?甚至在$ 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

bash使用在提示中\[\]和逃逸,以確定線的長度,並且其中包。如果你包含任何不應該影響行長度的東西(轉義序列,$ foo等)和你應該沒問題的東西。

我不知道爲什麼你的提示不工作(我不承認一些像\ E [S中的轉義序列,可能是你在一個比其他VT100的東西),我嘗試的作品就好:

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

實際上重新看你的,它可能會,如果你改變你的PS1到

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

即包裝\[ ... \]周圍所有的亂行的東西工作。

+0

是,+1。 ('ESC [s'是 「保存光標位置」,'ESC [; H'的 「設置光標位置」 和'ESC [u'是 「恢復光標位置」),它試圖打印'$ foo'在窗口,所以'$ foo'的長度在其他地方應該被忽略跟蹤輸入線路上的提示是多久的目的 - 這意味着'$ foo'應該是裏面的'\ [''...根據你的建議,而不是像原來那樣在外面。 –

+0

你們搖滾。 '\ [... \]'是我的問題。現在,我喜歡'$((COLUMNS - ($ {#foo})))'的更優雅的解決方案,而不是在PROMPT_COMMAND中調用函數。我很高興和謙虛。謝謝! –

+0

@ evil-otto - 使用您的解決方案,我將如何添加顏色?當我嘗試它時弄亂包裝和命令編輯。我在逃避序列地獄! –