Al leer un archivo con &007 o &007, ¿cómo puedo obtener el contenido en colores?
Al leer un archivo en Linux con el comando less
o more
, ¿cómo puedo obtener el contenido en colores?
Al leer un archivo en Linux con el comando less
o more
, ¿cómo puedo obtener el contenido en colores?
Intente lo siguiente:
less -R
de man less
:
-r
o--raw-control-chars
Hace que se muestren los caracteres de control “crudos”. (…)
-R
o--RAW-CONTROL-CHARS
Como
-r
, pero sólo las secuencias de escape “color” ANSI son emitidas en forma “raw”. (…)
(actualización en 2020)
La manera más rápida sería usar less -R
ref. https://superuser.com/a/117842/34893
Puedes utilizar el poder de pigmentación con menos - ¡automáticamente! (No hay necesidad de pipetear a mano.)
Instale pygments
con su administrador de paquetes o pip (posiblemente llamado python-pygments
) o consígalo aquí http://pygments.org/download/ .
Escriba un archivo ~/.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
En su .bashrc
añada
export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'
Además, necesita hacer ejecutable el ~/.lessfilter
ejecutando
chmod u+x ~/.lessfilter
Probado en Debian.
Ya tiene la idea. Por supuesto, esto puede mejorarse aún más, aceptando más extensiones o analizando el shebang para otros intérpretes que el bash. Vea algunas de las otras respuestas para eso.
La idea vino de una vieja entrada en el blog de los creadores de Pygments, pero la entrada original ya no existe.
Recibí la respuesta en otro correo: Less y Grep: Obtener resultados de color cuando se utiliza un tubo de grep a menos
Cuando simplemente se ejecuta
grep --color
implicagrep --color=auto
que detecta si la salida es una terminal y si es así permite los colores. Sin embargo, cuando detecta un tubo, desactiva los colores. El siguiente comando:grep --color=always "search string" * | less -R
Siempre habilitará el coloreado y anulará la detección automática, y obtendrá el resaltado de color en menos.
Advertencia: No pongas --color=always
como un alias, a veces rompe cosas. Por eso hay una opción de --color=auto
.
Use view
en lugar de less
. Abre el archivo con vim
en modo de sólo lectura.
Es prácticamente un less
de color: un buscador donde puedes buscar con / (y más). El único inconveniente es que no puedes salir con q pero necesitas :q
Además, obtienes el mismo colorido que vim
(ya que de hecho estás usando vim
).
Para decir menos para mostrar los colores llámalo con -R:
less -R
Desafortunadamente algunos programas detectan que su stdout no es una terminal y desactivan los colores - por ejemplo pacman (Arch Linux package manager).
En esos casos es posible usar unbuffer
:
unbuffer <command> | less -R
Ejemplo usando pacman
unbuffer pacman -Ss firefox | less -R
El comando unbuffer
es usualmente parte del paquete expect
(Arch Linux, Debian/Ubuntu) o expect-dev
(versiones heredadas de Debian/Ubuntu).
Para responder a la pregunta para completar:
Como otros ya han respondido, pygmentize
es genial para colorear el código fuente. No requiere unbuffer
. La llamada más fácil:
pygmentize someSource.cpp | less -R
pygmentize
soporta la opción -g
para adivinar automáticamente el lexer a utilizar, lo cual es útil para los archivos leídos desde STDIN
sin comprobar ningún tipo de extensión.
Usando eso, sólo necesita configurar las siguientes 2 exportaciones en su .bashrc
sin ningún tipo de scripts adicionales:
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
No dijiste lo que este color debería significar, por ejemplo, ¿cuáles deberían ser los colores para un archivo de texto?
Si lo que quieres es un resaltador de sintaxis para el código fuente, necesitas un resaltador de código fuente. A veces uso pygmentize como este
pygmentize file.cpp | less
o
pygmentize file.cpp | more
Hay otros resaltadores alrededor.
Esto es bastante rápido. Si no te importa encender el vim
hay un modo de sólo lectura que puede darte un resaltado de sintaxis si lo tienes en vim
.
view file.cpp
o alternativamente ver la respuesta de Churnd.
Esta es otra respuesta basada en el Pygments (http://pygments.org/), con varias mejoras importantes:
lesspipe
o lessfile
less
sudo apt-get install python-pygments python3-pygments gawk
Comprobar si lesspipe
o lessfile
ya está activado:
echo $LESSOPEN
Si no ves ninguno de los programas referenciados allí, asegúrate de que lesspipe
está instalado (la mayoría de las distros vienen con él).
Añade lo siguiente al ~/.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 no quieres lesspipe
, sustituye la declaración de eval
por:
export LESSOPEN='|~/.lessfilter %s'
~/.lessfilter
Añade el siguiente código y haz el archivo ejecutable: 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
Usa el GNU Source-highlight ; puedes instalarlo con apt
si lo tienes, o de otra manera instalarlo desde la fuente. Entonces configura un “preprocesador de entrada” por menos, con la ayuda de las documentaciones de Source-highlight’ para configurar con menos:
Esto fue sugerido por Konstantine Serebriany. El script src-hilite-lesspipe.sh se instalará junto con Source-highlight. Puedes usar las siguientes variables de entorno:
export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
export LESS=' -R '
De esta manera, cuando uses menos para navegar por un archivo, si es un archivo fuente manejado por source-highlight, será resaltado automáticamente.
Xavier-Emmanuel Vincent recientemente proporcionó una versión alternativa del esquema de colores ANSI, esc256.style: algunas terminales pueden manejar 256 colores. Xavier también proporcionó un script que comprueba cuántos colores puede manejar su terminal y, en caso de que lo haga, utiliza la variante de 256. El script se llama source-highlight-esc.sh y se instalará junto con los otros binarios.
Condensé de mon billet de blog complet sur l'amélioration de l'expérience des moins expérimentés : 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 .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 mise en évidence syntaxique, utilisez un lesspipe.sh
puissant existant pour le gérer au lieu d'écrire le vôtre : https://github.com/wofr06/lesspipe
Para expandir otra respuesta, puedes hacer que funcione para la mayoría, si no todos tus scripts que no tienen extensiones, cambiando el archivo .lessfilter un poco:
#!/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
Aún así necesitarías añadir las dos variables a . bashrc:
export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'
Y todavía necesitarás hacer ejecutable el .lessfilter:
$ chmod 700 ~/.lessfilter
También quería añadir que en debian el paquete pygments se llama python-pygments. Tuve problemas para localizarlo al principio porque la obvia falta de ortografía de “pigmentos” como “pygments” no era suficiente indicio para mí de que era un paquete que podría ser prefijado con “python-” por el gestor de paquetes.
Encontré esta simple y elegante solución. No tienes que instalar nada extra ya que ya está ahí por defecto en la mayoría de las máquinas. Como vim
está instalado por defecto en la mayoría de las máquinas, incluye una macro para ejecutar vim
como less
Algunas de las opciones para usarla son crear un alias:alias vless='vim -u /usr/share/vim/vim74/macros/less.vim'
o crear un enlace simbólico:ln -s /usr/share/vim/vim74/macros/less.sh ~/bin/vless
Entonces sólo tienes que ejecutar vless myfile.py
Tengo la mayoría de la información aquí
La solución más intuitiva y directa para mí fue usar pygmentize
agregando las líneas de abajo a
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
En caso de que no puedas llamar a pygmentize
, simplemente instala como
pip install pygments
ps. El binario ejecutable del pygmentize
se colocaría en el /usr/local/bin/
o en tu /home/username/.virtualenv/venvname/bin/
o en algún lugar.
Una alternativa a menos/más que funciona con colores fuera de la caja es el murciélago. Puedes instalarlo con la mayoría de los gestores de paquetes lo usan como un buscapersonas así como un sustituto del gato. https://github.com/sharkdp/bat
Mientras el texto de salida tenga caracteres de control de color, less -R
servirá.
Ninguno de estos funcionaba fuera de la caja para mí y pensé en una manera fácil de hacer que esto funcionara, así que pensé en compartirlo.
Sólo usa el tmux, que te permite acceder y desplazarte a través de una historia más grande y conserva los colores perfectamente.