Shell
有沒有辦法使提示定義多行?
這是我目前的提示定義:
PS1=$'%F{063}%1~%f %(1v.%F{099}%1v %f.)%F{063}%%%f ' RPROMPT='$VIMODE %m'
我正在努力整合這個。基本上我開始覺得它非常難以理解。
有沒有什麼方法可以使它成為多行,其方式可能類似於 Perl 對正則表達式的處理方式(例如,/x 模式的作用。就像
m{ ... }x
. the...
can be multiline in that)?像這樣的東西:
PS1=$' %F{063}%1 # format blue ~ # show current directory %f %(1v.%F{099}%1v %f.) # show git branch if git repo in purple %F{063} # format blue %# # % for user and # for root %f ' RPROMPT='$VIMODE %m'
使用 Zsh 4.3.11,您可以使用
Z
參數擴展標誌根據正常的 shell 解析規則拆分字元串值,同時丟棄註釋(C
選項 toZ
)並將換行符視為普通空格而不是用分號替換它們(n
選項 toZ
)。然後,您可以將結果重新拼接在一起 (j::
) 並評估引用級別 (Q
) 以讓您引用空格和其他有問題的字元(例如“裸”評論介紹人字元):PS1=${(j::Q)${(Z:Cn:):-$' %F{063}%1 # format blue ~ # show current directory %f" " %(1v.%F{099}%1v %f.) # show git branch if git repo in purple %F{063} # format blue %# # % for user and # for root %f" " '}}
注意:這種解析模式似乎知道它應該將整個
%(v…)
表達式解析為一個單詞,因此我們不必保護條件值中嵌入的空間。但是,我們確實需要保護“頂級”空格(碰巧出現在 之後的%f
那些),否則它們將被視為普通的單詞分隔符。最終的取消引用過程將處理任何引用機制(即\
,''
, )""
,$''
因此您可以選擇用於保護特殊字元的內容(例如“頂級”空格或用於最終值的評論介紹人)。如果您不使用 4.3.11,那麼您可以使用數組讓您在字元串元素中穿插註釋。您可能不得不使用比帶
Z
參數擴展標誌更多的引用,但結果可能仍然是可以容忍的。ps1_arr=( %F{063}%1 # format blue \~ # show current directory %f' ' '%(1v.%F{099}%1v %f.)' # show git branch if git repo in purple %F{063} # format blue %\# # % for user and # for root %f' ' ) PS1=${(j::)ps1_arr}
關於引用的一些注意事項:
~
如果你說而不是拆分它,你可以避免引用它(畢竟%1~
它%~
帶有一個參數)。1
- 我引用了整個
%(v…)
單詞,但只有括號和空格需要保護。- 如果您啟用了 EXTENDED_GLOB ,您只需要引用
#
in 。%#
- 後面出現的空格
%f
需要某種引用。您可以使用反斜杠,但如果您的編輯器中沒有“可見空格”,它可能看起來像續行。
您可以執行以下操作:
PS1='%F{063}%1' # format blue PS1=$PS1'~' # show current directory PS1=$PS1'%f' PS1=$PS1'%(1v.%F{099}%1v %f.)' # show git branch if git repo in purple
等等。?