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処理中のプロンプトの内容は一度だけ適用されます。コードには、現在のディレクトリが変更されたときにプロンプ​​トがどのように変更されるかを示す内容はありません。

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]:%(!.#.$) '

ディレクトリコンポーネントを短縮するには、フックまたはchpwdprompt_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

関連情報