2014-07-17 116 views
1

這是一個複雜的問題,但這裏什麼都沒有! 我最近更新了我的bash提示符,出現在此主題的最後一篇文章中的漂亮版本:Bash: custom PS1 with nice working directory path。 相關的bash代碼(從該線程後)在這裏被複制:emacs終端bash(PS1)提示重複

# define the awk script using heredoc notation for easy modification 
MYPSDIR_AWK=$(cat << 'EOF' 
BEGIN { FS = OFS = "/" } 
{ 
    if (length($0) > 16 && NF > 4) 
     print $1,$2,".." NF-4 "..",$(NF-1),$NF 
    else 
     print $0 
} 
EOF 
) 

# my replacement for \w prompt expansion 
export MYPSDIR='$(echo -n "${PWD/#$HOME/~}" | awk "$MYPSDIR_AWK")' 

# the fancy colorized prompt: [0 [email protected] ~]% 
# return code is in green, [email protected] is in bold/white 
export PS1='[\[\033[1;32m\]$?\[\033[0;0m\] \[\033[0;1m\]\[email protected]\h\[\033[0;0m\] $(eval "echo ${MYPSDIR}")]% ' 

# set x/ssh window title as well 
export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*} $(eval "echo ${MYPSDIR}")\007"' 

此提示看起來大致是這樣(在非emacs的終端):

[0 [email protected] ~/my_dir]% 

其中「0」以上綠色和「用戶@主機」爲粗體。 (注意「0」可以是各種數字,並且表示最後一個命令的返回值。)

我遇到的問題特定於在emacs中運行的shell(對於大多數變體emacs中的終端交互:'term','ansi-term','shell'和'eshell')。 提示出現兩次(和稍微打破)在emacs的終端,像這樣:

0;[email protected] ~/my_dir[0 [email protected] ~/my_dir]% 

提示,所述的「第二」版本從開始幷包括「[」看起來就好了。 這是前面的文字,它沒有任何樣式(即沒有綠色和沒有粗體)。 因此,emacs必須將提示的某些部分解釋爲輸入,並且我的猜測是連接到提示的「0」和「user @ host」部分的顏色或粗體轉義指示符?

任何人都知道如何告訴emacs正確解釋轉義? 或者,或者,如何修改提示設置命令,使兩個emacs不會討厭它,它仍然可以在非emacs終端工作? 也許甚至有另一種選擇:如何使用emacs友好的已修改字符串爲終端類型添加測試(emacs中的'eterm-color')?

+0

如果您禁用'PROMPT_COMMAND',這會停止嗎? –

+0

是的。萬分感謝! 好吧,我只是試着添加一個鉤子來清除shell的環境變量。 (或者只是住在沒有窗口標題更新功能的地方。) 再次感謝! – mmuurr

+0

有可能讓emacs理解控制順序,但我甚至不知道從哪裏開始。我使用vim。 =) –

回答

1

額外顯示來自PROMPT_COMMAND變量的內容。 emacs似乎不理解OSC 0標題設置xterm轉義序列,因此打印輸出。

3

錯誤來自export PROMPT_COMMAND=...聲明。

通過檢查是否有在emacs內部運行的shell,可以避免在配置中讀取此內容。這裏環境變量INSIDE_EMACS變得方便。從Emacs手冊(Sect. 32.7):

Emacs的設置環境變量INSIDE_EMACS在殼層爲「版本,通信情報」,其中版本是版本的Emacs(例如,'24 0.1’ )。程序可以檢查此變量,以確定它們是否在Emacs中運行子shell

在你的榜樣,你要 export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*} $(eval "echo ${MYPSDIR}")\007"只有當你不在的emacs被執行,否則,你得到這個討厭的「雙重提示」。代碼中的以下條件語句將有所幫助。

if [ -z "$INSIDE_EMACS" ]; 
then 
    export PROMPT_COMMAND='echo -ne "\033]0;${USER}@${HOSTNAME%%.*} $(eval "echo ${MYPSDIR}")\007"' 
else 
    export PROMPT_COMMAND='' 
fi 

它檢查不管你是不是在Emacs,才把PROMPT_COMMAND變量設置爲你想要的值。