Podświetlanie / kolorowanie składni cat

202

Czy istnieje metoda pokolorowania wyniku cat, tak jak greprobi to.

W grepwiększości konsol wyświetla kolorowe wyniki podkreślające wyszukiwane słowa kluczowe. W przeciwnym razie możesz wymusić to, wywołując. grep --color Czy istnieje ogólny sposób pokolorowania wyjścia dowolnego programu zgodnie z osobistym wyborem.

Z tego, co rozumiem, sam program nie ponosi odpowiedzialności za kolory. To jest skorupa.

Używam domyślnej powłoki w FreeBSD 5.2.1, która wygląda tak, jakby nigdy nie widziała kolorów od epoki.

Lelouch Lamperouge
źródło
Nie rozumiem, co próbujesz powiedzieć
Lelouch Lamperouge
o nie. Nie chcę wyświetlać pliku binarnego. Chcę tylko wyświetlić dane wyjściowe pliku binarnego w kolorowy sposób.
Lelouch Lamperouge
6
meh - FTFY (zawsze możesz edytować własne pytania)
patrz
Zredagowałem, aby uniknąć nieporozumień dotyczących terminu „binarny”
Volker Siegel,
3
Myślę, że odpowiedź @buergi pasuje do pytania i jest to również poparte liczbą głosów pozytywnych. Rozważ zmianę zaakceptowanej odpowiedzi.
Ioannis Filippidis

Odpowiedzi:

22

catwyróżnianie składni jest po prostu poza zakresem. catnie jest do tego przeznaczony. Jeśli chcesz, aby cała zawartość jakiegoś pliku była w jakiś sposób pokolorowana (z tym samym kolorem dla całego pliku), możesz użyć sekwencji ucieczki terminalu do sterowania kolorem.

Oto przykładowy skrypt, który wybierze kolor na podstawie typu pliku (możesz użyć czegoś takiego zamiast wywoływać catbezpośrednio):

#!/bin/bash
fileType="$(file "$1" | grep -o 'text')"
if [ "$fileType" == 'text' ]; then
    echo -en "\033[1m"
else
    echo -en "\033[31m"
fi
cat $1
echo -en "\033[0m"

Powyższe (na terminalu, który obsługuje te sekwencje specjalne) wydrukuje dowolny plik tekstowy jako „pogrubiony” i wydrukuje każdy plik binarny jako czerwony. Możesz użyć stringszamiast catdo drukowania plików binarnych i możesz ulepszyć logikę, aby dopasować ją do swoich potrzeb.

Costi Ciudatu
źródło
Myślałem o czymś takim. Ale potrzebuję czegoś, co zrobiłoby to uniwersalnie. Nie tylko cat/ grep/any particular program
Lelouch Lamperouge
Następnie możesz po prostu przekazać polecenie do wykonania jako argument do skryptu i zastąpić catwywołanie na stałe częścią, $cmdktóra jest inicjowana jako $ 1, jeśli istnieją dwa argumenty lub wartość domyślna, jeśli jest tylko jeden. Wtedy po prostu napisać: colorful.sh grep file.
Costi Ciudatu
8
„kot nie jest do tego przeznaczony”. Cat nie jest też przeznaczony do zapisywania pojedynczych plików na standardowe wyjście - służy do konkatenacji. Ale to nadal nie oznacza, że ​​zapisywanie pojedynczych plików na standardowe wyjście nie jest przydatne. Nie oznacza to, że zaznaczenie ich nie jest przydatne.
mikemaccana
Próbowałem, pod cygwin pygmentizenie jest w stanie pokolorować. Jakieś wskazówki?
truthadjustr
407

Poleciłbym pygmentizez pakietu python python-pygments. Możesz zdefiniować następujący przydatny alias (chyba że używasz ccatz pakietu ccrypt).

alias ccat='pygmentize -g'

Podkreślono składnię danych wyjściowych kota za pomocą pygmentacji

A jeśli chcesz numery linii:

alias ccat='pygmentize -g -O style=colorful,linenos=1'
buergi
źródło
22
Innym rozwiązaniem jest użycie highlightpolecenia linux . alias ccat='highlight -O ansi'
Evan Purkhiser
99
To powinna być zaakceptowana odpowiedź IMHO. Dodając do tego alias alias dog='pygmentize -g', ponieważ, ponieważ psy są fajniejsze niż koty!
polym
8
Możesz dodać mniej -R, aby kod był przewijalny:#!/bin/bash \n pygmentize -g $1 | less -R
Fabricio PH
6
Zadzwoniłem do mojego aliasu nyancat.
zneak
2
pygmentacja działa zgodnie z oczekiwaniami, ale niestety wydaje się dość powolna. : - /
Frerich Raabe
113

Opcje:

pygmentacja jest dobra. Mam alias:

alias c='pygmentize -g'

ale główną atrakcją jest kolejna szeroko dostępna alternatywa

alias cats='highlight -O ansi --force'

Instalacja:

Może być konieczne zainstalowanie pygmentsza pomocą:

sudo pip install pygments
sudo easy_install Pygments #for Mac user

i dla highlightpakietu, który jest łatwo dostępny we wszystkich dystrybucjach

sudo apt-get install highlight
sudo yum install highlight

W akcji:

Załączam ujęcia dla obu poniżej, aby uzyskać dobre porównanie wyróżnień

Oto pygmentizew akcji: Pigmentuj podświetlanie w pliku python

a to jest highlight: Podświetl wyróżnianie w pliku python

Shubham Chaudhary
źródło
4
highlightdziałał świetnie dla moich potrzeb i łatwo instalował, dzięki. Jeśli chcesz przeglądać pliki bez rozszerzeń (np. .Bash_aliases), dodaj --syntax=bashdodatkowo, aby -O ansije wymusić.
jerclarke
1
# pip install Pygments # echo "alias catc = 'pygmentize -g'" >> "~ / .bashrc" # zamknij terminal # otwórz terminal # catc test.js --- i doskonałe prace :-) 😊
BG Bruno
3
highlightjest 34x szybszy niż ten program w języku Python. Moc klasycznych języków jest silna.
Avindra Goolcharan
2
Na przykład highlight, chcesz dodać --forcedo aliasu, w przeciwnym razie wygeneruje błąd dla formatów plików, których nie rozumie, a podczas catzastępowania chcesz, aby nadal wyświetlał dane wyjściowe bez podświetlania, co --forcerobi. Wszyscy razem:alias cat="highlight -O ansi --force"
Alexander Klimetschek,
1
@Luke, dlatego powinieneś dodać -O ansidomyślną wartość wyjściową HTML :-)
Thomas
59

Od końca kwietnia 2018 r .:

Bat - klon cat (1) z podświetlaniem składni i integracją Git.

Projekt jest klonem kota ze wsparciem dla kolorów i dostosowań napisanych w Rust. Oferuje nie tylko podświetlanie składni z wieloma motywami, ale także integrację z Git. Jak opisano w dokumentacji:

nietoperz stara się osiągnąć następujące cele :

  • Zapewnij piękne, zaawansowane podświetlanie składni
  • Zintegruj z Git, aby wyświetlić modyfikacje plików
  • Być drop-in zamiennikiem dla (POSIX) cat
  • Zaoferuj przyjazny dla użytkownika interfejs wiersza polecenia

Nie trzeba dodawać, że jest znacznie szybszy niż pygmentacja i nie dusi się w przypadku dużych plików.

Kod źródłowy i wydania binarne + instrukcje instalacji można znaleźć w repozytorium Github, a także porównanie z alternatywnymi programami .

dangom
źródło
5
Ludzie nie wspominają o tym, że batdomyślnie pozostaje w trybie interaktywnym. Aby zachowywał się bardziej cat, użyj go z -ppargumentem. Alias alias cat="bat -pp"jest prawdopodobnie tym, czego ludzie szukają.
Canella,
1
Wcześniej używałem pygmentowania do kolorowania kota, ale rozwiązanie z batem jest znacznie lepiej dostosowane do dużych plików (logi kilku MB), w których wydajność pygmentacji jest poniżej.
Christian.D
34

vimcat jest jednoplikowy (skrypt powłoki) i działa dobrze:

http://www.vim.org/scripts/script.php?script_id=4325

Ostatnia aktualizacja pochodzi z grudnia 2013 r. Wskazówka: możesz wymusić rozpoznawanie typu pliku przez vimcat -c "set ft=<type>".

Soergener
źródło
12
Jedną z rzeczy, która jest naprawdę miła w vimcat (lub vimpager) jest to, że będzie respektował schemat kolorów, który zdefiniowałeś w swoim, ~/.vimrcwięc podświetlanie składni będzie takie samo, gdy chcesz edytować (vim) lub wydrukować (vimcat). Zauważ, że zaktualizowaną wersję vimcat można znaleźć w repozytorium vimpager .
timss
Odpowiedź Amaynut jest starsza i podobna
olibre
vimpagernie używa mojego vim kolorów.
WhyNotHugo
2
W moim szybkim nienaukowym teście vimcat(czas wykonywania 1 ~ 2 sekundy) jest znacznie wolniejszy niż pymentize(~ 200 highlightms), co jest znacznie wolniejszy niż cat(~ 20 ms), który jest znacznie wolniejszy niż (~ 2 ms ). Z drugiej strony, vimcatobsługuje więcej typów plików i jest bardziej dokładne niż hightlighta pygmentize, i to jeszcze szybciej niż pierwszy vimpotem :q. Więc zarabia mój wybór do tego konkretnego zadania.
Penghe Geng,
1
@olibre Ta odpowiedź wydaje się starsza niż ta z Amaynut.
Franklin Yu
31

Narzędzie, którego szukasz, to prawdopodobnie supercat (oto krótkie wprowadzenie opublikowane przez Linux Journal).

Zdaję sobie sprawę, że ta odpowiedź jest spóźniona i nie w pełni spełnia wymagania PO. Więc dodam go tylko w celach informacyjnych (może być przydatny dla innych osób szukających sposobu pokolorowania pliku tekstowego).

mfriedman
źródło
1
Wydaje się, że to nie działa tak łatwo, zainstalowałem go i użyłem przykładowej konfiguracji, ale to nie miało efektu kolorystycznego
rubo77
Fajnie, wszystko inne jest zbyt wolne. To jest dobre. Aby uzyskać pomoc w konfiguracji, patrz manpages.debian.org/testing/supercat/spc.1.en.html
okovko
Dodatkowo dla niektórych konfiguracji dla różnych języków: github.com/tanderson92/supercat/tree/master/spcrc
okovko
20

Istnieje kolorowa wersja cat - ccat . Pobierz z https://github.com/jingweno/ccat/ .

Instalacja w systemie Linux / Windows / macOS

Jest to pojedynczy samodzielny plik wykonywalny, więc aby go zainstalować, możesz rozpakować wersję binarną dla swojego systemu operacyjnego z https://github.com/jingweno/ccat/releases i skopiować na przykład plik binarny ccat/usr/local/bin .

Jeśli chcesz uniknąć plików binarnych lub jeśli nie masz pliku binarnego dla swojej platformy (np. Raspberry pi itp.), Możesz na przemian kompilować ze źródła, pod warunkiem , że masz działające gośrodowisko programistyczne ( apt install golangna Linux-ach opartych na Debianie lub brew install golangna Macu ):

go get -u github.com/jingweno/ccat

Plik ccatbinarny zostanie utworzony pod Twoim $GOPATH/bin.

Instalowanie na komputerze Mac przez homebrew

brew install ccat

Alias ​​do cat

Aby zamienić zwykłe catz ccatdodatkiem ~/.bashrc:

alias cat="ccat $*"
alias cat0="/bin/cat $*" # for cases when you need plain `cat`

ccatjest zaimplementowany w Go , więc jest to natywny plik binarny, który działa znacznie szybciej niż rozwiązania oparte na Pythonie, takie jak pygments , moduł z tyłu pygmentize; Nie widziałem żadnej zauważalnej różnicy prędkości między cati ccat.

ccpizza
źródło
1
Jaka jest właściwa nazwa repo? apt-get ccat w Ubuntu 16 daje mi jakiś program szyfrujący i nieco przezabawnie zamurował mój terminal, ponieważ obecnie próbuje zaszyfrować lub odszyfrować cały mój katalog proc ...
Katastic Voyage
@KatasticVoyage: mój zły: z jakiegoś powodu założyłem, że to w repozytorium i zapomniałem, jak to dostałem w moim pudełku Ubuntu. Zobacz zaktualizowaną odpowiedź.
ccpizza,
2
Obecnie wydaje się, że brew install ccatwystarczy, nie trzeba brew tapjuż.
Jeff Huijsmans,
12

Najlepszym i najłatwiejszym sposobem, aby to zrobić, jeśli masz vima na swoim komputerze, jest skorzystanie vimcatz vimpagerprogramu.

  1. Zainstaluj vimpage z git clone git://github.com/rkitover/vimpager cd vimpager sudo make install
  2. Uruchom vimcat:

    vimcat index.html

Amaynut
źródło
Uwielbiam ten pomysł, ale vimcat należy do tych wolniejszych. Jest tak powolny jak pygmentaryzacja. 15x wolniej niż highlighti 3x wolniej niż batdla 30-liniowego skryptu bash na moim komputerze.
Ponkadoodle,
11

source-highlight

Być może można znaleźć ciekawe source-highlight wydane pod GNU : pakiet inny niż highlight.

Fragment apt-cache show source-highlight:

Description-pl: konwertuj kod źródłowy na wyróżniony składnię dokument.
Ten program, biorąc pod uwagę plik źródłowy, tworzy dokument z podświetlaniem składni.
Obsługuje podświetlanie składni dla ponad 100 formatów plików ...
Do wydruku obsługiwane są następujące formaty: HTML, XHTML, LaTeX, Texinfo, sekwencje specjalne kolorów ANSI i DocBook

Zrobiłem trochę aliasu (Cat i PCat, patrz poniżej) i to jest ich wynik

Przykład ekranu

Możesz zainstalować na Debianie za pomocą

sudo apt-get install source-highlight

i dodaj go jako alias np. w swoim .bash_aliasesz czymś w rodzaju linii poniżej.

alias Cat='source-highlight --out-format=esc -o STDOUT -i'  
Cat myfile.c # or myfile.xml ...

Lub możesz zrobić podobny alias (bez -ikońcówki, aby mieć możliwość wtargnięcia )

alias PCat='source-highlight --out-format=esc -o STDOUT '
tail myfile.sh | PCat     # Note the absence of the `-i`

Wśród opcji, że można odczytać z man source-highlighttych -spodkreśla, że istnieje możliwość wyboru, czy życie , podświetlenie po linii poleceń lub pozostawić do programu tego obowiązku:

-s , --src-lang = STRING język źródłowy (użyj --lang-list, aby uzyskać pełną listę). Jeśli nie zostanie określony, język źródłowy zostanie odgadnięty na podstawie rozszerzenia pliku .

--lang-list wyświetla listę wszystkich obsługiwanych języków i powiązanych plików definicji języków

Hastur
źródło
1
Jeśli chcesz również kolorowania lessze source-highlightktoś na GitHub daje odpowiedź: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"a export LESS=" -R ". Bardzo przydatne, gdy pygmentizenie jest dostępne i nie można go zainstalować.
Lalylulelo
8

Z tego, co rozumiem, sam plik binarny nie jest odpowiedzialny za kolory. To jest skorupa.

To nie jest poprawne. Terminal po prostu interpretuje kody kolorów wysyłane do terminala. W zależności od swoich możliwości może ignorować niektóre kody formatowania / kolorowania.

Ze strony podręcznika nie wydaje się, że cat obsługuje kolorowanie swoich wyników. Nawet jeśli miałoby obsługiwać kolorowanie jak grep, co powinno pokolorować w pliku tekstowym? Składnia podkreślająca wymaganą znajomość podstawowego języka, który nie jest objęty prostym narzędziem, takim jak cat.

Możesz wypróbować bardziej wydajne edytory, takie jak vim, emacs, gedit itp. Na platformie unix, jeśli Twoim celem jest wyróżnienie podświetlonego kodu.

Ashwinee K Jha
źródło
3
catNie jest przeznaczony do drukowania plików z numerami linii, nie służy do kompresji wielu pustych linii, nie służy do patrzenia na niedrukowalne znaki ASCII, służy do łączenia plików”. - ze stylu UNIX lub cat -v Uważany za szkodliwy .
Scott
7

Na OSX po prostu zrób brew install ccat.

https://github.com/jingweno/ccat . Podobnie jak cat, ale wyświetla zawartość z podświetlaniem składni. Wbudowany Go.

joost
źródło
Miły. Ma pewne ograniczenia językowe, ale czuje się o wiele szybciej niż piggy.
Gustavo Bezerra
ccat można również znaleźć w repozytorium AUR Arch Linux. Użyj yaourt lub pacaur, aby zainstalować pakiet.
Marcs,
6

nietoperz właśnie to robi i może być aliasowany do kotaalias cat='bat'

Sailendra Pinupolu
źródło
3

Stare pytanie, tylko odpowiedź na rekord, aby zapewnić rozwiązanie, z którego ostatecznie skorzystałem. Być może jest to nieco zuchwałe (prawdopodobnie nie pierwotna intencja parametru), ale:

alias cgrep = 'grep -C 9000'

kot cokolwiek | cgrep „snozzberries”

.. grep -C Ndostarczy N linii kontekstu powyżej i poniżej znalezionego elementu. Jeśli jest większy niż wejście, całe wejście jest uwzględniane. W tym przypadku upewniamy się tylko, że jest większy niż jakiekolwiek typowe wyjście terminalowe, na które będziemy chcieli przyjrzeć się ręcznie, co jest generalnie tym, co chcesz zrobić, jeśli zaznaczysz.

EDYCJA: Jednak to rozwiązanie sugerowane poniżej przez Beni Cherniavsky-Paskin jest lepsze - pasuje (i podkreśla) albo słowo, którego szukasz, albo początek linii (nie do wyróżnienia). Wynik netto jest dokładnie taki, jak chcesz.

cat whatever | egrep 'snozzberries|$'

To nowe najlepsze rozwiązanie, jakie widziałem dla tego problemu, dzięki Beni.

Pan B.
źródło
2
Bardziej niezawodnym sposobem na podkreślenie wzoru przy jednoczesnym uwzględnieniu wszystkich linii jestegrep 'snozzberries|$'
Beni Cherniavsky-Paskin
1

Napisałem mały skrypt do wykonania koloryzacji pygmentize.

colorize_via_pygmentize() {
    if [ ! -x "$(which pygmentize)" ]; then
        echo "package \'Pygments\' is not installed!"
        return -1
    fi

    if [ $# -eq 0 ]; then
        pygmentize -g $@
    fi

    for FNAME in $@
    do
        filename=$(basename "$FNAME")
        lexer=`pygmentize -N \"$filename\"`
        if [ "Z$lexer" != "Ztext" ]; then
            pygmentize -l $lexer "$FNAME"
        else
            pygmentize -g "$FNAME"
        fi
    done
}

A następnie utwórz alias do skryptu. alias cat=colorize_via_pygmentize. Nie zapomnij też zapisać tego w ~ / .bashrc .

Rohit Sehgal
źródło
0

Jeśli chcesz, aby jedna linijka ustawiała catwydruk na dany kolor, możesz dołączyć

alias cat="echo -en 'code' | cat - "

dla Twojej ~/.$(basename $SHELL)rc

Oto lista kolorów: https://gist.github.com/chrisopedia/8754917

Lubię to '\e[1;93m', co jest intensywne żółte. To wygląda tak:wprowadź opis zdjęcia tutaj

okovko
źródło
0

po prostu użyj vim i tego pliku vimrc .

oneliner:

vim -c '1' -c 'set cmdheight=1' -c 'set readonly' -c 'set nomodifiable' -c 'syntax enable' -c 'set guioptions=aiMr' -c 'nmap q :q!<CR>' -c 'nmap <Up> <C-Y>' -c 'nmap <Down> <C-E>' -c 'nmap ^V <C-F><C-G>' "$@" 

nano -v może być również alternatywą.

eadmaster
źródło
0

Umieść w swoim ~ / .bashrc

function ccat() { docker run -it -v "$(pwd)":/workdir -w /workdir whalebrew/pygmentize $1; }

następnie

ccat filename

Whalebrew tworzy aliasy dla obrazów Docker, dzięki czemu można je uruchamiać tak, jakby były poleceniami natywnymi. To jest jak Homebrew, ale z obrazami Dockera.

javajon
źródło