web-dev-qa-db-fra.com

Obtenez des couleurs en moins ou plus

Lorsque je lis un fichier sous Linux avec la commande less ou more, comment puis-je obtenir le contenu en couleurs?

395
Open the way

Vous pouvez utiliser la puissance de pygmentize avec moins - automatiquement! (Pas besoin de pipe à la main.)

Installez pygments avec votre gestionnaire de paquets ou votre pip (éventuellement appelé python-pygments) ou obtenez-le ici http://pygments.org/download/ .

Écrire un fichier ~/.lessfilter

#!/bin/sh
case "$1" in
    *.awk|*.groff|*.Java|*.js|*.m4|*.php|*.pl|*.pm|*.pod|*.sh|\
    *.ad[asb]|*.asm|*.inc|*.[ch]|*.[ch]pp|*.[ch]xx|*.cc|*.hh|\
    *.lsp|*.l|*.pas|*.p|*.xml|*.xps|*.xsl|*.axp|*.ppd|*.pov|\
    *.diff|*.patch|*.py|*.rb|*.sql|*.ebuild|*.eclass)
        pygmentize -f 256 "$1";;

    .bashrc|.bash_aliases|.bash_environment)
        pygmentize -f 256 -l sh "$1";;

    *)
        if grep -q "#\!/bin/bash" "$1" 2> /dev/null; then
            pygmentize -f 256 -l sh "$1"
        else
            exit 1
        fi
esac

exit 0

Dans votre .bashrc ajouter

export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'

En outre, vous devez rendre ~/.lessfilter exécutable en exécutant

chmod u+x ~/.lessfilter

Testé sur Debian.

Vous avez eu l'idée. Cela peut bien entendu être encore amélioré, en acceptant plus d'extensions ou en analysant Shebang pour d'autres interprètes que bash. Voir certaines des autres réponses pour cela.

L'idée est venue d'un ancien billet de blog des décideurs de Pygments , mais le message original n'existe plus.

145
Dario Seidl

Essayez ce qui suit:

less -R

à partir de man less:

-r ou --raw-control-chars

Provoque l'affichage de caractères de contrôle "bruts". (...)

-R ou --RAW-CONTROL-CHARS

Comme -r, mais seules les séquences d'échappement "couleur" ANSI sont générées sous forme "brute". (...)

476
ChristopheD

J'ai eu la réponse dans un autre post: Less et Grep: Obtenir des résultats colorés lors de l'utilisation d'un tuyau de grep à less

Lorsque vous exécutez simplement grep --color, cela implique grep --color=auto qui détecte si la sortie est un terminal et, le cas échéant, active les couleurs. Cependant, lorsqu'il détecte un tuyau, il désactive la coloration. La commande suivante:

grep --color=always "search string" * | less -R

Permettra toujours d'activer la coloration et d'ignorer la détection automatique, et la coloration en surbrillance sera réduite.

Attention: Ne mettez pas --color=always comme alias, cela casse parfois. C'est pourquoi il existe une option --color=auto.

130
Puneet

Utilisez view au lieu de less. Il ouvre le fichier avec vim en mode lecture seule.

C'est pratiquement un nom de couleur less: un pager dans lequel vous pouvez rechercher / (et plus). Le seul inconvénient est que vous ne pouvez pas sortir avec q mais vous avez besoin de :q

En outre, vous obtenez la même couleur que vim (puisque vous utilisez en fait vim).

35
Riccardo Galli

pygmentize supporte l’option -g pour deviner automatiquement le lexer à utiliser, ce qui est utile pour les fichiers lus à partir de STDIN sans vérification du type d’extension.

Avec cela, il vous suffit de définir les 2 exportations suivantes dans votre .bashrc sans script supplémentaire:

export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
14
Tuxdude

Pour en dire moins pour afficher les couleurs, appelez-le avec -R:

less -R

Malheureusement, certains programmes détectent que leur stdout n'est pas un terminal et désactivent les couleurs, par exemple pacman (gestionnaire de paquets Arch Linux).

Dans ces cas, il est possible d'utiliser unbuffer:

unbuffer <command> | less -R

Exemple d'utilisation de pacman

unbuffer pacman -Ss firefox | less -R

La commande unbuffer fait généralement partie du paquetage expect (Arch Linux, Debian/Ubuntu) ou expect-dev (versions héritées de Debian/Ubuntu).

Pour répondre à la question de manière complète:

Comme d'autres l'ont déjà répondu, pygmentize est idéal pour coloriser le code source. Il ne nécessite pas unbuffer. Appel le plus facile:

pygmentize someSource.cpp | less -R
14
jbbr

Vous n'avez pas dit ce que cette couleur devrait signifier, par exemple quelles devraient être les couleurs d'un fichier texte?

Si ce que vous voulez est la coloration syntaxique du code source, vous avez besoin d’un surligneur de code source. J'utilise parfois pygmentize comme ça

pygmentize file.cpp | less

ou

pygmentize file.cpp | more

Il y a d'autres surligneurs autour.

C'est assez rapide. Si cela ne vous dérange pas d'activer vim, il existe un mode en lecture seule qui peut vous mettre en évidence la syntaxe si vous l'avez dans vim.

view file.cpp

ou bien voir la réponse de churnd.

9
Benjamin Bannier

Ceci est encore une autre réponse basée sur pygments -, avec plusieurs améliorations majeures:

  • ne casse pas les filtres lesspipe ou lessfile
  • fonctionne avec plusieurs entrées à less
  • analyse correctement le type de script depuis l'en-tête Shebang
  • fonctionne pour tous les types de fichiers 434 lexable de Pygments
  • l'arrangement de couleur est paramétré comme variable d'environnement

Installez Pygments et Gawk

Sudo apt-get install python-pygments python3-pygments gawk

Définir les variables d'environnement

Vérifiez si lesspipe ou lessfile est déjà activé:

echo $LESSOPEN

Si vous ne voyez aucun programme référencé ici, assurez-vous que lesspipe est installé (la plupart des distributions sont fournies avec).

Ajoutez ce qui suit à ~/.bashrc:

# sets LESSOPEN and LESSCLOSE variables
eval "$(Shell=/bin/sh lesspipe)"

# interpret color characters
export LESS='-R'

# to list available styles: `pygmentize -L styles`
export PYGMENTIZE_STYLE='paraiso-dark'

# optional
alias ls='ls --color=always'
alias grep='grep --color=always'

Si vous ne voulez pas lesspipe, remplacez la déclaration eval par:

export LESSOPEN='|~/.lessfilter %s'

Créer ~/.lessfilter

Ajoutez le code suivant et rendez le fichier exécutable: chmod u+x ~/.lessfilter

#!/bin/bash
for path in "$@"; do
    # match by known filenames
    filename=$(basename "$path")
    case "$filename" in
        .bashrc|bash.bashrc|.bash_aliases|.bash_environment|.bash_profile|\
        .bash_login|.bash_logout|.profile|.zshrc|.zprofile|.zshrc|.zlogin|\
        .zlogout|zshrc|zprofile|zshrc|zlogin|zlogout|.cshrc|.cshdirs|\
        csh.cshrc|csh.login|csh.logout|.tcshrc|.kshrc|ksh.kshrc)
            # Shell lexer
            pygmentize -f 256 -O style=$PYGMENTIZE_STYLE -l sh "$path"
            ;;
        .htaccess|Apache.conf|Apache2.conf|Dockerfile|Kconfig|external.in*|\
        standard-modules.in|nginx.conf|pacman.conf|squid.conf|termcap|\
        termcap.src|terminfo|terminfo.src|control|sources.list|CMakeLists.txt|\
        Makefile|makefile|Makefile.*|GNUmakefile|SConstruct|SConscript|\
        .Rhistory|.Rprofile|.Renviron|Rakefile|Gemfile|PKGBUILD|autohandler|\
        dhandler|autodelegate|.vimrc|.exrc|.gvimrc|vimrc|exrc|gvimrc|todo.txt)
            # filename recognized
            pygmentize -f 256 -O style=$PYGMENTIZE_STYLE "$path"
            ;;
        *)
            ext=$([[ "$filename" = *.* ]] && echo ".${filename##*.}" || echo '')
            case "$ext" in
                .as|.mxml|.bc|.g|.Gd|.gi|.gap|.nb|.cdf|.nbp|.ma|.mu|.at|.run|\
                .apl|.adl|.adls|.adlf|.adlx|.cadl|.odin|.c-objdump|.s|\
                .cpp-objdump|.c++-objdump|.cxx-objdump|.d-objdump|.S|.hsail|\
                .ll|.asm|.ASM|.objdump-intel|.objdump|.tasm|.au3|.ahk|.ahkl|\
                .bb|.decls|.bmx|.bas|.monkey|.BAS|.bst|.bib|.abap|.ABAP|.cbl|\
                .CBL|.cob|.COB|.cpy|.CPY|.gdc|.maql|.p|.cls|.c|.h|.idc|.cpp|\
                .hpp|.c++|.h++|.cc|.hh|.cxx|.hxx|.C|.H|.cp|.CPP|.ino|.clay|\
                .cu|.cuh|.ec|.eh|.mq4|.mq5|.mqh|.nc|.pike|.pmod|.swg|.i|.vala|\
                .vapi|.capnp|.chpl|.icl|.dcl|.cf|.docker|.ini|.cfg|.inf|\
                .pc|.properties|.reg|.tf|.pypylog|.cr|.csd|.orc|.sco|.css|\
                .less|.sass|.scss|.croc|.d|.di|.smali|.jsonld|.json|.yaml|\
                .yml|.dpatch|.darcspatch|.diff|.patch|.wdiff|.boo|.aspx|.asax|\
                .ascx|.ashx|.asmx|.axd|.cs|.fs|.fsi|.n|.vb|.als|.bro|.crmsh|\
                .pcmk|.msc|.pan|.proto|.pp|.rsl|.sbl|.thrift|.rpf|\
                .dylan-console|.dylan|.dyl|.intr|.lid|.hdp|.ecl|.e|.Elm|.ex|\
                .exs|.erl|.hrl|.es|.escript|.erl-sh|.aheui|.befunge|.bf|.b|\
                .camkes|.idl4|.cdl|.cw|.factor|.fan|.flx|.flxh|.frt|.f|.F|\
                .f03|.f90|.F03|.F90|.PRG|.prg|.go|.abnf|.bnf|.jsgf|.cyp|\
                .cypher|.asy|.vert|.frag|.geo|.plot|.plt|.ps|.eps|.pov|.inc|\
                .agda|.cry|.hs|.idr|.kk|.kki|.lagda|.lcry|.lhs|.lidr|.hx|\
                .hxsl|.hxml|.sv|.svh|.v|.vhdl|.vhd|.dtd|.haml|.html|.htm|\
                .xhtml|.xslt|.pug|.jade|.scaml|.xml|.xsl|.rss|.xsd|.wsdl|\
                .wsf|.xpl|.pro|.ipf|.nsi|.nsh|.spec|.i6t|.ni|.i7x|.t|.io|\
                .ijs|.coffee|.Dart|.eg|.js|.jsm|.juttle|.kal|.lasso|\
                .lasso[89]|.ls|.mask|.j|.ts|.tsx|.jl|.aj|.ceylon|.clj|\
                .cljs|.golo|.gs|.gsx|.gsp|.vark|.gst|.groovy|.gradle|.ik|\
                .Java|.kt|.pig|.scala|.xtend|.cpsa|.cl|.LISP|.el|.hy|.lsp|.nl|\
                .kif|.rkt|.rktd|.rktl|.scm|.ss|.shen|.xtm|.cmake|.mak|.mk|\
                .[1234567]|.man|.md|.css.in|.js.in|.xul.in|.rst|.rest|.tex|\
                .aux|.toc|.m|.sci|.sce|.tst|.ml|.mli|.mll|.mly|.opa|.sml|.sig|\
                .fun|.bug|.jag|.mo|.stan|.def|.mod|.mt|.ncl|.nim|.nimrod|.nit|\
                .nix|.cps|.x|.xi|.xm|.xmi|.mm|.Swift|.ooc|.psi|.psl|.G|.ebnf|\
                .rl|.treetop|.tt|.adb|.ads|.ada|.pas|.dpr|.pwn|.sp|.pl|.pm|\
                .nqp|.p6|.6pl|.p6l|.pl6|.6pm|.p6m|.pm6|.php|.php[345]|.zep|\
                .praat|.proc|.psc|.lgt|.logtalk|.prolog|.pyx|.pxd|.pxi|.dg|\
                .py3tb|.py|.pyw|.sc|.tac|.sage|.pytb|.qvto|.Rout|.Rd|.R|.rq|\
                .sparql|.ttl|.r|.r3|.reb|.red|.reds|.txt|.rnc|.graph|\
                .instances|.robot|.fy|.fancypack|.rb|.rbw|.rake|.gemspec|\
                .rbx|.duby|.rs|.rs.in|.SAS|.sas|.applescript|.chai|.ezt|\
                .mac|.hyb|.jcl|.lsl|.lua|.wlua|.moo|.moon|.rexx|.rex|.rx|\
                .arexx|.sh|.ksh|.bash|.ebuild|.eclass|.exheres-0|.exlib|.zsh|\
                .sh-session|.Shell-session|.bat|.cmd|.fish|.load|.ps1|.psm1|\
                .tcsh|.csh|.ns2|.st|.smv|.snobol|.rql|.sql|.sqlite3-console|\
                .do|.ado|.scd|.tcl|.rvt|.ng2|.tmpl|.spt|.cfc|.cfm|.cfml|\
                .evoque|.kid|.handlebars|.hbs|.phtml|.jsp|.liquid|.mao|.mhtml|\
                .mc|.mi|.myt|.rhtml|.tpl|.ssp|.tea|.twig|.vm|.fhtml|.sls|\
                .feature|.tap|.awk|.vim|.pot|.po|.weechatlog|.todotxt|.thy|\
                .lean|.rts|.u|.vcl|.bpl|.sil|.vpr|.cirru|.duel|.jbst|.qml|\
                .qbs|.slim|.xqy|.xquery|.xq|.xql|.xqm|.whiley|.x10)
                    # extension recognized
                    pygmentize -f 256 -O style=$PYGMENTIZE_STYLE "$path"
                    ;;
                *)
                    # parse the Shebang script header if it exists
                    lexer=$(head -n 1 "$path" |grep "^#\!" |awk -F" " \
'match($1, /\/(\w*)$/, a) {if (a[1]!="env") {print a[1]} else {print $2}}')
                    case "$lexer" in
                        node|nodejs)
                            # workaround for lack of Node.js lexer alias
                            pygmentize -f 256 -O style=$PYGMENTIZE_STYLE \
                                -l js "$path"
                            ;;
                        "")
                            exit 1
                            ;;
                        *)
                            pygmentize -f 256 -O style=$PYGMENTIZE_STYLE \
                                -l $lexer "$path"
                            ;;
                    esac
                    ;;
            esac
            ;;
    esac
done
exit 0
5
Joe Coder

Utilisez le GNU Source-sélection ; vous pouvez l'installer avec apt si vous l'avez, ou l'installer autrement à partir des sources. Ensuite, configurez un "préprocesseur d'entrée" pour moins, avec l'aide des documentations Source-highligh 'pour configurer avec moins :

Cela a été suggéré par Konstantine Serebriany. Le script src-hilite-lesspipe.sh sera installé avec source-highlight. Vous pouvez utiliser les variables d'environnement suivantes:

 export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
 export LESS=' -R '

De cette façon, lorsque vous utilisez moins pour parcourir un fichier, s’il s’agit d’un fichier source géré par la source en surbrillance, il est automatiquement mis en surbrillance.

Xavier-Emmanuel Vincent a récemment fourni une version alternative du jeu de couleurs ANSI, esc256.style: certains terminaux peuvent gérer 256 couleurs. Xavier a également fourni un script qui vérifie le nombre de couleurs que votre terminal peut gérer et utilise le cas échéant la variante 256. Le script s'appelle source-highlight-esc.sh et sera installé avec les autres fichiers binaires.

3
arsaKasra

Pour développer une autre réponse, vous pouvez le faire fonctionner pour la plupart, sinon tous, vos scripts qui n'ont pas d'extensions en modifiant légèrement le fichier .lessfilter:

#!/bin/sh
    case "$1" in
    *.awk|*.groff|*.Java|*.js|*.m4|*.php|*.pl|*.pm|*.pod|*.sh|\
    *.ad[asb]|*.asm|*.inc|*.[ch]|*.[ch]pp|*.[ch]xx|*.cc|*.hh|\
    *.lsp|*.l|*.pas|*.p|*.xml|*.xps|*.xsl|*.axp|*.ppd|*.pov|\
    *.diff|*.patch|*.py|*.rb|*.sql|*.ebuild|*.eclass)
        pygmentize -f 256 "$1";;
    .bashrc|.bash_aliases|.bash_environment)
        pygmentize -f 256 -l sh "$1"
        ;;
    *)
        scriptExec=$(head -1 "$1" |grep "^#\!" |awk -F" " '{print $1}')
        scriptExecStatus=$?
        if [ "$scriptExecStatus" -eq "0" ]; then
            lexer=$(echo $scriptExec |awk -F/ '{print $NF}')
            pygmentize -f 256 -l $lexer "$1"
        else
            exit 1
        fi
esac

exit 0

Vous devez toujours ajouter les deux variables à .bashrc:

export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'

Et vous aurez toujours besoin de rendre .lessfilter exécutable:

$ chmod 700 ~/.lessfilter

De plus, je voulais ajouter que, sous debian, le paquet pygments s’appelle python-pygments. J'ai eu du mal à le localiser au début parce que l'orthographe évidente de "pigments" en tant que "pygments" ne me laissait pas croire qu'il s'agissait d'un paquet pouvant être préfixé par "python" par le gestionnaire de paquets.

3
Speeddymon

Vous pouvez envisager d'utiliser l'utilitaire most, qui est une alternative conviviale pour les couleurs less et more.

2
Onlyjob

Extrait de mon billet de blog complet sur l'amélioration de l'expérience: https://www.topbug.net/blog/2016/09/27/make-gnu-less-more-powerful/

Pour les pages de manuel colorées, ajoutez ce qui suit à votre .bashrc ou .zshrc:

export LESS_TERMCAP_mb=$'\E[1;31m'     # begin bold
export LESS_TERMCAP_md=$'\E[1;36m'     # begin blink
export LESS_TERMCAP_me=$'\E[0m'        # reset bold/blink
export LESS_TERMCAP_so=$'\E[01;44;33m' # begin reverse video
export LESS_TERMCAP_se=$'\E[0m'        # reset reverse video
export LESS_TERMCAP_us=$'\E[1;32m'     # begin underline
export LESS_TERMCAP_ue=$'\E[0m'        # reset underline

Pour la coloration syntaxique, utilisez un lesspipe.sh puissant existant pour le manipuler au lieu d'écrire le vôtre: https://github.com/wofr06/lesspipe

1
xuhdev

J'ai trouvé cette solution simple et élégante. Vous n'avez pas à installer quoi que ce soit de plus car il est déjà présent par défaut sur la plupart des machines. Comme vim est installé par défaut sur la plupart des machines, il inclut une macro permettant d'exécuter vim comme less.

Certaines des options pour l'utiliser consistent à créer un alias: alias vless='vim -u /usr/share/vim/vim74/macros/less.vim'

ou créez un lien symbolique: ln -s /usr/share/vim/vim74/macros/less.sh ~/bin/vless

Ensuite, vous lancez simplement vless myfile.py

J'ai eu la plupart des informations ici

0
Wavesailor

La solution la plus intuitive et la plus simple pour moi consistait à utiliser pygmentize
en ajoutant les lignes ci-dessous à .bashrc

export LESS='-R'
export LESSOPEN='|pygmentize -g %s'

Si vous ne pouvez pas appeler pygmentize, installez simplement

pip install pygments

ps. Le binaire exécutable pygmentize serait placé dans /usr/local/bin/ ou dans votre /home/username/.virtualenv/venvname/bin/ ou quelque part.

0
David Jung