프롬프트에서 여러 줄을 정의하도록 하는 방법이 있나요?

프롬프트에서 여러 줄을 정의하도록 하는 방법이 있나요?

이것은 현재 프롬프트 정의입니다.

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인수 확장 플래그를 사용하여 일반 쉘 구문 분석 규칙에 따라 문자열 값을 분할하는 동시에 주석( Coption )을 삭제하고 새 줄을 세미콜론( option ) Z으로 바꾸는 대신 일반 공백으로 처리할 수 있습니다. 그런 다음 결과를 다시 모으고( ) 인용 수준을 평가하여( ) 공백 및 기타 문제가 있는 문자(예: "기본" 주석 소개 문자)를 인용할 수 있습니다.nZj::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를 활성화한 경우에는 따옴표만 필요합니다 #.%#
  • 그 이후의 공백에는 %f일종의 인용이 필요합니다. 백슬래시를 사용할 수 있지만 편집기에 "표시되는 공백"이 없으면 줄이 이어지는 것처럼 보일 수 있습니다.

답변3

아마도 빠른 답변을 원할 것이므로 여기에 해결책이 있습니다.

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

하지만 문자열 내부에는 주석을 달 수 없다는 점에 유의하세요.

관련 정보