これはちょっとひどいかもしれませんが、最近私はzshに移動して、シェルプロンプトのカスタマイズに問題があります。私の.zshrcのzshは私のシェルプロンプトを再計算していません
パートは次のようになります。私は、端末を起動すると
# 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]%}%[email protected]%m %{$fg[blue]%}%c %{$fg[yellow]%}%{$(parse_special)%} %{$reset_color%}%# "
は、すべてがよさそうです。
[email protected] ~ Wed Aug 8 22:56:22 PDT 2012 %
しかし、私別のディレクトリにcdし、(日付が変更されていません注意してください)私のカスタムプロンプトを再計算するために私parse_special機能が再び呼び出されていない表示されたら:私のプロンプトは、私が期待するものである
[email protected] ~ Wed Aug 8 22:56:22 PDT 2012 % cd .ssh
[email protected] .ssh Wed Aug 8 22:56:22 PDT 2012 % cd ../workspace
[email protected] workspace Wed Aug 8 22:56:22 PDT 2012 %
zshに表示されるたびにプロンプトを再計算する方法はありますか?
ありがとうございます。
PS1は、単一引用符で囲まれた値によって設定された取得する好きではないように思え
をcjhvealに返信します。
local tp1="%{$fg[green]%}%[email protected]%m%{$reset_color%}"
PS1="${tp1}"
print "PS1 set by tp1: ${PS1}"
local tp2='%{$fg[green]%}%[email protected]%m%{$reset_color%}'
PS1="${tp2}"
print "PS1 set by tp2: ${PS1}"
そして、私もここで私が試した、文字通り何で、cjhvealの提案に基づいて、追加する必要があります。この出力
#inner stuff was green
PS1 set by tp1: %{%}%[email protected]%m%{%}
#everything was uncolored
PS1 set by tp2: %{$fg[green]%}%[email protected]%m%{$reset_color%}
を得た:私は、次のことを試してみました。ここでも、単一引用符はzsh
で私のプロンプトをカスタマイズしながら、私は同じ問題に遭遇した
function parse_special {
print $(date)
}
autoload -U colors && colors
local prompt_user='%{$fg[green]%}%[email protected]%m%{$reset_color%}'
local prompt_root='%{$fg[red]%}%[email protected]%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}%# "
応答に感謝します。私はこれが正しい解決策だと思っていますが、私はまだ間違ったことをしていなければなりません(私の元の投稿に行った編集を見てください)。ここでは一重引用符を使用できないようです。 返信に一重引用符を使用することが重要な理由についても説明できますか? var = "$(do_stuff)"はvar = '$(do_stuff)'とは異なる扱いですか? –
サブシェルを囲む%{%}を削除してみてください。なぜか分からないけど、それがなければ私のために働く。 一重引用符と二重引用符の違いは、シェルがどのように補間を実行するかにあります。 var = "$(do_stuff)"はすぐにサブシェルを実行し、その結果を一度補間します。単一引用符を使用すると、そのサブシェルは解釈されず、二重引用符で囲まれた文字列に補間されるまでリテラル定数のままになります。それが実行されます。基本的に、プロンプトがリフレッシュされてサブシェルを実行するまで待機します。 – cjhveal
@cjhveal '%{' '%}'は、zshがゼロ幅であると考えるべきテキストを囲みます(通常は、端末が色を変えるような次のテキストで何かをするように指示します)。長さがゼロでないテキストを囲むと、まだ表示されますが、いくつかのバグがあります(たとえば、zshが完了したら端末にカーソルをある位置に置いてテキストを置くなど)。% non-zero-width-text%} 'はこの位置を間違ったものにし、プロンプトを上書きし、プロンプトカラーで色付けされたテキストを取得します)。 – ZyX