Shell

有沒有辦法使提示定義多行?

  • May 20, 2011

這是我目前的提示定義:

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選項 to Z)並將換行符視為普通空格而不是用分號替換它們(n選項 to Z)。然後,您可以將結果重新拼接在一起 ( 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

等等。?

引用自:https://unix.stackexchange.com/questions/1042