Zsh: 프롬프트에서 해시 디렉터리 이름 확장

Zsh: 프롬프트에서 해시 디렉터리 이름 확장

bash에서 zsh로, 특히 해시 함수로 마이그레이션하려고 합니다.

hash -d Do=~/Downloads

cd Do즉, 해당 디렉토리로 즉시 입력하고 이동할 수 있습니다 . 좋아요 그러나 프롬프트에서 제공된 디렉토리는 내가 예상했던 디렉토리 ~Do가 아닙니다. 프롬프트가 전체 디렉터리 이름( 사용자 디렉터리의 ~/Downloads초기 if 포함)으로 확장되도록 디렉터리 해시를 사용할 수 있는 방법이 있습니까 ?~

답변1

이것빨리 탈출해라 %~가능할 때마다 해시된 디렉터리를 사용하여 현재 디렉터리를 축약합니다. 디렉토리 약어 사용을 중지하려면 %/대신 사용할 수 있지만 홈 디렉토리도 축약되지는 않습니다.

홈 디렉토리만 축약하려면 다음을 설정하십시오.prompt_subst옵션(프롬프트에 추가 백슬래시를 추가해야 할 수도 있음) 또는 대신 수동 확장을 사용하세요 %~.%/$PWD

setopt prompt_subst
PS1='%B${${PWD/#%$HOME%/\~\/}/#$HOME/\~}\$%b '

더 복잡한 대체를 수행하려면 다음에서 수행할 수 있습니다.chpwd연결하여 프롬프트에서 사용하세요. 위에 표시된 간단한 경우에도 이 접근 방식은 더 장황하지만 아마도 더 읽기 쉽습니다.

setopt prompt_subst
chpwd () {
  case $PWD in
    $HOME/*) prompt_PWD=\~/${PWD#$HOME};;
    $HOME) prompt_PWD=\~;;
    *) prompt_PWD=$PWD;;
  esac
}
PS1='%B$prompt_PWD\$%b '

특정 해시 디렉터리만 확장하는 하이브리드 접근 방식을 선호할 수도 있습니다. 이는 chpwd메서드(또는 직접 메서드에도 삽입하기 쉽지만 가독성이 떨어짐) 에 삽입하기 쉽습니다 . 예를 들어, 다음 명령은 (아마도 다른 사용자의 홈 디렉토리)로 시작하고 자신의 홈 디렉토리 아래에 있지 않은 chpwd디렉토리만 축약합니다 ./home

chpwd () {
  case $PWD in
    $HOME/*) prompt_PWD=\~/${PWD#$HOME};;
    $HOME) prompt_PWD=\~;;
    /home/*) prompt_PWD=${(%)${:-%~}};;
    *) prompt_PWD=$PWD;;
  esac
}

답변2

/디렉토리 이름에 꼬리를 추가하면 원하는 효과를 얻을 수 있습니다.

관련 정보