有没有办法使提示定义多行?

有没有办法使提示定义多行?

这是我当前的提示定义:

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,#则仅需引用。%#
  • 之后的空格%f需要某种引用。您可以使用反斜杠,但如果您的编辑器中没有“可见空格”,它可能看起来像续行。

答案3

因为您可能想要快速得到答案,这是一个解决方案

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

但请注意,您不能在字符串内发表评论

相关内容