Zsh: Automatycznie modyfikuj wykonane polecenie

9

Niedawno zainstalowałem grc (ogólny koloryzator) w moim systemie za pośrednictwem MacPorts, co daje mi możliwość uzyskania kolorowego wyjścia dla wielu poleceń, które domyślnie go nie obsługują (patrz zrzut ekranu poniżej). Przykład grc z traceroute.
Chciałbym, aby używanie grc było automatyczne, jednak nie dla określonych poleceń, ale dla każdego polecenia. Używam Zsh jako mojej powłoki.

Zasadniczo za każdym razem, gdy wykonuję command -parameter 1 2 3, chciałbym, aby był automatycznie wykonywany jako grc command -parameter 1 2 3.
Nie zamierzam używać aliasów, na przykład traceroutealiasów grc traceroute, ponieważ dodaję coraz więcej poleceń, aby grc pokolorował.

Sprawdziłem konfiguracje preexec i precmd dla .zshrc, ale nie znalazłem sposobu na osiągnięcie tego, czego szukam.

Gnida
źródło

Odpowiedzi:

6

Możesz to zrobić, ponownie definiując widget linii akceptacji:

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

Może to jednak powodować problemy dla poleceń takich jak „for i (..)”, „var = x”, „f () {” ...

Stéphane Chazelas
źródło
Słuszna uwaga. Nie mogłem wymyślić żadnych problemów, które to rozwiązanie mogłoby stworzyć samemu, ale masz rację w tym imieniu. Dziękuję za Twój czas.
Nit,
Wadą tej metody jest to, że historia pokaże się grcna początku każdego polecenia.
joeytwiddle
6

Inna alternatywa. Ten sam rodzaj potencjalnych problemów:

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

Używałbym „aliasu” dla każdego polecenia wymagającego „grc”, zamiast próbować znaleźć wyjątki dla opublikowanych tutaj rozwiązań.

Stéphane Chazelas
źródło