como posso definir o tempo de renderização do prompt no zsh?

4

versão curta: Como posso fazer o perfil de cada renderização de um prompt zsh?

versão longa: Recentemente, deparei com um plugin (rupa / z) que, quando instalado, atingiu meu tempo de renderização do prompt zsh em uma quantidade notável. Eu quero medir quanto impacto esse plugin infligiu, quando carregado, no tempo de renderização do meu prompt zsh.

Quando eu digo o tempo de renderização do prompt, não estou me referindo à quantidade de tempo que leva para o primeiro prompt zsh aparecer quando eu emito, por exemplo, exec zsh (isso é obtido emitindo time zsh -i -c "print -n" ) .

Estou falando sobre o tempo que o zsh leva para me fornecer outro prompt quando estiver totalmente carregado. Em outras palavras, quero conseguir isso:

~ $ ls (when i hit enter, start counting)
code/ notes/ file.txt
~ $ (stop counting when this prompt appears. show me elapsed time)

isso pode ser feito?

    
por ninrod 13.07.2016 / 16:21

1 resposta

4

Atualização: Use zle-line-init (Agradecimentos a Gilles pela dica)

Não é exatamente o perfil, mas a partir do texto em sua pergunta parece que você está interessado principalmente em medir quanto atraso o plug-in implica.

Uma maneira de obter essa estimativa é utilizando o precmd hook, que é executado sempre que anterior o prompt é renderizado, e o widget zle-line-init , que é executado toda vez que o prompt o editor de linha é iniciado.

O seguinte deve fazer o truque. Basta adicioná-lo ao seu ~/.zshrc .

# set type of SECONDS and start to float to increase precision
typeset -F SECONDS start 

# define precmd hook function
precmd () {
    # save time since start of zsh in start
    start=$SECONDS
}

# define zle-line-init function
zle-line-init () {
     # print time since start was set after prompt
     PREDISPLAY="[$(( $SECONDS - $start ))] "
}
# link the zle-line-init widget to the function of the same name
zle -N zle-line-init

Com isso, o tempo decorrido para cada prompt será escrito entre colchetes após o prompt, assim:

 prompt% [0.00013200000000779255] 

Observação: se a função precmd ou zle-line-init já estiver definida, você precisará adicionar os respectivos corpos de função às definições existentes. Para precmd , você precisa colocá-lo no início e para zle-line-init no final, já que o conteúdo existente de ambos pode influenciar o tempo necessário para processar o prompt (ou o que parece ser o prompt ).

  • Para descobrir se precmd já está definido, execute whence -c precmd .
  • Para zle-line-init run zle -lL zle-line-init . Se já estiver definido, imprimirá uma linha como

    zle -N zle-line-init _zsh_highlight_widget_zle-line-init
    

    em que a última palavra é o nome da função vinculada (não é necessário ter o mesmo nome).

por 13.07.2016 / 23:44

Tags