新しいプロンプトがロードされるたびに関数を再ロードするように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
処理中のプロンプトの内容は一度だけ適用されます。コードには、現在のディレクトリが変更されたときにプロンプトがどのように変更されるかを示す内容はありません。
1つの解決策はプロンプトを変更するコードです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が起動すると、フックが1回トリガーされます。- 出力にスペースが含まれている場合は、コマンド置換を二重引用符で囲み、別の単語に分割するのを防ぎます。
${…//\%/%%}
次のように解釈されるので、変更された出力を次に置き換えます。_collapsed_pwd
%
%%
%
早く脱出1.
または設定してください。prompt_subst
オプションPS1
プロンプトが表示されるたびに、評価されるコードを含む文字列に設定されます。
setopt prompt_subst
PS1='$(printf "${BOLD}${BLUE}%s${NORM}@%s:[${BLUE}%s${NORM}]:$ " $USER $(hostname) "${$(_collapsed_pwd)//\%/%%}" )'
zshを使用してこのプロセスを簡素化できますプロンプトに変数データを含む組み込み機能。まず、現在のディレクトリの最後の2つのコンポーネントを示すヒントは次のとおりです。
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