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}%# "
Ответы
Ответ 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
.