Подтвердить что ты не робот

Zsh не переустанавливает приглашение моей оболочки

Это может быть немного, но я недавно перешел в 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]%}%[email protected]%m %{$fg[blue]%}%c %{$fg[yellow]%}%{$(parse_special)%} %{$reset_color%}%# "

Когда я запускаю терминал, все выглядит хорошо; моя подсказка - вот что я ожидаю:

[email protected] ~ Wed Aug 8 22:56:22 PDT 2012 %

Но когда я подключился к другому каталогу, кажется, что моя функция 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, чтобы пересчитать приглашение каждый раз, когда он собирается его показать?

Большое спасибо за любые предложения.


ответ на cjhveal

Кажется, что PS1 не любит получать одиночные кавычки. Я попробовал следующее:

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}"

И получил этот вывод

#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%}

Я также должен добавить, исходя из предложения cjhveal, вот что я буквально пробовал. Опять же, одинарные кавычки кажутся беспорядочными.

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}%# "
4b9b3361

Ответ 1

Я столкнулся с той же проблемой при настройке моей подсказки в zsh.

Я считаю, что это происходит потому, что оболочка интерполирует значение в строку один раз, когда приглашение инициализируется. Последующие перезагрузки имеют постоянную строку в приглашении, а не интерполяцию подоболочки.

Вместо этого поместите любые строки, которые включают подоболочки, в переменную, определенную одинарными кавычками. Затем интерполируйте эту переменную.

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 для каждого. Это позволяет изменять порядок компонентов запроса без изменения их реализации.

Ответ 2

Вы на полпути к решению этой проблемы:

PS1='$(date)'

покажет вам приглашение $(date), но

PS1='$(date)'
setopt promptsubst

покажет вам приглашение Thu Aug 9 21:01:53 MSK 2012 (в зависимости от $LANG и $LC_TIME, конечно).

Кстати, в новейшей zsh вам больше не нужно использовать %{$fg[blue]%}, для фона, n %F{blue} для фона, %K{blue} для фона, %f%k для их сброса и нескольких других, см. man zshmisc, раздел EXPANSION OF PROMPT SEQUENCES.