Expansion in zsh prompt

2

Estou lutando com o prompt do zsh, tentando converter meu prompt bash para hooks zsh.

Este código deve exibir o ticket do kerberos atual e atualizar de acordo, mas as cores não funcionam, nem a atualização:

# initialize advanced prompt
autoload -U promptinit && promptinit
# allow functions in prompt
setopt prompt_subst

#initialize colors
autoload -U colors && colors

# add the add-zsh-hook command
autoload add-zsh-hook

# Configure History
setopt hist_ignore_all_dups
setopt inc_append_history
export HISTIGNORE="history"

source $HOME/.zsh/prompt_krb.zsh

update_krb_env() {
if [ "'which klist 2>/dev/null'" != "" ]; then

    # got kerberos support installed
    ticket='klist 2>/dev/null | grep "Principal:" | sed 's/.*Principal:\ //'';

    klist -s
    if [ $? -eq 0 ]; then
        __KRB_PROMPT="%{$fg_no_bold['green']%}krb id \"$ticket\"";
    else
        if [ "$ticket" != "" ]; then
            __KRB_PROMPT="%{$fg_no_bold['orange']%}expired krb id \"$ticket\"";
        else
            __KRB_PROMPT="%{$fg_no_bold['yellow']%}no krb id";
        fi
    fi
else
    __KRB_PROMPT="%{$fg_no_bold['yellow']%}no krb id";
fi

_KRB_PROMPT="${__KRB_PROMPT}%{$reset_color%}";
}

krb_hook_preexec() {
    case "$2" in
        kinit*|kdestroy*)
            __EXECUTED_KRB_CMD=1;
        ;;
    esac
}

krb_hook_postexec() {
    if [ -n "$__EXECUTED_KRB_CMD" ]; then
        update_krb_env;
        unset __EXECUTED_KRB_CMD;
    fi
}

add-zsh-hook preexec krb_hook_preexec
add-zsh-hook precmd krb_hook_postexec
update_krb_env;

get_krb() {
    echo -n $__KRB_PROMPT;
}

PROMPT="$(get_krb) >"

Eu tenho procurado em vários tutoriais, tentando desenvolver o código, mas pareço estar faltando alguma coisa.

    
por Let_Me_Be 09.03.2014 / 17:19

1 resposta

4

Substituições de comandos e variáveis são expandidas entre aspas duplas, então em

PROMPT="$(get_krb) >"

O $(get_krb) é expandido no momento da atribuição, enquanto você deseja que ele seja expandido em cada prompt por meio de prompt_subst . Então:

PROMPT='$(get_krb) >'
    
por 09.03.2014 / 18:00