ZSH: altera o prompt pouco antes do comando ser executado

4

Eu gostaria de ter um prompt de duas linhas em zsh , mas reduzi-lo para um muito pequeno logo após pressionar ENTER , para que ele não apareça no histórico de rolagem do terminal. Depois de digitar dois comandos, o terminal deve ficar assim enquanto digita o terceiro:

> echo Command 1
Command 1
> echo Command 2
Command 2
+------------ Long prompt ----------+
'> echo typing a new command here…

Eu tentei obter algo com o preexec hook e zle reset prompt , mas recebo o erro widgets can only be called when ZLE is active :

$ autoload -U add-zsh-hook
$ hook_function() { OLD_PROMPT="$PROMPT"; export PROMPT="> "; zle reset-prompt; export PROMPT="$OLD_PROMPT"; }
$ PROMPT=$'+------------ Long prompt ----------+\n\'> '
+------------ Long prompt ----------+
'> add-zsh-hook preexec hook_function
+------------ Long prompt ----------+
'> echo Test
hook_function:zle: widgets can only be called when ZLE is active
Test
+------------ Long prompt ----------+
'> 
    
por Georges Dupéron 18.01.2016 / 14:32

1 resposta

4

Quando a função preexec é chamada, zle já está concluído e, portanto, os widgets zle não podem mais ser usados.

Portanto, você deve interceptar a pressão da tecla ENTER antes que zle termine. Por padrão, ENTER está vinculado a accept-line , mas isso pode depender de outros truques que você já usa;

$ bindkey | grep '\^M'
"^M" accept-line

Agora, escrevemos um novo widget que queremos vincular a ENTER :

del-prompt-accept-line() {
    OLD_PROMPT="$PROMPT"
    PROMPT="> "
    zle reset-prompt
    PROMPT="$OLD_PROMPT"
    zle accept-line
}

A lógica é retirada da sua abordagem. Na última linha, chamamos o widget accept-line ou qualquer outra coisa que foi executada ao pressionar ENTER .

Por fim, apresentamos o novo widget para zle e vinculamos a ENTER :

zle -N del-prompt-accept-line
bindkey "^M" del-prompt-accept-line

Et voilà:

> echo foo bar
foo bar
+------------ Long prompt ----------+
'> echo this is my new command... not pressed ENTER, yet!
    
por 20.01.2016 / 20:50

Tags