zsh는 프롬프트에서 기능을 다시 로드하지 않습니다.

zsh는 프롬프트에서 기능을 다시 로드하지 않습니다.

새 프롬프트가 로드될 때마다 함수를 다시 로드하도록 zsh 프롬프트를 얻으려고 합니다. 함수 출력의 버전이지만 pwd출력이 함수가 출력하는 것과 pwd같을 경우 더 짧습니다 . 함수는 작동하지만 디렉토리를 변경하면 다시 로드되지 않습니다. 이는 함수가 아닌 zsh의 문제입니다. 함수는 ksh 및 csh에서 잘 작동하기 때문입니다. 저는 oh-my-zsh를 사용하지 않습니다. 기능은 , 파일은 .~/Downloads/Folder~/D/Folder_collapsed_pwd$SHELLDIR/cpwdrc

이건 내 .zshrc파일이야

export SHELLDIR="$XDG_CONFIG_HOME/shells"
export ZSH="$SHELLDIR/zsh"
export HISTFILE="$XDG_DATA_HOME"/zsh/history

autoload -U +X compinit && compinit
fpath=($ZSH/plugins/zsh-completions/src $fpath)
compinit -d $XDG_CACHE_HOME/zsh/zcompdump-artix-5.8

source $SHELLDIR/aliasrc
source $SHELLDIR/colorsrc # contians color substituions

source $SHELLDIR/cpwdrc # contains _collapsed_pwd

source $ZSH/plugins/fzf-tab/fzf-tab.zsh
source $ZSH/plugins/zsh-autosuggestions/zsh-autosuggestions.zsh

setopt prompt_subst

PS1=$(printf "${BOLD}${BLUE}%s${NORM}@%s:[${BLUE}%s${NORM}]:$ " $USER $(hostname) $(_collapsed_pwd) )

이것은 함수에 대한 코드입니다_collapsed_pwd

#!/bin/sh
## Collapsed Directory
_collapsed_pwd() {
  pwd | perl -pe '
   BEGIN {
      binmode STDIN,  ":encoding(UTF-8)";
      binmode STDOUT, ":encoding(UTF-8)";
   }; s|^$ENV{HOME}|~|g; s|/([^/.])[^/]*(?=/)|/$1|g; s|/\.([^/])[^/]*(?=/)|/.$1|g
'
}

답변1

.zshrc처리 중 프롬프트의 내용은 한 번만 적용됩니다. 코드에는 현재 디렉터리가 변경될 때 프롬프트가 어떻게 변경되는지 나타내는 내용이 없습니다.

한 가지 해결책은 프롬프트를 변경하는 코드를chpwd. setopt prompt_subst콘텐츠에 대한 평가를 수행하지 않으므로 제거하세요 PS1.

function set_prompt {
  PS1=$(printf "${BOLD}${BLUE}%s${NORM}@%s:[${BLUE}%s${NORM}]:$ " $USER $(hostname) "${$(_collapsed_pwd)//\%/%%}" )
}
chpwd_functions+=(set_prompt)
cd .

설명하다:

  • cd .chpwd초기 설정 프롬프트를 허용하기 위해 zsh가 시작될 때 후크가 한 번 트리거됩니다 .
  • 출력에 공백이 포함된 경우 명령 대체를 큰따옴표로 묶어 별도의 단어로 분할되는 것을 방지합니다.
  • ${…//\%/%%}다음과 같이 해석되므로 변경된 출력을 다음으로 바꾸십시오._collapsed_pwd%%%%빨리 탈출해라1.

또는 설정해 주세요.prompt_subst옵션PS1프롬프트가 표시될 때마다 평가될 코드가 포함된 문자열로 설정됩니다 .

setopt prompt_subst
PS1='$(printf "${BOLD}${BLUE}%s${NORM}@%s:[${BLUE}%s${NORM}]:$ " $USER $(hostname) "${$(_collapsed_pwd)//\%/%%}" )'

zsh를 사용하여 이 프로세스를 단순화할 수 있습니다프롬프트에 변수 데이터를 포함하는 내장 기능. 먼저, 현재 디렉터리의 마지막 두 구성 요소를 보여주는 힌트는 다음과 같습니다.

unsetopt prompt_subst
PS1='%B%F{blue}%n%f%b@%m:[%F{blue}%2~%f]:%(!.#.$) '

디렉토리 구성요소를 축약 하려면 후크 chpwd나 .prompt_substchpwdpsvar%vpsvar프롬프트 문자열에서 인용되었습니다.

unsetopt prompt_subst
PS1='%B%F{blue}%n%f%b@%m:[%F{blue}%1v%f]:%(!.#.$) '
function abbreviate_pwd {
  psvar[1]=${(%):-%~}
  while [[ $psvar[1] =~ /[^/][^/]+/ ]]; do
    psvar[1]=${psvar[1][1,MBEGIN+1]}${psvar[1][MEND,-1]}
  done
}
chpwd_functions+=(abbreviate_pwd)
cd .

1 추가 견고성을 위해 ( autoset $USER참조 ) 및 ( autoset 참조 )도 보호해야 하지만 호스트 이름에 발생 문자를 포함 하도록 값을 변경하지 않는다고 가정하면 일반적으로 문제가 있는 문자를 포함하지 않습니다 .$USERNAMEzsh$(hostname)$HOSTzshIFS

관련 정보