2012-08-09 7 views
12

これはちょっとひどいかもしれませんが、最近私は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}%# " 

答えて

14

物事をめちゃくちゃしているようです。

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

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

autoload -U colors && colors 

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

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

更新:これを完全な解決策にするためにZyXの答えからこれを追加してください。また、これを追加する必要があります。

setopt promptsubst 

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

+0

応答に感謝します。私はこれが正しい解決策だと思っていますが、私はまだ間違ったことをしていなければなりません(私の元の投稿に行った編集を見てください)。ここでは一重引用符を使用できないようです。 返信に一重引用符を使用することが重要な理由についても説明できますか? var = "$(do_stuff)"はvar = '$(do_stuff)'とは異なる扱いですか? –

+0

サブシェルを囲む%{%}を削除してみてください。なぜか分からないけど、それがなければ私のために働く。 一重引用符と二重引用符の違いは、シェルがどのように補間を実行するかにあります。 var = "$(do_stuff)"はすぐにサブシェルを実行し、その結果を一度補間します。単一引用符を使用すると、そのサブシェルは解釈されず、二重引用符で囲まれた文字列に補間されるまでリテラル定数のままになります。それが実行されます。基本的に、プロンプトがリフレッシュされてサブシェルを実行するまで待機します。 – cjhveal

+1

@cjhveal '%{' '%}'は、zshがゼロ幅であると考えるべきテキストを囲みます(通常は、端末が色を変えるような次のテキストで何かをするように指示します)。長さがゼロでないテキストを囲むと、まだ表示されますが、いくつかのバグがあります(たとえば、zshが完了したら端末にカーソルをある位置に置いてテキストを置くなど)。% non-zero-width-text%} 'はこの位置を間違ったものにし、プロンプトを上書きし、プロンプトカラーで色付けされたテキストを取得します)。 – ZyX

7

あなたがこの問題を解決するための半分以下のとおりです。

PS1='$(date)' 

はあなたのプロンプト$(date)が表示されますが、

PS1='$(date)' 
setopt promptsubst 

は(もちろん、$LANG$LC_TIMEによって異なります)あなたにプロンプ​​トThu Aug 9 21:01:53 MSK 2012が表示されます。ところで

は、あなたはもう%{$fg[blue]%}を使用する必要はありません最新のzshで、彼らといくつか他の人をリセットするためのフォアグラウンド用%F{blue}、背景用%K{blue}%f%k NOSがあり、man zshmiscを参照してください、セクションEXPANSION OF PROMPT SEQUENCES

+0

ああ、ええ、私は行方不明だったsetopt promptsubstを設定します。どうもありがとう。上記の答えを編集して、その行を追加して、これらの2つのうちの完全な答えを出します。再度、感謝します。 –

関連する問題