我正在尝试使zsh提示每次加载新提示时都重新加载一个函数。该函数输出一个版本的pwd
但较短,如果输出pwd
是~/Downloads/Folder
该函数将输出~/D/Folder
。如果我更改目录,该功能有效,但不会重新加载。这是zsh的问题,而不是函数的问题,因为该函数在ksh和csh中可以正常工作。我不使用oh-my-zsh。函数是_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
'
}
您一劳永逸地设置提示的内容.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
变化%
到%%
因为%
将被解释为一个提示逃逸¹。或者,请设置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
钩子或通过运行一些zsh代码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 .
¹对于额外的稳健性,$USER
(另见$USERNAME
通过自动设置zsh
)和$(hostname)
(参见$HOST
自动设置zsh
),也应受到保护,但它们通常不包含任何有问题的字符,假设你不改变的价值IFS
,包括主机名中出现的字符。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句