Подсветка потока ошибок в zsh


ramok аватар

ramok - Posted on 23 Март 2008

Часто сообщения об ошибках теряются в общем потоке вывода данных, и их хотелось бы как нибуть выделять. Тут опять пригодятся глобальные алиасы zsh.

Добавим в ~/.zshrc

autoload colors # подключим цвета
colors
 
alias -g  HE='2>>( sed -ue "s/.*/$fg_bold[red]&$reset_color/" 1>&2 )' # Highlight Errors

После перезагрузки zsh у нас появится глобальный алиас HE который можно использовать на ряду с другими фильтрами. Алиас запускает в фоне sed который подсвечивает строки, и перенаправляет ему в на выход стандартный поток ошибок

Пример работы: мы хотим найти в /etc все файлы в названии которых есть zsh и при этом подсветить в каких каталогах поиск не удался.

Пояснения: строка

$ find /etc HE GI zsh

Развернется в

find /etc 2>>( sed -ue "s/.*/$fg_bold[red]&$reset_color/" 1>&2 ) | grep -i zsh

Глобальный алиас GI описан здесь.
Подсведка результатов grep описана здесь

BUGS: алиас запускает асинхронный процесс подсведки цветов, что обозначает что подсвеченые ошибки могут выводится не синхронно с потоком стандартного вывода.

PS
Для пользователей bash существует полезный скрипт по подсвечиванию потока ошибок для программы переденной как параметр.

ВложениеРазмер
zsh-highlight-error-and-grep-match.png6.13 кб
5
Ваша оценка: Ничего Рейтинг: 5 (1 vote)

Здравствуйте, хочу пересесть на zsh. Не могли бы вы отправить мне настройки zshrc, если у вас так, как на этом рисунке

С zsh идут набор стандартных тем. что бы их посмотреть нужно запустить:

$ autoload -U promptinit
$ promptinit

После этого доступны такие команды

prompt -l           # показать доступные темы
prompt -p <тема>    # просмотреть preview темы
prompt -h <тема>    # помощь по теме
prompt -s <тема>    # установить тему
prompt_<тема>_setup # настройка темы

Это мои настройки промпта. Сохранено в ~/.zsh_prompt, а в .zshrc прописано

source ~/.zsh_prompt
setopt prompt_subst
setopt prompt_bang
 
# устанавливаем настройки уставновки заголовков окна в различных терминалах
case $TERM in
    *xterm*|rxvt*|(dt|k|E)term*)
        preexec () { print -Pn "\e]0;%n@%m<%~ [$2]\a" }
        prompt_term_precmd() { print -Pn "\e]0;%n@%m: %~\a" }
 
    ;;
    screen*)
        preexec () {
            print -Pn "\e]0;$2\a"
            print -Pn "\ek%~ <$1>\e\\" # && print -Pn "\e]0;(screen)%n@%m<%~ [$1]\a" 
        }
 
        prompt_term_precmd() {
            #print -Pn "\e]2;%~\a" 
            print -Pn "\ek<%~>\e\\" # && print -Pn "\e]0;(screen)%n@%m: %~\a"
        }
    ;;
    *) prompt_term_precmd() {} ;;
esac
 
# часики справа
RPROMPT=$'%b%F{cyan}%T%f'
 
# что бы часики тикали сами, а не только после запуска команды
schedprompt() {
  emulate -L zsh
  zmodload -i zsh/sched
 
  # Remove existing event, so that multiple calls to
  # "schedprompt" work OK.  (You could put one in precmd to push
  # the timer 30 seconds into the future, for example.)
  integer i=${"${(@)zsh_scheduled_events#*:*:}"[(I)schedprompt]}
  (( i )) && sched -$i
 
  # Test that zle is running before calling the widget (recommended
  # to avoid error messages).
  # Otherwise it updates on entry to zle, so there's no loss.
  zle && zle reset-prompt
 
  # This ensures we're not too far off the start of the minute
  sched +30 schedprompt
}
 
 
# если шел запущен через ssh клиент, выводить имя пользователя другим цветом
if [[ -n "$SSH_CLIENT" ]]; then
    HOSTCOLOR=%B%F{blue}
else
    HOSTCOLOR=%b%F{yellow}
fi
 
# фунция для отлавливания кода ошибки последней запущеной команды
prompt_precmd ()
{
    setopt noxtrace localoptions
    local exitstatus=$1
    [[ $exitstatus -ge 128 ]] && psvar[1]=" $signals[$exitstatus-127]" ||
        psvar[1]=""
 
    [[ -o interactive ]] && jobs -l
 
}
 
# эта фунция запускается после каждой введённой команды
precmd() {
    local exitstatus=$?
    [[ -t 1 ]] || return    # not batch mode
 
    prompt_precmd $exitstatus;
    prompt_term_precmd;
}
 
show_prompt {}
{
    p_rc="%(?..<%?%1v>)"
 
    PROMPT="\
%(!.%{%B%F{yellow}%}%n%{%b%F{red}%}@.)\
%{$HOSTCOLOR%}%m\
%{%b%F{white}%}!$p_shlvlhist%{%b%F{cyan}%}%l\
%{%(?.%b%F{red}.%B%F{red})%}<$p_rc\
%{%B%F{green}%}%~/%f\
"
 
    PROMPT2='%(4_.\.)%3_> %E'
 
}
 
# draw prompt first time
show_prompt
schedprompt

Так же на сайте есть советы в тему:

А что, собственно, делает опция -u ?
На FreeBSD в sed её не оказалось.

обозначает "ubuffered". если нет этой опции, то sed буферезирует какое то кол-во данных перед тем как их отображать и тогда подствеченные ошибки будут выводится блоками по мере обработки

Отправить комментарий

Google Friend Connect (leave a quick comment)
loading...
Содержание этого поля является приватным и не предназначено к показу.