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
.