Gravar aviso durante a digitação no prompt zsh

3

Eu sei que é possível exibir o texto "outside" do prompt do zsh onde você está digitando. Um exemplo comum são as conclusões:

myhost Wed 8 10:06 ~/sandlot 
$ e .py█

Pressione a tecla Tab , e voilá:

myhost Wed 8 10:06 ~/sandlot 
$ e .py█
 -- file --
lenum.py           lexample.py        otherticks.py

O que me interessa é o texto de --file-- abaixo. Existe algum tipo de "zsh_echo_below_zle" ou algo assim. Não me importo com teclado ou atalhos, já que minha intenção é executar e usar a saída em zle. S.a.

myhost Wed 8 10:06 ~/sandlot 
$ some_command $(some_command_with_warning)█

Pressione a tecla Tab e

myhost Wed 8 10:06 ~/sandlot 
$ some_command some_output█
 -- warning: some_output is about yadda yadda yadada --
    
por Felipe Lema 08.06.2016 / 16:17

1 resposta

2

Dentro do sistema de completação do ZSH, uma mensagem customizada no mash da aba para um argumento particular de um comando é possível através da função _message , como mostrado neste script de conclusão ( _foo ) para um comando específico ( foo ):

#compdef foo

local curcontext="$curcontext" state

_arguments -C -s \
  '1: :->dofoo' \
  && return 0

case "$state" in
  dofoo)
    _message -r " -- warning: lp0 on fire"
    _values "parameters" $(_call_program getparam echo aaa bbb)
  ;;
esac

Por exemplo,

% ls $fpath[*]/_foo 2>/dev/null
/Users/jdoe/.zsh/functions/_foo
% rm ~/.zcompdump && exec zsh
% function foo () { echo "$@" }
% foo █
 -- warning: lp0 on fire
aaa  bbb          

(Ao modificar $fpath para incluir um diretório personalizado, sempre faça isso antes dos comandos autoload -U compinit && compinit .)

No entanto, dada uma linha de comando de echo $(foo bar)█ , a conclusão _foo não é envolvida quando a tab é triturada, já que esta é uma substituição de comando e < em> not uma autocompletação de foo .

Durante a substituição do comando, o comando que está sendo substituído não tem indicação se está sendo executado diretamente ou como uma substituição de comando (existe uma variável ZSH_EVAL_CONTEXT especial que exporta e indica apenas toplevel ) e escrever no terminal e restaurar a posição do cursor será complicado:

% cat awkward 
#!/bin/zsh
echo -ne "\e7\n -- warning: lp0 on fire\e[F\e8" >/dev/tty; echo blat
% ./awkward 
blat
% echo $(./awkward)

... embora isso não seja perfeito, como se o aviso estivesse na parte inferior da tela, acontecem coisas horríveis de bugs:

% echo -ne "\e[$LINES;0H"
...
% ./awkward 

blatwarning: lp0 on fire
% echo $(./awkward )
 -- warblat         fire

Um programa mais complicado precisaria lidar adequadamente com o fato de estar na parte inferior do terminal ou mesmo usar ncurses para portabilidade, e precisará indicar de alguma forma zsh que qualquer linha (s) customizada (s) escrita (pode ) precisam ser apagados para que a exibição não corra o risco de ser descartada com a saída de um comando subseqüente. Mas isso é mais trabalho.

O código zsh em Src/exec.c não parece ter algo de especial para um trabalho cmdsubst , e a função preexec hook não é chamada para substituição de comando. Então, eu realmente não estou vendo nada simples para mensagens sob o terminal sob o prompt durante a execução de uma substituição de comando em zsh .

    
por 08.06.2016 / 17:26

Tags