
Вот мое текущее определение:
PS1=$'%F{063}%1~%f %(1v.%F{099}%1v %f.)%F{063}%%%f '
RPROMPT='$VIMODE %m'
и я работаю над интеграциейэтот. В общем, я начинаю находить это совершенно нечитабельным.
Есть ли способ сделать его многострочным, возможно, аналогично тому, как это делает Perl с регулярными выражениями (например, как это делает режим /x. Например m{ ... }x
, в этом случае он ...
может быть многострочным)?
Что-то вроде этого:
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
и т. д.?
решение2
С Zsh 4.3.11 вы можете использовать Z
флаг расширения параметра для разделения строкового значения в соответствии с обычными правилами разбора оболочки, отбрасывая комментарии ( 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…)
слово, но защитить нужно только скобки и пробел. - Вам нужно заключить
#
in в кавычки только%#
в том случае, если у вас включен EXTENDED_GLOB. - Пробелы, которые появляются после,
%f
требуют какого-то кавычек. Вы можете использовать обратную косую черту, но это может выглядеть как продолжение строки, если в вашем редакторе нет «видимых пробелов».
решение3
поскольку вы, вероятно, хотите получить быстрый ответ, вот решение
PS1=$'\
%F{063}%1\
~\
%f\
%(1v.%F{099}%1v %f.)\
%F{063}\
%#\
%f '
но учтите, что вы не можете комментировать внутри строки