Syntaxe surlignage / colorisation chat

202

Existe-t-il une méthode pour coloriser la sortie de cat , comme le grepfait.

Car grep, dans la plupart des consoles, il affiche une sortie colorée mettant en évidence les mots clés recherchés. Sinon, vous pouvez le forcer en appelantgrep --color Y a t-il un moyen générique de colorer la sortie de n'importe quel programme selon votre choix personnel.

D'après ce que je comprends, le programme lui-même n'est pas responsable des couleurs. C'est la coquille.

J'utilise le shell par défaut dans FreeBSD 5.2.1 qui semble n'avoir jamais vu de couleurs depuis l'époque.

Lelouch Lamperouge
la source
Je ne comprends pas ce que vous essayez de dire
Lelouch Lamperouge
Oh non. Je ne veux pas afficher de binaire. Je veux juste afficher la sortie d'un binaire de manière colorisée.
Lelouch Lamperouge
6
meh - TPTA (vous pouvez toujours modifier vos propres questions)
sehe
J'ai édité pour éviter la confusion concernant le terme "binaire"
Volker Siegel
3
Je pense que la réponse de @buergi correspond à la question, et cela est également soutenu par le nombre de votes positifs qu'il a. Pensez à changer la réponse acceptée.
Ioannis Filippidis

Réponses:

22

catavec la coloration syntaxique est tout simplement hors de portée. catn'est pas fait pour ça. Si vous voulez simplement que le contenu entier d'un fichier soit coloré d'une certaine manière (avec la même couleur pour tout le fichier), vous pouvez utiliser des séquences d'échappement de terminal pour contrôler la couleur.

Voici un exemple de script qui choisira la couleur en fonction du type de fichier (vous pouvez utiliser quelque chose comme ça au lieu d'invoquer catdirectement):

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

Ce qui précède (sur un terminal qui prend en charge ces séquences d'échappement) imprimera tout fichier texte en gras et imprimera tout fichier binaire en rouge. Vous pouvez utiliser stringsau lieu de catpour imprimer des fichiers binaires et vous pouvez améliorer la logique pour l'adapter à vos besoins.

Costi Ciudatu
la source
Je pensais à quelque chose comme ça. Mais j'ai besoin de quelque chose qui le ferait universellement. Pas seulement cat/ grep/any particular program
Lelouch Lamperouge
Ensuite, vous pouvez simplement passer la commande à exécuter comme argument au script et remplacer l' catinvocation codée en dur par une $cmdqui est initialisée comme $ 1 s'il y a deux arguments ou par défaut s'il n'y en a qu'un. Ensuite , vous écrivez simplement: colorful.sh grep file.
Costi Ciudatu
8
"le chat n'est pas fait pour ça." Cat n'est pas non plus destiné à écrire des fichiers individuels sur stdout - c'est pour la concaténation. Mais cela ne signifie toujours pas que l'écriture de fichiers individuels sur stdout n'est pas utile. Cela ne signifie pas que les mettre en évidence n'est pas utile.
mikemaccana
J'ai essayé, sous cygwin pygmentizene peut pas colorer. Des conseils?
truthadjustr
410

Je recommanderais pygmentizedu paquet python python-pygments. Vous pouvez définir l'alias pratique suivante (sauf si vous utilisez ccatdu package ccrypt).

alias ccat='pygmentize -g'

Syntax highlighted cat output using pygmentize

Et si vous voulez des numéros de ligne:

alias ccat='pygmentize -g -O style=colorful,linenos=1'
buergi
la source
22
Une autre solution consiste à utiliser la highlightcommande linux . alias ccat='highlight -O ansi'
Evan Purkhiser
99
Cela devrait être la réponse acceptée à mon humble avis. Ajoutant à cela, je l'ai aliasé alias dog='pygmentize -g', car les chiens sont plus frais que les chats!
polym
8
Vous pouvez ajouter moins -R pour faire défiler le code:#!/bin/bash \n pygmentize -g $1 | less -R
Fabricio PH
6
J'ai appelé mon alias nyancat.
zneak
2
pygmentize fonctionne comme prévu, mais semble malheureusement assez lent. : - /
Frerich Raabe
113

Options:

pygmentize est bon. J'ai un alias:

alias c='pygmentize -g'

mais le point culminant est une autre alternative largement disponible est

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

Installation:

Vous devrez peut-être installer en pygmentsutilisant:

sudo pip install pygments
sudo easy_install Pygments #for Mac user

et pour le highlightpackage qui est facilement disponible sur toutes les distributions

sudo apt-get install highlight
sudo yum install highlight

En action:

Je joins des photos pour les deux ci-dessous pour une bonne comparaison des surbrillances

Voici pygmentizeen action: Pygmentize la mise en évidence sur un fichier python

et c'est highlight: Mettre en surbrillance la mise en évidence sur un fichier python

Shubham Chaudhary
la source
4
highlighta très bien fonctionné pour mes besoins et installé facilement, merci. Si vous voulez regarder des fichiers sans extensions (par exemple .bash_aliases), ajoutez --syntax=bashen plus pour -O ansile forcer.
jerclarke
1
# pip install Pygments # echo "alias catc = 'pygmentize -g'" >> "~ / .bashrc" # close terminal # open terminal # catc test.js --- and perfect works :-) 😊
BG Bruno
3
highlightest 34 fois plus rapide que ce programme python. La puissance des langues classiques est forte.
Avindra Goolcharan
2
Pour highlight, vous souhaitez ajouter --forceà l'alias, sinon cela générera une erreur pour les formats de fichier qu'il ne comprend pas, tandis qu'en catremplacement, vous voulez qu'il affiche toujours la sortie sans surligner, ce qui est le --forcecas. Tous ensemble:alias cat="highlight -O ansi --force"
Alexander Klimetschek
1
@Luke c'est pourquoi vous devriez ajouter que -O ansila valeur par défaut est d'afficher html :-)
Thomas
59

A partir de fin avril 2018:

Bat - Un clone cat (1) avec coloration syntaxique et intégration Git.

Le projet est un clone de chat avec prise en charge des couleurs et des personnalisations écrites en rouille. Il offre non seulement la mise en évidence de la syntaxe avec plusieurs thèmes, mais également l'intégration de Git. Comme décrit dans la documentation:

bat essaie d'atteindre les objectifs suivants :

  • Fournit une belle coloration syntaxique avancée
  • Intégration avec Git pour afficher les modifications de fichiers
  • Soyez un remplaçant pour le chat (POSIX)
  • Offrir une interface de ligne de commande conviviale

Il va sans dire que c'est beaucoup plus rapide que pygmentize et ne s'étouffe pas lorsqu'il est confronté à de gros fichiers.

Le code source et les versions binaires + les instructions d'installation peuvent être trouvés dans le référentiel Github, ainsi qu'une comparaison avec d'autres programmes .

dangom
la source
5
Ce que les gens oublient de mentionner, c'est que batreste en mode interactif par défaut. Pour qu'il se comporte davantage cat, utilisez-le avec -ppargument. Un alias comme alias cat="bat -pp"est probablement ce que les gens recherchent.
Canella
1
J'utilisais pygmentize pour coloriser cat auparavant, mais la solution avec bat est bien mieux adaptée aux fichiers volumineux (journaux de plusieurs Mo), où les performances de pygmentize sont inférieures.
Christian.D
35

vimcat est un fichier unique (script shell) et fonctionne bien:

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

La dernière mise à jour date de décembre 2013. Astuce: vous pouvez forcer la reconnaissance du type de fichier par vimcat -c "set ft=<type>".

Sergener
la source
12
Une chose qui est vraiment agréable à propos de vimcat (ou vimpager) est qu'il respectera le schéma de couleurs que vous avez défini dans votre ~/.vimrcmise en évidence de syntaxe sera donc la même lorsque vous souhaitez éditer (vim) ou imprimer (vimcat). Notez qu'une version mise à jour de vimcat peut être trouvée dans le référentiel vimpager .
timss
La réponse d'Amaynut est plus ancienne et similaire
olibre
vimpagern'utilise pas mon schéma de couleurs vim.
WhyNotHugo
2
Dans mon test non scientifique rapide, vimcat (1 ~ 2 secondes d'exécution) est beaucoup plus lent que pymentize(~ 200 highlightms), ce qui est beaucoup plus lent que (~ 20 ms), ce qui est beaucoup plus lent que cat(~ 2 ms). D'autre part, vimcatpoignées plusieurs types de fichiers et est plus précis que hightlightet pygmentize, et il est encore plus rapide que la première vimalors :q. Cela mérite donc mon choix pour cette tâche spécifique.
Penghe Geng
1
@olibre Cette réponse semble plus ancienne que celle d'Amaynut.
Franklin Yu
31

L'outil que vous recherchez est probablement supercat (voici une introduction rapide publiée par Linux Journal).

Je me rends compte que cette réponse est en retard et qu'elle ne répond pas pleinement aux exigences du PO. Je l'ajoute donc juste pour référence (cela pourrait être utile pour d'autres personnes cherchant à coloriser la sortie d'un fichier texte).

mfriedman
la source
1
Cela ne semble pas fonctionner si facilement, je l'ai installé et utilisé l'exemple de configuration, mais cela n'a eu aucun effet de couleur
rubo77
Bien, tout le reste est trop lent. C'est bon. Pour obtenir de l'aide sur la configuration, consultez manpages.debian.org/testing/supercat/spc.1.fr.html
okovko
De plus pour certaines configurations pour différentes langues: github.com/tanderson92/supercat/tree/master/spcrc
okovko
20

Il existe une version colorisée de chat - ccat . Obtenez-le sur https://github.com/jingweno/ccat/ .

Installation sous Linux / Windows / macOS

Il s'agit d'un seul exécutable autonome.Pour l'installer, vous pouvez décompresser la version binaire pour votre système d'exploitation à partir de https://github.com/jingweno/ccat/releases et copier le binaire ccat par exemple dans/usr/local/bin .

Si vous voulez éviter les binaires, ou s'il n'y a pas de binaire pour votre plate-forme (par exemple, raspberry pi, etc.), vous pouvez alternativement compiler à partir de la source étant donné que vous avez un goenvironnement de développement fonctionnel ( apt install golangsur les linux basés sur Debian ou brew install golangsur mac):

go get -u github.com/jingweno/ccat

Le ccatbinaire sera créé sous votre $GOPATH/bin.

Installation sur Mac via homebrew

brew install ccat

Alias ​​à cat

Pour remplacer régulier catpar un ccatcomplément ~/.bashrc:

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

ccatest implémenté dans Go , c'est donc un binaire natif qui s'exécute beaucoup plus rapidement que les solutions basées sur Python, comme les pygments , le module derrière pygmentize; Je n'ai vu aucune différence de vitesse notable entre catet ccat.

ccpizza
la source
1
Quel est le nom correct du référentiel? apt-get ccat dans Ubuntu 16 me donne une sorte de programme de cryptage et maquille quelque peu hilarante mon terminal car il essaie actuellement de crypter ou décrypter tout mon répertoire proc ...
Katastic Voyage
@KatasticVoyage: ma mauvaise: pour une raison quelconque, j'ai supposé que c'était dans les dépôts, et j'ai oublié comment je l'ai obtenu dans ma boîte Ubuntu. Voir la réponse mise à jour.
ccpizza
2
Actuellement, il semble que cela brew install ccatsuffise, plus besoin de le faire brew tap.
Jeff Huijsmans
12

La meilleure façon et la plus simple de le faire si vous avez vim dans votre machine est d'utiliser le vimcatlogiciel fourni vimpager.

  1. Installer vimpage avec git clone git://github.com/rkitover/vimpager cd vimpager sudo make install
  2. Exécutez vimcat:

    vimcat index.html

Amaynut
la source
J'adore l'idée, mais vimcat est parmi les plus lents ici. C'est à peu près aussi lent que pygmentize. 15x plus lent que highlightet 3x plus lent que batpour un script bash de 30 lignes sur ma machine.
Ponkadoodle
11

source-highlight

Peut-être qu'il est possible de trouver des versions intéressantes source-highlight sous GNU : un package différent de highlight.

Extrait de apt-cache show source-highlight:

Description-fr: convertit le code source en document en surbrillance syntaxique.
Ce programme, étant donné un fichier source, produit un document avec une coloration syntaxique.
Il prend en charge la coloration syntaxique pour plus de 100 formats de fichiers ...
Pour la sortie, les formats suivants sont pris en charge: HTML, XHTML, LaTeX, Texinfo, séquences d'échappement de couleur ANSI et DocBook

J'ai fait quelques alias (Cat et PCat, voir ci-dessous) et c'est leur sortie

Exemple d'écran

Vous pouvez installer sur Debian avec

sudo apt-get install source-highlight

et ajoutez-le comme alias par exemple dans votre .bash_aliasesavec quelque chose comme la ligne ci-dessous.

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

Ou vous pouvez faire un alias similaire (sans le -ià la fin pour avoir la possibilité de le canaliser )

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

Parmi les options qu'il est possible de lire à partir man source-highlightdes -ssoulignements, il est possible de sélectionner, ou de forcer , la mise en surbrillance par ligne de commande ou de laisser au programme ce devoir:

-s , --src-lang = STRING langue source (utilisez --lang-list pour obtenir la liste complète). S'il n'est pas spécifié, la langue source sera devinée à partir de l'extension de fichier .

--lang-list liste toute la langue prise en charge et le fichier de définition de langue associé

Hastur
la source
1
Si vous souhaitez également coloriser lessavec source-highlight, quelqu'un sur GitHub donne la réponse: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"et export LESS=" -R ". Très utile lorsqu'il pygmentizen'est pas disponible et ne peut pas être installé.
Lalylulelo
8

D'après ce que je comprends, le binaire lui-même n'est pas responsable des couleurs. C'est la coquille.

Ce n'est pas correct. Le terminal interprète simplement les codes de couleur qui sont envoyés au terminal. Selon sa capacité, il peut ignorer certains codes de formatage / coloriage.

Depuis la page de manuel, il ne semble pas que cat supporte la coloration de sa sortie. Même s'il devait prendre en charge la coloration comme grep, que devrait-il colorer dans le fichier texte? Syntaxe mettant en évidence la connaissance requise du langage sous-jacent qui n'est pas dans le cadre d'un simple utilitaire comme cat.

Vous pouvez essayer des éditeurs plus puissants comme vim, emacs, gedit, etc. sur la plate-forme unix si voir le code mis en évidence est votre objectif.

Ashwinee K Jha
la source
3
"Ce catn'est pas pour imprimer des fichiers avec des numéros de ligne, ce n'est pas pour compresser plusieurs lignes vides, ce n'est pas pour regarder des caractères ASCII non imprimables, c'est pour concaténer des fichiers." - à partir du style UNIX, ou cat -v considéré comme nocif .
Scott
7

Sur OSX, faites simplement brew install ccat.

https://github.com/jingweno/ccat . Comme chat mais affiche du contenu avec une coloration syntaxique. Construit en Go.

joost
la source
Agréable. A quelques limitations linguistiques, mais il se sent beaucoup plus rapidement que les pygments.
Gustavo Bezerra
ccat peut également être trouvé dans le référentiel AUR d'Arch Linux. Utilisez yaourt ou pacaur pour installer le package.
Marcs
6

bat fait exactement cela et peut être aliasé au chatalias cat='bat'

Sailendra Pinupolu
la source
3

Vieille question, juste répondre pour le compte rendu pour fournir la solution que j'ai finalement utilisée. C'est peut-être un peu hacky (probablement pas l'intention initiale du paramètre), mais:

alias cgrep = 'grep -C 9000'

chat que ce soit | cgrep 'snozzberries'

..grep -C N fournira N lignes de contexte au-dessus et au-dessous de l'élément trouvé. S'il est plus grand que l'entrée, l'entrée entière est incluse. Dans ce cas, nous nous assurons simplement qu'il est plus grand que n'importe quelle sortie de terminal typique que nous voudrons examiner manuellement, ce qui est généralement ce que vous cherchez à faire si vous le mettez en surbrillance.

EDIT: Cependant, cette solution suggérée ci-dessous par Beni Cherniavsky-Paskin est supérieure - elle correspond (et met en évidence) soit le mot que vous recherchez, soit le début de la ligne (non surlignable). Le résultat net est exactement ce que vous voulez.

cat whatever | egrep 'snozzberries|$'

C'est la nouvelle meilleure solution que j'ai vue pour ce problème, merci Beni.

Mr. B
la source
2
Un moyen plus robuste pour mettre en évidence un motif tout en incluant toutes les lignes estegrep 'snozzberries|$'
Beni Cherniavsky-Paskin
1

J'ai écrit le petit script pour effectuer la colorisation en utilisant 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
}

Et puis créez un alias pour le script. alias cat=colorize_via_pygmentize. N'oubliez pas non plus de l'enregistrer dans ~ / .bashrc .

Rohit Sehgal
la source
0

Si vous voulez juste qu'une doublure règle la catsortie sur une couleur donnée, vous pouvez ajouter

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

à ton ~/.$(basename $SHELL)rc

Voici un résumé avec des codes de couleur: https://gist.github.com/chrisopedia/8754917

J'aime '\e[1;93m', qui est un jaune de haute intensité. Cela ressemble à ceci:entrez la description de l'image ici

okovko
la source
0

utilisez simplement vim et ce fichier vimrc .

bon mot:

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 peut également être une alternative.

eadmaster
la source
0

Placez-le dans votre ~ / .bashrc

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

puis

ccat filename

Whalebrew crée des alias pour les images Docker afin que vous puissiez les exécuter comme s'il s'agissait de commandes natives. C'est comme Homebrew, mais avec des images Docker.

javajon
la source