17

これは少しフリンジかもしれませんが、最近zshに移動し、シェルプロンプトのカスタマイズに問題があります。

私の.zshrcの一部は次のようになります。

# keeping this simple right now by just printing the date, but imagine this function would look for something specific when moving to a new directory each time
function parse_special {
    print $(date)
}

autoload -U colors && colors
PS1="%{$fg[green]%}%n@%m %{$fg[blue]%}%c %{$fg[yellow]%}%{$(parse_special)%} %{$reset_color%}%# "

ターミナルを起動すると、すべてが良さそうです。私のプロンプトは私が期待するものです:

me@someHost ~ Wed Aug 8 22:56:22 PDT 2012 %

しかし、別のディレクトリにcdすると、カスタムプロンプトを再計算するためにparse_special関数が再度呼び出されないように見えます(日付が変更されていないことに注意してください)。

me@someHost ~ Wed Aug 8 22:56:22 PDT 2012 % cd .ssh 
me@someHost .ssh Wed Aug 8 22:56:22 PDT 2012 % cd ../workspace 
me@someHost workspace Wed Aug 8 22:56:22 PDT 2012 % 

プロンプトが表示されるたびにプロンプ​​トを再計算するようにzshに指示する方法はありますか?

提案をありがとうございました。


cjhvealに返信する

PS1は一重引用符で囲まれた値で設定されるのを好まないようです。私は次のことを試しました:

local tp1="%{$fg[green]%}%n@%m%{$reset_color%}"
PS1="${tp1}"
print "PS1 set by tp1: ${PS1}"
local tp2='%{$fg[green]%}%n@%m%{$reset_color%}'
PS1="${tp2}"
print "PS1 set by tp2: ${PS1}"

そして、この出力を取得しました

#inner stuff was green
PS1 set by tp1: %{%}%n@%m%{%}
#everything was uncolored
PS1 set by tp2: %{$fg[green]%}%n@%m%{$reset_color%}

また、cjhvealの提案に基づいて、文字通り試したことを追加する必要があります。繰り返しますが、一重引用符は物事を台無しにしているようです

function parse_special {    
    print $(date)
}

autoload -U colors && colors
local prompt_user='%{$fg[green]%}%n@%m%{$reset_color%}'
local prompt_root='%{$fg[red]%}%n@%m%{$reset_color%}'
local prompt_dir='%{$fg[blue]%}%c%{$reset_color%}'
local prompt_special='%{$fg[yellow]%}%{$(parse_special)%}%{$reset_color%}'
PS1="${prompt_user} ${prompt_dir}${prompt_special}%# "
4

2 に答える 2

23

でプロンプトをカスタマイズしているときに、同じ問題に遭遇しましたzsh

これは、プロンプトが初期化されるときに、シェルが値を文字列に一度補間するために発生すると思います。後続のリロードでは、サブシェル補間ではなく、プロンプトに定数文字列が含まれます。

代わりに、サブシェルを含むすべての行を、一重引用符で定義された変数に入れます。次に、代わりにその変数を補間します。

autoload -U colors && colors

local parse_special='%{$fg[yellow]%}$(date)%{$reset_color%}'

PS1="%{$fg[green]%}%n@%m %{$fg[blue]%}%c ${parse_special} %# "

更新: ZyX の回答からこれを追加して、これに対する完全なソリューションを作成します。これも追加する必要があります:

setopt promptsubst

実際、プロンプトの各部分を、それぞれに reset_color を含めて、このような変数に抽出することをお勧めします。これにより、実装を変更せずにプロンプ​​ト コンポーネントの順序を変更できます。

于 2012-08-09T06:28:53.897 に答える
10

あなたはこの問題を解決するための半分の道のりです:

PS1='$(date)'

プロンプトが表示されます$(date)が、

PS1='$(date)'
setopt promptsubst

プロンプトが表示されます(もちろんとにThu Aug 9 21:01:53 MSK 2012依存します)。$LANG$LC_TIME

ちなみに、もう使用する必要のない最新の zsh には、フォアグラウンド用、バックグラウンド用、リセット用、その他いくつかの%{$fg[blue]%}nos があります。セクション を参照してください。%F{blue}%K{blue}%f%kman zshmiscEXPANSION OF PROMPT SEQUENCES

于 2012-08-09T17:08:09.497 に答える