Я думаю, что это не так просто, как можно подумать. Вы должны перехватить STDOUT, так как внешние программы напрямую пишут в этот канал.
Следующее является своего рода доказательством концепции . Имейте в виду, что это сломает многие вещи, а именно интерактивные программы, такие как man
, less
и т.д. Так что это не пригодно для повседневного использования, но легко форматирует сеанс оболочки для сообщения, например, SU.
Этот подход был опубликован Atom Smasher в zsh-users
в субботу 16 мая 2009 года для раскрашивания STDERR
. Я принял это к вашим требованиям:
# ## 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)
Сложная часть - exec > >(indent_output)
которая обрабатывает весь вывод замещающей оболочки через функцию indent_output
. Определение precmd
необходимо, чтобы избежать условия гонки, в противном случае новое приглашение выводится перед фактическим выводом выполненной команды.
Вот демо:
% 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.
%
%
Вы можете избавиться от знака %
перед каждым приглашением (которое означает, что последняя строка не заканчивается CR
) с помощью этих двух параметров:
setopt PROMPT_CR NO_PROMPT_SP