Quand je lis un fichier sous Linux avec la commande less
o more
comment puis-je obtenir le contenu en couleurs ?
Réponses
Trop de publicités?pygmentize
soutient le -g
pour deviner automatiquement le lexer à utiliser, ce qui est utile pour les fichiers lus à partir de STDIN
sans vérifier aucun type d'extension.
En utilisant cela, vous n'avez qu'à définir les 2 exportations suivantes dans votre fichier .bashrc
sans aucun scripts supplémentaire :
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
Vous n'avez pas dit ce que cette couleur doit signifier, par exemple, quelles doivent être les couleurs pour un fichier texte ?
Si ce que vous voulez, c'est une coloration syntaxique du code source, il vous faut un surligneur de code source. J'utilise parfois pygmatiser comme ceci
pygmentize file.cpp | less
oder
pygmentize file.cpp | more
Il existe d'autres surligneurs.
C'est assez rapide. Si ça ne vous dérange pas d'allumer vim
il existe un mode de lecture seule qui peut vous donner la coloration syntaxique si vous l'avez en vim
.
view file.cpp
ou alternativement voir la réponse de churnd.
C'est encore une autre pygmes -avec plusieurs améliorations majeures :
- ne se brise pas
lesspipe
olessfile
filtres - travaille avec des entrées multiples pour
less
- analyse correctement le type script de l'en-tête shebang
- fonctionne pour tous les 434 types de fichiers lisibles par Pygments
- La palette de couleurs est paramétrée comme une variable d'environnement
EDIT : Je maintiens une version mise à jour/améliorée de ce script ici : https://github.com/CoeJoder/lessfilter-pygmentize
Version originale ci-dessous :
Installer Pygments et Gawk
sudo apt-get install python-pygments python3-pygments gawk
Définir les variables d'environnement
Vérifiez si lesspipe
o lessfile
est déjà activé :
echo $LESSOPEN
Si vous ne voyez aucun des deux programmes référencés ici, assurez-vous que lesspipe
est installé (la plupart des distros sont livrées 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 le eval
déclaration avec :
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
Utilisez le GNU Source-highlight ; vous pouvez l'installer avec apt
si vous l'avez, ou sinon installez-le depuis les sources. Ensuite, configurez un "préprocesseur d'entrée" pour less, en vous aidant des documentations de Source-highligh' pour s'installer avec moins :
Cette idée a été suggérée par Konstantine Serebriany. Le script src-hilite-lesspipe.sh sera installé en même temps que source-highlight. Vous pouvez utiliser les variables d'environnement suivantes :
export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
export LESS=' -R '
Ainsi, lorsque vous utilisez less pour parcourir un fichier, s'il s'agit d'un fichier source géré par source-highlight, il sera automatiquement mis en évidence.
Xavier-Emmanuel Vincent a récemment fourni une version alternative du schéma de couleurs ANSI, esc256.style : certains terminaux peuvent gérer 256 couleurs. Xavier a également fourni un script qui vérifie combien de couleurs votre terminal peut gérer, et au cas où, utilise la variante 256. Le script est appelé source-highlight-esc.sh et il sera installé avec les autres binaires.
Condensé de l'article complet de mon blog sur l'amélioration de l'expérience des mineurs : https://www.topbug.net/blog/2016/09/27/make-gnu-less-more-powerful/
Pour des pages de manuel colorées, ajoutez ce qui suit à votre fichier .bashrc
o .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 mise en évidence de la syntaxe, l'utilisation d'une puissante lesspipe.sh
pour le gérer au lieu d'écrire le vôtre : https://github.com/wofr06/lesspipe
6 votes
Cela semble lié : superuser.com/questions/36022/less-et-grep-color - Est-ce que ça aide ?
10 votes
Le titre de cette question est très trompeur. De nombreuses personnes arrivant sur cette page s'attendent à trouver une solution au problème de coloration que vous rencontrez lorsque tuyauterie une commande avec une sortie colorée vers
less
: les couleurs sont perdues. (Les réponses à ce "problème de tuyauterie" impliquentless -R
,unbuffer
etc.) Mais la vraie question porte sur ouverture d'un fichier ! - L'ambiguïté réside principalement dans le titre de la question, mais même en dehors de cela, IMHO la question est encore trop large : "lire un fichier" pourrait se référer à tout (probablement du texte brut). (enfin, "obtenir le contenu en couleurs" fait probablement référence à la coloration syntaxique).0 votes
Je dois me corriger, seulement 3 (ou 4) des 14 réponses ne répondent pas à la question réelle du PO : les réponses de ChristopheD , Puneet y Onlyjob ; et peut-être jbbr . Pourtant, deux de ces réponses font partie des trois réponses les plus votées.
0 votes
@myrdd "syntax highlighting" est le terme pertinent alors... (Il s'agit d'afficher des couleurs, pas d'en ajouter ?)
less -R
fonctionnera également sur les fichiers, par ex.ls --color=always > /tmp/file && less -R /tmp/file
0 votes
@GertvandenBerg Je pense que le PO voulait dire " comment obtenir la coloration syntaxique dans
less
omore
lorsque le fichier ouvert ne contient PAS de codes d'échappement ". Mais je ne piense en il voulait dire ça, je ne le sais pas. - Au fait, je ne suis pas d'accord avec votre interprétation de la question. La question dit " Lorsque je lis un fichier [ ] "et par "fichier", je suis sûr que le PO voulait dire une typique un fichier en clair, ou un fichier "normal". Un fichier en clair "typique" (ou un fichier "normal") contient-il des caractères d'échappement, c'est-à-dire des couleurs ? Non. Donc, selon moi, la question est sur l'"ajout" de couleurs (ou de coloration syntaxique).2 votes
@myrdd Il serait peut-être plus logique que la question soit fermée en tant que "ce qui est demandé n'est pas clair" puisque les questions posant l'une ou l'autre de ces deux questions seraient probablement marquées comme des doublons de celle-ci... (Et les réponses à l'une ou l'autre de ces deux questions peuvent être rétrogradées en fonction de la façon dont le votant les interprète...) (Mon cas d'utilisation était un fichier journal qui (fâcheusement) contient des codes d'échappement de couleur).
0 votes
@GertvandenBerg Je suis d'accord. J'ai déjà voté pour la fermeture de la question.
0 votes
Il semble qu'il s'agisse d'un doublon de superuser.com/q/71588/105108 .