这是我当前的提示定义:
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 '
但请注意,您不能在字符串内发表评论