2011-08-18 54 views
4

我有一個具體方法爲我的bash提示符,比方說,它看起來像這樣:如何逃脫bash的Unicode字符提示正確

CHAR="༇ " 
my_function=" 
    prompt=\" \[\$CHAR\]\" 
    echo -e \$prompt" 

PS1="\$(${my_function}) \$ " 

爲說明上述情況,我通過執行builidng我的bash提示符存儲在字符串中的函數,這是作爲this question的結果做出的決定。讓我們假裝它可以正常工作,因爲它確實如此,除非涉及unicode字符

我試圖找到正確的方法來轉義unicode字符,因爲現在它與bash行長度混淆。測試它是否損壞的簡單方法是輸入一個長命令,執行它,按下CTRL-R鍵並找到它,然後按下CTRL-A CTRL-E跳到該行的開頭/結尾。如果文本出現亂碼,那麼它不起作用。

我已經嘗試了幾件事情來正確地轉義函數字符串中的Unicode字符,但似乎沒有任何工作。

特殊字符,像這樣的工作:

COLOR_BLUE=$(tput sgr0 && tput setaf 6) 

my_function=" 
    prompt="\\[\$COLOR_BLUE\\] \" 
    echo -e \$prompt" 

這是我做了提示功能串的主要原因。該轉義序列不會混亂行長,它只是unicode字符。

回答

1

\[...\]序列表示完全忽略字符串的這部分,當您的提示包含一個零長度序列時,例如改變文本顏色或標題欄的控制序列,這很有用。但在這種情況下,您正在打印一個字符,所以它的長度不爲零。也許你可以通過使用沒有操作的轉義序列來欺騙Bash來計算正確的行長來解決這個問題,但這聽起來像是瘋狂。

正確的解決方案將是爲在擊行長度計算正確神交UTF-8(或任何Unicode編碼它是您正在使用)。呃,你有沒有試過\[...\]序列?

編輯:下實現了我在下面的意見提出解決方案。保存光標位置,然後在\[...\]之外打印兩個空格,然後恢復光標位置,並在兩個空格的頂部打印Unicode字符。這假定固定的字體寬度,Unicode字符的寬度爲雙倍。

PS1='\['"`tput sc`"'\] \['"`tput rc`"'༇ \] \$ ' 

至少在OSX終端中,Bash 3.2.17(1) - 釋放,這通過了粗略的[sic]測試。

在透明度和可讀性的利益,我都忽略了要求有一個函數裏面的提示的功能,顏色編碼;這只是改變提示字符,空格,美元提示,空格。適應你的複雜需求。

+0

我試過沒有\\ [\\],我得到了同樣的亂碼結果。但是,如果我用x這樣的正常字符替換,我看不到問題(再次,不使用轉義序列)。我也試過△作爲一個不同的角色,但同樣的事情 –

+0

也許你可以換一對詛咒命令的問題的順序,像'tput的sc',打印兩個空格,'tput的rc',打印您的Unicode字符。這兩個空格(或其他具有正確寬度的序列)必須位於'\ [... \]'之外,其餘部分都在其中。另請參閱http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x405.html – tripleee

+0

您贏了這個竅門,發佈了完整的解決方案作爲評論 –

1

(不回答你的問題,但一些指針和有關您的問題的一般經驗。)

我看你描述關於CMD行編輯(按Ctrl-R的行爲,... CNTRL-A Ctrl-E ......),即使沒有unicode字符。

在一個工作現場,我花時間瞭解終端對TERM設置和操作系統使用的TERM定義的解釋(以及stty我想)。

現在,當我遇到這個問題時,我逃離了當前編輯該行的嘗試,再次將該行取出來,然後立即進入打開vi編輯器的'vi'模式。 (只需按'v'字符,對嗎?)。所有易於使用vi的全面會議;爲什麼要少用;-)?

你的問題的描述再次尋找,當你說

my_function=" 
    prompt=\" \[\$CHAR\]\" 
    echo -e \$prompt" 

這只是一個字符串的定義,對不對?我假設您通過假設這是您的my_function的輸出來簡化問題定義。看起來很有可能在創建函數定義的步驟中,使用返回的值調用函數AND有很多機會使shell引用無法按照您希望的方式工作。

如果您編輯您的問題以包括my_function定義及其完整使用(將您的功能降低到導致問題的原因),但其他人也可能更容易幫助解決此問題。最後,你是否經常使用set -vx?它可以幫助顯示變量擴展的/如何/什麼,你可能在那裏找到某些東西。

所有這些失敗,請看Orielly termcap & terminfo。您可能需要查看本地系統stty和相關cmds的手冊頁,並且您可能會很好地查找特定於您的Linux系統的用戶組(我假設您使用的是Linux變體)。

我希望這會有所幫助。

+0

什麼世界確實的stty(1)有什麼關係在這裏做什麼? – tchrist

1

@tripleee贏得它,在這裏張貼最終的解決方案,因爲它是一個婊子在評論郵編:

CHAR="༇" 
my_function=" 
    prompt=\" \\[`tput sc`\\] \\[`tput rc`\\]\\[\$CHAR\\] \" 
    echo -e \$prompt" 

PS1="\$(${my_function}) \$ " 

訣竅在tripleee的鏈接指出的是使用命令tput sctput rc其中保存的然後恢復光標位置。該代碼有效地保存了光標位置,爲寬度打印兩個空格,將光標位置恢復到空格之前,然後打印特殊字符以使行的寬度來自兩個空格,而不是字符。

+0

但是嵌套變量是什麼?給'prompt'賦值只是爲了'echo'並丟棄它似乎特別浪費。 – tripleee

+0

我從一個更大的函數中提供了一個片段來顯示用例。整個事情(現在的工作,感謝你)是我的文件底部的大串:混帳,SVN和格式化精美的提示信息汞柱:https://github.com/DelvarWorld/configs/blob/master/的.bashrc –