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

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

這是我目前的提示定義:

PS1=$'%F{063}%1~%f %(1v.%F{099}%1v %f.)%F{063}%%%f '
RPROMPT='$VIMODE %m'

我正在努力整合。基本上我開始發現它非常難以閱讀。

有什麼方法可以使其成為多行,其方式可能類似於 Perl 對正則表達式的作用(例如, /x 模式的作用。就像m{ ... }x. the...可以是多行的那樣)?

像這樣的東西:

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'

答案1

你可以這樣做:

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

ETC。

答案2

在 Zsh 4.3.11 中,您可以使用Z參數擴充標誌根據正常的 shell 解析規則分割字串值,同時丟棄註解(C選項Z)並將換行符號視為普通空格,而不是用分號替換它們(n選項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}

關於引用的一些註解:

  • 你可以避免引用~if 你說%1~而不是拆分它(畢竟它%~帶有一個參數)。1
  • 我引用了整個%(v…)單詞,但只有括號和空格需要保護。
  • 如果啟用了 EXTENDED_GLOB,則只需引用#in 。%#
  • 之後的空格%f需要某種引用。您可以使用反斜杠,但如果您的編輯器中沒有“可見空格”,它可能看起來像續行。

答案3

因為您可能想要快速得到答案,這是一個解決方案

PS1=$'\
%F{063}%1\
~\
%f\
%(1v.%F{099}%1v %f.)\
%F{063}\
%#\
%f '

但請注意,您不能在字串內發表評論

相關內容