Eu acho que isso não é tão direto quanto se poderia pensar. Você tem que interceptar STDOUT, como programas externos escrevem diretamente para esse canal.
O seguinte é uma espécie de prova de conceito . Esteja ciente de que isso quebrará muitas coisas, como programas interativos como man
, less
etc. Portanto, não é utilizável para uso diário, mas para formatar facilmente uma sessão de shell para uma postagem em, por exemplo, SU.
Essa abordagem foi postada por Atom Smasher na lista de discussão zsh-users
em Sáb, 16 de maio de 2009 para colorir STDERR
. Adotei as suas necessidades:
# ## indent_output.zsh ##
zmodload zsh/terminfo zsh/system
autoload is-at-least
indent_output() {
while sysread line
do
testline=${line//$'\n'/$'\n' }
syswrite " ${testline}"
done
}
precmd() { sleep 0 }
## i'm not sure exactly how far back it's safe to go with this
## 4.3.4 works; 4.2.1 hangs.
is-at-least 4.3.4 && exec > >(indent_output)
A parte complicada é exec > >(indent_output)
, que processa a saída completa do shell de substituição através da função indent_output
. A definição precmd
é necessária para evitar uma condição de corrida, caso contrário, o novo prompt será impresso antes da saída real do comando executado.
Aqui está uma demonstração:
% source indent_output.zsh
% ls /bin | head
[.exe
2to3
2to3-3.2
411toppm.exe
7z
7za
7zr
a2p.exe
aaflip.exe
aclocal
%
% date
Sat, Nov 08, 2014 5:58:29 PM
%
% cat /usr/share/doc/foo
cat : /usr/share/doc/foo : No such file or directory
%
% cat /usr/share/doc/zsh-5.0.6/INSTALL| head
++++++++++++++
INSTALLING ZSH
++++++++++++++
This file is divided into two parts: making and installing the shell, a
note on the script run to set up the environment for new users, and
a description of various additional configuration options. You should
have a look at the items in the second and third parts before following the
instructions in the first.
%
%
Você pode se livrar do sinal %
antes de cada aviso (o que indica que a última linha não termina com CR
) com estas duas opções:
setopt PROMPT_CR NO_PROMPT_SP