Lorsque je lis un fichier sous Linux avec la commande less
ou more
, comment puis-je obtenir le contenu en couleurs?
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.
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". (...)
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 impliquegrep --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
.
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
).
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'
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
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.
Ceci est encore une autre réponse basée sur pygments -, avec plusieurs améliorations majeures:
lesspipe
ou lessfile
less
Sudo apt-get install python-pygments python3-pygments gawk
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'
~/.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
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.
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.
Vous pouvez envisager d'utiliser l'utilitaire most
, qui est une alternative conviviale pour les couleurs less
et more
.
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
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
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.