Jak zrobić kolory wyjściowe „mniej”?

25

Kiedy uruchamiam program (na przykład greplub ls) bez pagera, jego dane wyjściowe są kolorowe. Jednak gdy go uruchomię, przesyłam dane wyjściowe less, kolory nie są wyświetlane.

Na przykład to polecenie wyświetla kolorowe dane wyjściowe:

grep -r something

ale to nie:

grep -r something | less

Czemu? Jak mogę zobaczyć kolory less?

Mohammad Reza Rezwani
źródło
5
grep --color=always "search string" * | less -Rale zwykle używam mostobecnie zamiast less. RÓWNIEŻ: gnu.org/software/src-highlite to kolorowy zakreślacz (mniej też działa)
Rinzwind
@alex masz zainstalowany python-pygments?
souravc
@souravc nie Nie zainstalowałem tego
Mohammad Reza Rezwani
@ales mnie ignoruje, prawda? >: - D
Rinzwind

Odpowiedzi:

36

Istnieją tutaj dwa problemy:

  • Polecenia takie jak ls- które automatycznie wykrywają obsługę kolorów - nie znajdują wsparcia z potoków
  • less jest ustawione tak, aby wyświetlać tylko kody kolorów domyślnie.

Oba można przezwyciężyć, ale jest to trochę niezgrabne:

ls --color=always | less -R

To nie jest lsspecyficzne. Wiele poleceń obsługujących kolor ma również argument zastępowania.


Nieco bardziej dogłębną odpowiedzią jest lssprawdzenie, czy jego STDOUT należy do prawdziwego terminala, czy nie. Podczas przesuwania elementów STDOUT jest ustawiany na STDIN następnego polecenia.

Możesz to zobaczyć w pracy w lskodzie źródłowym . Korzysta z isattypolecenia (podstawowy interfejs POSIX), aby ustalić, jaka jest sytuacja:

  • Czy kolory są domyślnie włączone:

        print_with_color = (i == color_always
                            || (i == color_if_tty
                                && isatty (STDOUT_FILENO)));
    
  • Czy próbujemy generować dane w wielu kolumnach:

    if (format == long_format)
      format = (isatty (STDOUT_FILENO) ? many_per_line : one_per_line);
    
    //...
    
    if (isatty (STDOUT_FILENO))
      {
        format = many_per_line;
        set_quoting_style (NULL, shell_escape_quoting_style);
        qmark_funny_chars = true;
      }
    else
      {
        format = one_per_line;
        qmark_funny_chars = false;
      }
    

greprobi bardzo podobną rzecz, chyba że zostanie to wyraźnie zastąpione, wykryje obsługę kolorów, z isatty:

color_option = isatty (STDOUT_FILENO) && should_colorize ();
Oli
źródło
1
Mój ostatni głos (osiągnięty limit) na dziś, aby wesprzeć cię za 100 tys. Ale ja i Rinzwind chcemy ciasta, kiedy to się stanie.
hytromo
Pobrałem program o nazwie ack-grep. kiedy wpiszesz ack-grep foo, wyszuka foo we wszystkich podkatalogach. Więc zrobiłem ack-grep foo | mniej, a kolory zniknęły. Ale wygląda na to, że ten program nie obsługuje „--color = zawsze”, cokolwiek dzięki za pomoc
Mohammad Reza Rezwani,
1
@alex ack ma --colorargument:ack-grep -i select --color | less -R
Oli
@Oli ......... O mój Boże ........ jedyną rzeczą, którą mogę powiedzieć o twojej wiedzy i pomocy, a także mocy Linuksa
Mohammad Reza Rezwani
1
@ B1KMusic Zgadzam się. Zgadzam się tak bardzo, że dowiedziałem się, jak to działa i zaktualizowałem odpowiedź. Możesz wymusić kolumny za pomocą -Cargumentu.
Oli
2

Jeśli interesują Cię kolory lessbardziej ogólnie, możesz rzucić okiem lesspipe.sh. Zobacz na przykład http://freecode.com/projects/lesspipe .

lesspipe.sh to filtr wejściowy dla pagera mniej, jak opisano na stronie podręcznika less. Skrypt działa pod powłoką kompatybilną z ksh (np. Bash, zsh) i pozwala mniej używać do przeglądania plików z zawartością binarną, plikami skompresowanymi, archiwami i plikami zawartymi w archiwach.

Pokoloruje również skrypty powłoki, skrypty Perla itp. Podobnie jak edytor tekstowy, ale bez użycia programu do wstępnego przetwarzania do pokolorowania.

DaveEmme
źródło