새 프롬프트가 로드될 때마다 함수를 다시 로드하도록 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_subst
chpwd
psvar
%v
psvar
프롬프트 문자열에서 인용되었습니다.
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 참조 )도 보호해야 하지만 호스트 이름에 발생 문자를 포함 하도록 값을 변경하지 않는다고 가정하면 일반적으로 문제가 있는 문자를 포함하지 않습니다 .$USERNAME
zsh
$(hostname)
$HOST
zsh
IFS