Syntax Hervorheben / Kolorieren Katze

202

Gibt es eine Methode , um die Ausgabe von bis zu kolorieren cat, die Art und Weise greptut.

Für grepin den meisten Konsolen zeigt es eine farbige Ausgabe Hervorhebung der Schlüsselwörtern durchsucht. Andernfalls können Sie es erzwingen, indem Sie aufrufen. grep --color Gibt es eine generische Möglichkeit, die Ausgabe eines Programms entsprechend Ihrer persönlichen Wahl zu färben?

Soweit ich weiß, ist das Programm selbst nicht für die Farben verantwortlich. Es ist die Hülle.

Ich verwende die Standard-Shell in FreeBSD 5.2.1, die anscheinend seit der Epoche keine Farben mehr gesehen hat.

Lelouch Lamperouge
quelle
Ich kann nicht verstehen, was Sie sagen wollen
Lelouch Lamperouge
Ach nein. Ich möchte keine Binärdatei anzeigen. Ich möchte nur die Ausgabe einer Binärdatei koloriert anzeigen.
Lelouch Lamperouge
6
meh - FTFY (Sie können immer Ihre eigenen Fragen bearbeiten)
sehe
Ich habe bearbeitet, um die Verwirrung bezüglich des Begriffs "binär" zu vermeiden
Volker Siegel
3
Ich denke, dass die Antwort von @buergi mit der Frage übereinstimmt, und dies wird auch durch die Anzahl der Upvotes unterstützt. Überlegen Sie, ob Sie die akzeptierte Antwort ändern möchten.
Ioannis Filippidis

Antworten:

22

catmit Syntax Hervorhebung ist einfach außerhalb des Geltungsbereichs. catist nicht dafür gedacht. Wenn Sie nur den gesamten Inhalt einer Datei in irgendeiner Weise farbig gestalten möchten (mit derselben Farbe für die gesamte Datei), können Sie Terminal-Escape-Sequenzen verwenden, um die Farbe zu steuern.

Hier ist ein Beispielskript, das die Farbe basierend auf dem Dateityp auswählt (Sie können so etwas verwenden, anstatt es catdirekt aufzurufen ):

#!/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"

Das obige (auf einem Terminal, das diese Escape-Sequenzen unterstützt) druckt jede Textdatei als 'fett' und jede Binärdatei als rot. Sie können stringsanstelle von catzum Drucken von Binärdateien verwenden und die Logik verbessern, um sie an Ihre Anforderungen anzupassen.

Costi Ciudatu
quelle
Ich dachte an so etwas. Aber ich brauche etwas, das es universell macht. Nicht nur cat/ grep/any particular program
Lelouch Lamperouge
Dann können Sie einfach den Befehl, der als Argument ausgeführt werden soll, an das Skript übergeben und den fest codierten catAufruf durch einen ersetzen, der $cmdals $ 1 initialisiert wird, wenn zwei Argumente vorhanden sind, oder als Standard, wenn nur eines vorhanden ist. Dann schreiben Sie einfach : colorful.sh grep file.
Costi Ciudatu
8
"Katze ist nicht dafür gedacht." Cat ist auch nicht zum Schreiben einzelner Dateien in stdout gedacht, sondern zur Verkettung. Das bedeutet aber immer noch nicht, dass das Schreiben einzelner Dateien in stdout nicht sinnvoll ist. Das bedeutet nicht, dass das Hervorheben nicht sinnvoll ist.
Mikemaccana
Ich habe versucht, unter Cygwin pygmentizeist nicht in der Lage zu färben. Irgendwelche Tipps?
Truthadjustr
407

Ich würde pygmentizeaus dem Python-Paket empfehlen python-pygments. Möglicherweise möchten Sie den folgenden praktischen Alias ​​definieren (es sei denn, Sie verwenden ihn ccataus dem ccrypt-Paket).

alias ccat='pygmentize -g'

Syntax hervorgehobene Katzenausgabe mit pygementize

Und wenn Sie Zeilennummern möchten:

alias ccat='pygmentize -g -O style=colorful,linenos=1'
buergi
quelle
22
Eine andere Lösung ist die Verwendung des Linux- highlightBefehls. alias ccat='highlight -O ansi'
Evan Purkhiser
99
Dies sollte meiner Meinung nach die akzeptierte Antwort sein. Außerdem habe ich es als Alias ​​bezeichnet alias dog='pygmentize -g', weil Hunde cooler sind als Katzen!
Polym
8
Sie können weniger -R hinzufügen, um den Code scrollbar zu machen:#!/bin/bash \n pygmentize -g $1 | less -R
Fabricio PH
6
Ich habe meinen Alias ​​genannt nyancat.
Zneak
2
pygementize funktioniert wie erwartet, scheint aber leider eher langsam zu sein. : - /
Frerich Raabe
113

Optionen:

pygementize ist gut. Ich habe einen Alias:

alias c='pygmentize -g'

Aber Highlight ist eine weitere weit verbreitete Alternative

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

Installation:

Möglicherweise müssen Sie Folgendes installieren pygments:

sudo pip install pygments
sudo easy_install Pygments #for Mac user

und für highlightPakete, die auf allen Distributionen leicht verfügbar sind

sudo apt-get install highlight
sudo yum install highlight

In Aktion:

Ich füge unten für beide Aufnahmen hinzu, um einen guten Vergleich der Hervorhebungen zu erzielen

Hier ist pygmentizein Aktion: Pygementize-Hervorhebung in der Python-Datei

und das ist highlight: Markieren Sie die Hervorhebung in der Python-Datei

Shubham Chaudhary
quelle
4
highlightfunktionierte hervorragend für meine Bedürfnisse und einfach zu installieren, danke. Wenn Sie Dateien ohne Erweiterungen anzeigen möchten (z. B. .bash_aliases), fügen Sie --syntax=bashzusätzlich hinzu -O ansi, um sie zu erzwingen.
Jerclarke
1
# pip install Pylements # echo "alias catc = 'pygementize -g'" >> "~ / .bashrc" # Terminal schließen # Terminal öffnen # catc test.js --- und perfekte Arbeiten :-) 😊
BG Bruno
3
highlightist 34x schneller als dieses Python-Programm. Die Kraft der klassischen Sprachen ist stark.
Avindra Goolcharan
2
Für highlight, die Sie hinzufügen möchten , --forceum den Alias, sonst wird es einen Fehler für Dateiformate werfen , dass er nicht versteht, während als catErsatz Sie wollen die Ausgabe noch zeigen , ohne Hervorhebung, das ist , was der --forceFall ist. Alles zusammen:alias cat="highlight -O ansi --force"
Alexander Klimetschek
1
@ Luke, deshalb solltest du hinzufügen, dass -O ansistandardmäßig HTML ausgegeben wird :-)
Thomas
59

Ab Ende April 2018:

Bat - Ein Cat (1) -Klon mit Syntaxhervorhebung und Git-Integration.

Das Projekt ist ein Katzenklon mit Unterstützung für in Rust geschriebene Farben und Anpassungen. Es bietet nicht nur Syntaxhervorhebung mit mehreren Themen, sondern auch Git-Integration. Wie in der Dokumentation beschrieben:

Fledermaus versucht folgende Ziele zu erreichen :

  • Bieten Sie eine schöne, erweiterte Syntaxhervorhebung
  • In Git integrieren, um Dateimodifikationen anzuzeigen
  • Seien Sie ein Ersatz für (POSIX) Katze
  • Bieten Sie eine benutzerfreundliche Befehlszeilenschnittstelle

Es ist natürlich viel schneller als pygementize und erstickt nicht, wenn es mit großen Dateien konfrontiert wird.

Quellcode und Binärversionen + Installationsanweisungen finden Sie im Github-Repository sowie einen Vergleich mit alternativen Programmen .

Dangom
quelle
5
Was die Leute vergessen zu erwähnen ist, dass sie batstandardmäßig im interaktiven Modus bleiben. catVerwenden Sie es mit -ppArgumenten, damit es sich ähnlicher verhält . Ein Alias ​​wie alias cat="bat -pp"ist wahrscheinlich das, wonach die Leute suchen.
Canella
1
Ich habe Pygementize bereits zum Färben von Katzen verwendet, aber die Lösung mit bat eignet sich viel besser für große Dateien (Protokolle von mehreren MB), bei denen die Leistung von Pygementize unterdurchschnittlich ist.
Christian.D
34

vimcat ist Single-File (Shell-Skript) und funktioniert gut:

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

Das letzte Update ist ab Dezember 2013. Hinweis: Sie können die Dateityperkennung durch erzwingen vimcat -c "set ft=<type>".

Soergener
quelle
12
Eine Sache, die an vimcat (oder vimpager) wirklich gut ist, ist, dass es das Farbschema berücksichtigt, das Sie in Ihrem definiert haben, ~/.vimrcsodass die Syntaxhervorhebung sowohl beim Bearbeiten (vim) als auch beim Ausdrucken (vimcat) gleich ist. Beachten Sie, dass sich eine aktualisierte Version von vimcat im Vimpager-Repository befindet .
Timss
Amaynuts Antwort ist älter und ähnlich
olibre
vimpagerverwendet mein vim-Farbschema nicht.
WhyNotHugo
2
In meinem schnellen unwissenschaftlichen Test ist vimcat(1 ~ 2 Sekunden Ausführungszeit) viel langsamer als pymentize(~ 200 ms), was viel langsamer als highlight(~ 20 ms) ist, was viel langsamer als cat(~ 2 ms) ist. Auf der anderen Seite, vimcatGriffe mehr Dateitypen und ist genauer als hightlightund pygmentize, und es ist immer noch schneller als erstes vimdann :q. Damit verdient es mir meine Wahl für diese spezielle Aufgabe.
Penghe Geng
1
@olibre Diese Antwort scheint älter zu sein als die von Amaynut.
Franklin Yu
31

Das Tool, das Sie suchen, ist wahrscheinlich supercat (hier ist eine kurze Einführung, die vom Linux Journal veröffentlicht wurde).

Mir ist klar, dass diese Antwort zu spät ist und die OP-Anforderungen nicht vollständig erfüllt. Ich füge es also nur als Referenz hinzu (es könnte für andere Leute nützlich sein, die nach einer Möglichkeit suchen, die Ausgabe von Textdateien einzufärben).

mfriedman
quelle
1
Dies scheint nicht so einfach zu funktionieren, ich habe es installiert und die Beispielkonfiguration verwendet, aber das hatte keinen Farbeffekt
rubo77
Schön, alles andere ist zu langsam. Das ist gut. Für Hilfe bei Konfiguration finden manpages.debian.org/testing/supercat/spc.1.en.html
okovko
Zusätzlich für einige Konfigurationen für verschiedene Sprachen: github.com/tanderson92/supercat/tree/master/spcrc
okovko
20

Es gibt eine kolorierte Version von cat - ccat . Erhalten Sie es von https://github.com/jingweno/ccat/ .

Installation unter Linux / Windows / macOS

Es ist eine einzelne eigenständige ausführbare Datei. Um sie zu installieren, können Sie die Binärversion für Ihr Betriebssystem von https://github.com/jingweno/ccat/releases entpacken und beispielsweise die ccat- Binärdatei nach kopieren/usr/local/bin .

Wenn Sie Binärdateien vermeiden möchten oder wenn für Ihre Plattform keine Binärdatei vorhanden ist (z. B. Himbeer-Pi usw.), können Sie alternativ aus dem Quellcode kompilieren, sofern Sie über eine funktionierende goEntwicklungsumgebung verfügen ( apt install golangunter Debian-basierten Linuxen oder brew install golangauf dem Mac):

go get -u github.com/jingweno/ccat

Die ccatBinärdatei wird unter Ihrem erstellt $GOPATH/bin.

Installation auf dem Mac über Homebrew

brew install ccat

Alias ​​zu cat

So ersetzen Sie regelmäßig catdurch ccatAdd-In ~/.bashrc:

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

ccatist in Go implementiert , es handelt sich also um eine native Binärdatei, die viel schneller ausgeführt wird als Python-basierte Lösungen, wie z. B. pylements , das dahinter stehende Modul pygmentize. Ich habe keinen merklichen Geschwindigkeitsunterschied zwischen catund gesehen ccat.

ccpizza
quelle
1
Wie lautet der richtige Repo-Name? apt-get ccat in Ubuntu 16 gibt mir eine Art Verschlüsselungsprogramm und hat mein Terminal etwas komisch gemauert, da es gerade versucht, mein gesamtes Proc-Verzeichnis zu verschlüsseln oder zu entschlüsseln ...
Katastic Voyage
@KatasticVoyage: mein schlechtes: aus irgendeinem Grund habe ich angenommen, dass es in den Repos war, und ich habe vergessen, wie ich es in meine Ubuntu-Box bekommen habe. Siehe die aktualisierte Antwort.
ccpizza
2
Derzeit scheint brew install ccates genug zu sein, keine Notwendigkeit brew tapmehr.
Jeff Huijsmans
12

Der beste Weg , und der einfachste Weg , es zu tun , wenn Sie in Ihrem Rechner haben vim ist die Verwendung , vimcatdie mit kommt vimpagerProgramm.

  1. Installieren Sie vimpage mit git clone git://github.com/rkitover/vimpager cd vimpager sudo make install
  2. Führen Sie vimcat aus:

    vimcat index.html

Amaynut
quelle
Ich liebe die Idee, aber Vimcat gehört zu den langsameren hier. Es ist ungefähr so ​​langsam wie Pygementize. 15x langsamer als highlightund 3x langsamer als batbei einem 30-Zeilen-Bash-Skript auf meinem Computer.
Ponkadoodle
11

source-highlight

Vielleicht ist es möglich, interessante source-highlight Veröffentlichungen unter GNU zu finden : ein anderes Paket als highlight.

Auszug aus apt-cache show source-highlight:

Description-de: Konvertiert den Quellcode in ein mit Syntax hervorgehobenes Dokument.
Dieses Programm erstellt anhand einer Quelldatei ein Dokument mit Syntaxhervorhebung.
Es unterstützt die Syntaxhervorhebung für über 100 Dateiformate ...
Für die Ausgabe werden die folgenden Formate unterstützt: HTML, XHTML, LaTeX, Texinfo, ANSI-Farb-Escape-Sequenzen und DocBook

Ich habe einen Alias ​​gemacht (Cat und PCat, siehe unten) und dies ist ihre Ausgabe

Bildschirmbeispiel

Sie können auf Debian basierend mit installieren

sudo apt-get install source-highlight

und füge es als Alias ​​hinzu, z. B. in deinem .bash_aliasesmit so etwas wie der folgenden Zeile.

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

Oder Sie können einen ähnlichen Alias ​​erstellen (ohne dass -iam Ende die Möglichkeit besteht, ein Pipe-In durchzuführen ).

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

Unter den Optionen, die aus man source-highlightden -sUnterstreichungen gelesen werden können , ist es möglich , die Hervorhebung per Befehlszeile auszuwählen oder zu erzwingen oder diese Aufgabe dem Programm zu überlassen:

-s , --src-lang = STRING-Quellsprache (verwenden Sie --lang-list, um die vollständige Liste zu erhalten). Wenn nicht angegeben, wird die Ausgangssprache anhand der Dateierweiterung erraten .

--lang-list listet alle unterstützten Sprachen und zugehörigen Sprachdefinitionsdateien auf

Hastur
quelle
1
Wenn Sie wollen auch kolorieren lessmit source-highlight, jemand auf GitHub gibt die Antwort: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"und export LESS=" -R ". Sehr nützlich, wenn pygmentizees nicht verfügbar ist und nicht installiert werden kann.
Lalylulelo
8

Soweit ich weiß, ist die Binärdatei selbst nicht für die Farben verantwortlich. Es ist die Hülle.

Das ist nicht richtig. Das Terminal interpretiert nur die Farbcodes, die an das Terminal ausgegeben werden. Abhängig von seiner Fähigkeit kann es bestimmte Formatierungs- / Farbcodes ignorieren.

Auf der Manpage scheint es nicht so zu sein, dass Katze das Ausmalen ihrer Ausgabe unterstützt. Selbst wenn es das Färben wie grep unterstützen würde, was sollte es in der Textdatei färben? Syntax, die die erforderlichen Kenntnisse der zugrunde liegenden Sprache hervorhebt, die nicht im Rahmen eines einfachen Dienstprogramms wie cat liegen.

Sie können leistungsfähigere Editoren wie vim, emacs, gedit usw. auf der Unix-Plattform ausprobieren, wenn es Ihr Ziel ist, den hervorgehobenen Code zu sehen.

Ashwinee K Jha
quelle
3
" catNicht zum Drucken von Dateien mit Zeilennummern, nicht zum Komprimieren mehrerer Leerzeilen, nicht zum Betrachten nicht druckender ASCII-Zeichen, sondern zum Verketten von Dateien." - von UNIX Style oder cat -v Als schädlich eingestuft .
Scott
7

Unter OSX einfach machen brew install ccat .

https://github.com/jingweno/ccat . Wie cat, zeigt jedoch Inhalte mit Syntaxhervorhebung an. Eingebaut in Go.

Joost
quelle
Nett. Hat einige Spracheinschränkungen, fühlt sich aber viel schneller an als Pygemente.
Gustavo Bezerra
ccat befindet sich auch im AUR-Repository von Arch Linux. Verwenden Sie yaourt oder pacaur, um das Paket zu installieren.
Marcs
6

Fledermaus macht genau das und kann auf Katze ausgerichtet werdenalias cat='bat'

Sailendra Pinupolu
quelle
3

Alte Frage, die nur für die Aufzeichnung beantwortet wurde, um die Lösung bereitzustellen, die ich letztendlich verwendet habe. Vielleicht ist das ein bisschen hacky (wahrscheinlich nicht die ursprüngliche Absicht des Parameters), aber:

alias cgrep = 'grep -C 9000'

Katze was auch immer | cgrep 'snozzberries'

..grep -C N liefert N Kontextzeilen über und unter dem gefundenen Element. Wenn es größer als der Eingang ist, ist der gesamte Eingang enthalten. In diesem Fall stellen wir nur sicher, dass es größer ist als jeder typische Terminalausgang, den wir manuell betrachten möchten. Dies ist im Allgemeinen das, was Sie beim Hervorheben tun möchten.

BEARBEITEN: Diese unten von Beni Cherniavsky-Paskin vorgeschlagene Lösung ist jedoch überlegen - sie entspricht (und hebt hervor) entweder dem gesuchten Wort oder dem Zeilenanfang (nicht hervorhebbar). Das Nettoergebnis ist genau das, was Sie wollen.

cat whatever | egrep 'snozzberries|$'

Das ist die neue beste Lösung, die ich für dieses Problem gesehen habe, danke Beni.

Herr B.
quelle
2
Eine robustere Möglichkeit, ein Muster hervorzuheben, während alle Linien eingeschlossen sind, istegrep 'snozzberries|$'
Beni Cherniavsky-Paskin
1

Ich habe das kleine Skript geschrieben, um die Färbung mit durchzuführen 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
}

Und dann einen Alias ​​für das Skript erstellen. alias cat=colorize_via_pygmentize. Vergessen Sie auch nicht, dies in ~ / .bashrc zu speichern .

Rohit Sehgal
quelle
0

Wenn Sie nur möchten, dass ein Einzeiler die catAusgabe auf eine bestimmte Farbe einstellt , können Sie anhängen

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

zu deinem ~/.$(basename $SHELL)rc

Hier ist eine Übersicht mit Farbcodes: https://gist.github.com/chrisopedia/8754917

Ich mag '\e[1;93m', das ist hochintensiv gelb. Es sieht aus wie das:Geben Sie hier die Bildbeschreibung ein

okovko
quelle
0

Verwenden Sie einfach vim und diese vimrc-Datei .

Einzeiler:

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 kann auch eine Alternative sein.

eadmaster
quelle
0

Platzieren Sie in Ihrem ~ / .bashrc

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

dann

ccat filename

Whalebrew erstellt Aliase für Docker-Images, sodass Sie sie ausführen können, als wären sie native Befehle. Es ist wie bei Homebrew, aber mit Docker-Bildern.

Javajon
quelle