zsh 프롬프트에서 경로를 포맷하는 방법은 무엇입니까?


23

읽을 수있는 색상 경로를 갖고 싶습니다. 예를 들어 단순히 % ~를 사용하여 반환하는 대신 경로 구분 기호를 강조 표시 ~/path/to/foo하도록 형식을 지정하고 싶습니다 ~$RED/$NOCOLORpath$RED/$NOCOLORto$RED/$NOCOLORfoo.

각 디스플레이에서 경로 표현식을 다시 평가할 수 있도록 PROMPT의 컨텐츠를 정의 할 수 있습니까? 같은 뭔가 ${${(%):-%~}//\//_some_format_expression/}분명히 작동하지 않습니다.

아니면 이것을 더 해킹하고 디렉토리를 변경할 때마다 PROMPT 값을 강제로 재설정해야합니까?

경로 형식화 목표를 달성하는 모든 솔루션을 환영합니다.

감사 :)


당신이 여전히 존재한다면 당신은 이것에 대한 최고의 답변을 표시하고 싶을 것입니다 :)
Dan Rosenstark

답변:


36

zsh

이 시도:

setopt PROMPT_SUBST
PROMPT='%{$(pwd|grep --color=always /)%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

프롬프트는 다음과 같습니다.

  • PROMPT_SUBST는 프롬프트에서 명령 대체 (및 매개 변수 확장 및 산술 확장)를 켭니다.
  • %{...%} -이스케이프 시퀀스
  • $(pwd|grep --color=always /)-현재 디렉토리를 인쇄하고 강조 표시합니다 /-색상은 $ GREP_COLORS 환경 변수 (또는 기본값)에 따라 다릅니다.-굵은 빨간색이 기본값입니다.
  • %${#PWD}G-현재 디렉토리 이름의 문자 길이를 글리치 값으로 사용하십시오. 이렇게하면 쉘이 %{ANSI 이스케이프 시퀀스를 포함하는 문자열의 실제 길이 대신 이전 문자 시퀀스의 길이 ( " " 뒤 )를 고려하게됩니다. 이렇게하면 프롬프트의 끝을 기준으로 셸이 커서 위치에 대해 혼동되지 않습니다.
    - - - - - - - - - - - 이 응답 부분의 끝 질문 - - - - - - - - - - - - -
  • %(!.%F{red}.%F{cyan}) -이것이 특권 쉘 (루트) 인 경우 전경색을 빨간색으로 설정하고, 그렇지 않으면 녹청
  • %n -사용자 이름을 출력
  • %f -전경색을 기본값으로 재설정
  • @ -문자 그대로
  • %F{yellow} -전경색을 노란색으로 만듭니다.
  • %m -호스트 이름을 출력
  • %f -전경색을 기본값으로 재설정
  • %(!.%F{red}.) -이것이 특권 쉘 (루트) 인 경우 전경색을 빨간색으로 설정하십시오.
  • %#- 출력 A를 #권한 쉘 또는 %권한이없는 하나
  • %f -전경색을 기본값으로 재설정

질문은 경로와 관련이 있기 때문에 강조를 위해이 프롬프트에서 경로를 먼저 넣습니다.

대체 텍스트

다음은 $GREP_COLORS변수 를 조작하여 루트 (권한) 여부에 따라 슬래시 색상을 변경하는 zsh 버전입니다 .

setopt PROMPT_SUBST
PROMPT='%{$(pwd|([[ $EUID == 0 ]] && GREP_COLORS="mt=01;31" grep --color=always /|| GREP_COLORS="mt=01;34" grep --color=always /))%${#PWD}G%} %(!.%F{red}.%F{cyan})%n%f@%F{yellow}%m%f%(!.%F{red}.)%#%f '

세게 때리다

Bash에서도 비슷한 프롬프트를 수행 할 수 있습니다. 이 예에서는 사용자와 호스트 이름을 먼저 입력했으며 UID가 0 일 때 슬래시 색상도 변경됩니다. 경고 : Bash의 $PS1프롬프트 변수를 덮어 씁니다 . 특별한 일을하거나 변수를 직접 설정할 때 동작이 변경 될 것으로 예상하지 않는 한 문제가되지 않습니다. 또한 이것은 " usercolor" 이라는 변수를 사용하는데,이 변수는 다른 모든 것과 충돌 할 수 있지만,이 모든 것은 함수에 넣어 질 수 있고 변수는 local로 선언 될 수 있습니다.

PROMPT_COMMAND='usercolor="\[\033[0;36m\]";[[ $EUID == 0 ]] && usercolor="\[\033[1;31m\]";PS1="$(pwd)";PS1="$usercolor\u\[\033[0m\]@\[\033[0;33m\]\h\[\033[0m\]:${PS1//\//$usercolor/\[\033[0m\]}$usercolor\\$\[\033[0m\] "'

대체 텍스트

나는 Bash에 매개 변수 확장 대체를 사용하여 슬래시를 조건부로 채색하는 (그립을 사용하는 대신) zsh의 "글리치"기능이 없다는 사실을 이용했습니다.


나를 바보라고 부르십시오. 그러나 내가 가진 유일한 잘못된 부분은 PROMPT 정의에서 작은 따옴표 대신 큰 따옴표를 사용하는 것입니다. 감사합니다 :)
Nicolas Dumazet

@NicDumZ는, 재미 있고, 나는 그 문제가 다른 곳에서 20 분 어제 :)에 대한 지출
댄 Rosenstark는

1
이것은 엄청나게 멋있고 시원합니다. 감사합니다 ...
Dan Rosenstark

Bash 에서이 작업을 수행하는 방법 또는 Bash에서 왜 작동하지 않는지 알고 있습니까? Bash를 사용하면 터미널을 시작하는 첫 번째 디렉토리에 멈 춰 움직일 때 업데이트되지 않습니다. 방금 $ (pwd | grep --color = always /)를 가져 와서 PS1에 넣고 이상한 동작을했습니다. 편집 : 오! 배쉬 섹션 LOL을 보지 못했습니다.
Ibrahim

사실, 더 복잡한 프롬프트에서 Bash에 PS1 트릭을 사용하려고하는데 작동하지 않습니다 .PWD가 다시 멈 춥니 다. 그러나 스 니펫은 그대로 작동합니다. PROMPT_COMMAND의 목적은 무엇입니까? 이것이 내가 가진 것입니다 : github.com/ibrahima/dotfiles/blob/master/.bashrc.d/prompt.sh에PS1="$(pwd)"; PS1="${debian_chroot:+($debian_chroot)}\[$bldgrn\]\u@$(fgcolor $hostnamecolor)\h$(resetcolor)\[$txtrst\]:\[$bldblu\]${PS1//\//$txtred/$bldblu}\[\e[00m\]$bldred\$(parse_git_branch)\[$txtrst\] \[$undcyn\]\T \d\[$txtrst\] 95\$ " 정의 된 색상
Ibrahim

4

몇 가지 둘러보고 나면 솔루션 재정의를 제공 할 수 있습니다 chpwd.

doprompt() {
  local my_path=${(%):-%~}
  PROMPT="${yourstuff}${my_path//\//${PR_BOLD_RED}/${reset_color}}${otherstuff}"
}
doprompt

chpwd() {
  doprompt
  # unrelated: set window title
  [[ -t 1 ]] || return;
  print -Pn "\e]2;%n@%m: %~\a";
}
  • 임시 코드를 제거하기 위해이 코드를 개선하는 방법이 my_path있습니까? / 내부 %를 직접 바꿀 수 없습니다 ~ ...
  • 각 디렉토리 변경에 대한 호출을 피하기 위해 동적 구문을 사용하는 솔루션 doprompt은 아마도 더 깨끗할 것입니다.

4

순수한 zsh 솔루션 :

PROMPT='%n@%m: %{$PR_BOLD_RED%}${${(%):-%~}//\//${PR_BOLD_RED}/%f}%f '
  • ${(%):-%~} 현재 경로입니다.
  • ${xxxxx//\//${PR_BOLD_RED}/%f} xxxxx의 모든 /를 굵은 빨간색으로 바꿉니다.
  • 물론 PROMPT_SUBST가 켜져 있어야합니다.

테스트에서 큰 따옴표를 사용하고 있었으므로 대체 할 수 없습니다. 작은 따옴표로 모든 것이 잘 작동합니다.


$PR_BOLD_RED다른 곳에서 정의 했어야합니다 . 두 번째 "빨간색"뒤에 닫는 중괄호 (만) PROMPT='%n@%m: %{%B%F{red}%}${${(%):-%~}//\//%B%F{red\}/%b%f}%b%f '매우 이상한 탈출을 포함하여 사용해야 합니다 .
추후 공지가있을 때까지 일시 중지되었습니다.

예, Aaron Toponce의 이름 인 pthree.org/wp-content/uploads/2009/03/zsh_prompt 를 사용 합니다. 그 외에는 아무것도 벗어날 필요가 없으며 제공된대로 작동합니다.
Nicolas Dumazet 2009

0

다음은 NicDumZ를 기반으로 한 시도입니다.

setopt PROMPT_SUBST
# red, green, yellow, blue, magenta, cyan, white, black
# B (bold), K(background color), F(foreground color)

function doprompt {
# this is just the directory (%d could be %~ -- I prefer full path always)
PROMPT='%F{yellow}${${(%):-%d}//\//%F{magenta\}%B/%b%F{yellow\}}%f'
}

function chpwd() {
    doprompt
}

차이점은 색상 경로를 사용한다는 것이므로 슬래시가 색상이 지정되면 경로의 원래 색상으로 돌아 가야합니다. 필자의 경우 경로는 일반적으로 노란색이며 슬래시는 자홍색으로 표시되며 노란색으로 돌아갑니다. 또한 % F % f 시퀀스를 사용하는 것이 훨씬 읽기 쉽습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.