Zsh: автоматически изменять выполненную команду

9

Я недавно установил grc (универсальный colorizer) в свою систему через MacPorts, что дает мне возможность получать цветной вывод для множества команд, которые по умолчанию не поддерживают его (см. Скриншот ниже). Пример grc с traceroute.
Я хотел бы сделать использование grc автоматически, но не для конкретных команд, а для каждой команды. Я использую Zsh в качестве оболочки.

По сути, всякий раз, когда я выполняю, command -parameter 1 2 3я бы хотел, чтобы он автоматически выполнялся как grc command -parameter 1 2 3.
Я не собираюсь использовать псевдонимы, например, tracerouteпсевдоним для grc traceroute, поскольку я добавляю все больше и больше команд для grc для раскрашивания.

Я изучил конфигурации preexec и precmd для .zshrc, но я не нашел способа добиться того, что я ищу.

гнида
источник

Ответы:

6

Вы можете сделать это, переопределив виджет accept-line:

add-grc() { [[ $BUFFER = grc* ]] || BUFFER="grc $BUFFER"; zle .$WIDGET "$@"; }
zle -N accept-line add-grc

Однако это может вызвать проблемы для таких команд, как "for i (..)", "var = x", "f () {" ...

Стефан Шазелас
источник
Хорошая точка зрения. Я не мог думать о каких-либо проблемах, которые может создать это решение, но вы правы в этом. Спасибо за ваше время.
Гн
Недостатком этого метода является то, что история будет отображаться grcв начале каждой команды.
Joeytwiddle
6

Другая альтернатива. Те же потенциальные проблемы:

TRAPDEBUG() { eval "grc $ZSH_DEBUG_CMD"; setopt errexit; }

Я бы использовал «псевдоним» для каждой команды, которая нуждается в «grc» вместо того, чтобы пытаться выяснить исключения для решений, размещенных здесь.

Стефан Шазелас
источник
3

Рассмотрите возможность использования grc.zshэтой части, grcкоторую можно найти здесь . У него есть псевдонимы для всех поддерживаемых команд.
Смотрите этот ответ Stackoverflow

Amr
источник