Cuando leo un archivo en Linux con el comando less
o more
, ¿cómo puedo obtener el contenido en colores?
Puede utilizar el poder de pygmentize con menos, ¡automáticamente! (No es necesario hacer tubos a mano).
Instale pygments
con su administrador de paquetes o pip (posiblemente llamado python-pygments
) u obténgalo aquí http://pygments.org/download/ .
Escribir 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
complemento
export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'
Además, debe hacer ~/.lessfilter
ejecutable ejecutando
chmod u+x ~/.lessfilter
Probado en Debian.
Tienes la idea. Por supuesto, esto se puede mejorar aún más, aceptando más extensiones o analizando el shebang para otros intérpretes que bash. Vea algunas de las otras respuestas para eso.
La idea surgió de una antigua publicación de blog de los creadores de Pygments , pero la publicación original ya no existe.
chmod u+x ~/.lessfilter
. También necesita tener pygmentize ( pygments.org/download ) instalado.
ls -l | less
ls --color=always -l | less -R
. Obviamente, hay mucho que escribir, pero puedes usar un alias para algo así ll
. Eso es si no quieres usar ninguna biblioteca adicional.
if grep -q "#\!/bin/bash" "$1"
( -q
suprime la salida estándar). Es posible que desee redirigir el error estándar con 2>/dev/null
.
Intenta lo siguiente:
less -R
de man less
:
-r
o--raw-control-chars
Hace que se muestren los caracteres de control "sin formato". (...)
-R
o--RAW-CONTROL-CHARS
Como
-r
, pero solo las secuencias de escape de "color" ANSI se generan en forma "en bruto". (...)
isatty(2)
llamada al sistema para verificar si su salida estándar es un terminal y, por lo general, deshabilitan la salida coloreada si no lo es. Para cualquier tubería a menos, isatty
devolverá 0. Para verificar si esto funciona, intenteecho -e '\x1b[32;1mtest\x1b[m' | less -r
-R
cuando ya lo abrió less
para lograr esto.
Obtuve la respuesta en otra publicación: Less and Grep: obtener resultados coloreados al usar una tubería de grep a less
Cuando simplemente ejecuta
grep --color
, implicagrep --color=auto
que detecta si la salida es un terminal y, si es así, habilita los colores. Sin embargo, cuando detecta una tubería, deshabilita la coloración. El siguiente comando:grep --color=always "search string" * | less -R
Siempre permitirá colorear y anular la detección automática, y obtendrá el resaltado de color en menos.
Advertencia: no lo pongas --color=always
como un alias, a veces rompe cosas. Por eso hay una --color=auto
opción.
-R
como opción less
también.
grep -R
es para especificar la búsqueda recursiva. less -R
es necesario para less
escupir correctamente los colores. grep --color=always [grep cmds] | less -R
¡funciona para mí en OS X 10.7.3!
less -R
(de acuerdo con el autor de la publicación original, de todos modos).
Usar en view
lugar de less
. Abre el archivo vim
en modo de solo lectura.
Es prácticamente un color less
: un buscapersonas donde puedes buscar /(y más). El único inconveniente es que no puedes salir qpero necesitas:q
Además, obtienes el mismo color que vim
(ya que de hecho lo estás usando vim
).
view
) pero otra desventaja es que j / k / arriba / abajo no se desplaza instantáneamente, ya que hay un cursor.
view -
al realizar la tubería
vim
es un editor, que carga el archivo completo en la memoria, mientras que less
es un localizador, cargando el archivo solo parcialmente en la memoria. Sabrás la diferencia con archivos enormes.
Para decir menos para mostrar colores, llámalo con -R:
less -R
Desafortunadamente, algunos programas detectan que su stdout no es un terminal y deshabilitan los colores, por ejemplo, pacman (administrador de paquetes de Arch Linux).
En esos casos es posible usar unbuffer
:
unbuffer <command> | less -R
Ejemplo usando pacman
unbuffer pacman -Ss firefox | less -R
El unbuffer
comando generalmente forma parte del paquete expect
(Arch Linux, Debian / Ubuntu) o expect-dev
(versiones heredadas de Debian / Ubuntu).
Para responder la pregunta para completar:
Como otros ya respondieron, pygmentize
es genial para colorear el código fuente. No requiere unbuffer
. Llamada más fácil:
pygmentize someSource.cpp | less -R
unbuffer
en Ubuntu,sudo apt install expect
unbuffer dmesg | less -R
funciona como se esperaba.
pygmentize
admite la -g
opción de adivinar automáticamente el lexer que se utilizará, lo cual es útil para los archivos leídos STDIN
sin verificar ningún tipo de extensión.
Con eso, solo necesita establecer las siguientes 2 exportaciones en su .bashrc
sin ningún script adicional:
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
No dijo qué debería significar este color, por ejemplo, ¿cuáles deberían ser los colores para un archivo de texto?
Si lo que desea es resaltar la sintaxis para el código fuente, necesita un resaltador de código fuente. A veces uso pygmentize así
pygmentize file.cpp | less
o
pygmentize file.cpp | more
Hay otros resaltadores alrededor.
Esto es bastante rápido Si no le importa disparar, vim
hay un modo de solo lectura que puede darle resaltado de sintaxis si lo tiene activado vim
.
view file.cpp
o alternativamente vea la respuesta de Churnd.
Esta es otra respuesta basada en pigmentos , con varias mejoras importantes:
lesspipe
ni lessfile
filtraless
sudo apt-get install python-pygments python3-pygments gawk
Comprobar si lesspipe
o lessfile
ya está habilitado:
echo $LESSOPEN
Si no ve ninguno de los programas mencionados allí, asegúrese de que lesspipe
esté instalado (la mayoría de las distribuciones vienen con él).
Agregue lo siguiente a ~/.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 quiere lesspipe
, reemplace la eval
declaración con:
export LESSOPEN='|~/.lessfilter %s'
~/.lessfilter
Agregue el siguiente código y haga que el archivo sea 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
Use el resaltado de fuente GNU ; puede instalarlo apt
si lo tiene, o instalarlo desde la fuente. Luego configure un "preprocesador de entrada" por menos, con la ayuda de las documentaciones de Source-highligh para configurar con menos :
Esto fue sugerido por Konstantine Serebriany. El script src-hilite-lesspipe.sh se instalará junto con source-highlight. Puede usar las siguientes variables de entorno:
export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
export LESS=' -R '
De esta manera, cuando usa menos para explorar un archivo, si es un archivo fuente manejado por resaltado de fuente, se resaltará automáticamente.
Xavier-Emmanuel Vincent proporcionó recientemente una versión alternativa del esquema de color ANSI, esc256.style: algunos terminales pueden manejar 256 colores. Xavier también proporcionó un script que verifica cuántos colores puede manejar su terminal, y en caso de que use la variante 256. El script se llama source-highlight-esc.sh y se instalará junto con los otros binarios.
Para ampliar otra respuesta, puede hacer que funcione para la mayoría, si no para todos, sus scripts que no tienen extensiones cambiando el archivo .lessfilter solo 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 necesitaría agregar las dos variables a .bashrc:
export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'
Y aún necesitará hacer que .lessfilter sea ejecutable:
$ chmod 700 ~/.lessfilter
También quería agregar que bajo debian el paquete pygments se llama python-pygments. Al principio tuve problemas para localizarlo porque la falta de ortografía obvia de los "pigmentos" como "pigmentos" no era una pista suficiente para mí de que era un paquete que podría tener como prefijo "python-" el administrador de paquetes.
Puede considerar usar la most
utilidad, que es una alternativa amigable con el color para less
y more
.
ccze -A </var/log/dpkg.log
, ls -1 --color /var/log
) entonces tubería a most
: ls -1 --color /var/log | most
.
git status | less --color
,git status | most --color
less
otros. Asegúrese de que su emulador de terminal pueda generar colores. Comprobar TERM
variable de entorno. Lea más en unix.stackexchange.com/questions/148/… Cuando sea posible, use la distribución moderna de GNU + Linux como Debian . Utilizar motores de búsqueda (por ejemplo duckduckgo.com Startpage.com ) para encontrar respuestas. Recuerde que los comentarios no son para discusión.
Condensada de mi publicación de blog completa sobre cómo mejorar menos experiencia: https://www.topbug.net/blog/2016/09/27/make-gnu-less-more-powerful/
Para páginas de manual coloridas, agregue lo siguiente a su .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
Para resaltar la sintaxis, use un potente existente lesspipe.sh
para manejarlo en lugar de escribir el suyo propio: https://github.com/wofr06/lesspipe
Encontré esta solución simple y elegante. No tiene que instalar nada extra ya que ya está allí por defecto en la mayoría de las máquinas. Como vim
se instala por defecto en la mayoría de las máquinas, incluye una macro para ejecutar vim
comoless
Algunas de las opciones para usarlo son crear un alias:
alias vless='vim -u /usr/share/vim/vim74/macros/less.vim'
o crea un enlace simbólico:
ln -s /usr/share/vim/vim74/macros/less.sh ~/bin/vless
Entonces solo corres vless myfile.py
Obtuve la mayor parte de la información aquí
alias lesser='/usr/share/vim/vim80/macros/less.sh'
en ~/bash_aliases
(en Ubuntu 18.04). Puede usar atajos como f hacia adelante, b hacia atrás, d mitad abajo, u mitad arriba, q salir, etc ...
La solución más intuitiva y directa para mí fue usar pygmentize
agregando las siguientes líneas a .bashrc
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
En caso de que no pueda llamar pygmentize
, simplemente instale como
pip install pygments
PD. El pygmentize
binario ejecutable se sentaría en /usr/local/bin/
o en su /home/username/.virtualenv/venvname/bin/
o en algún lugar.
Ninguno de estos funcionó para mí y descubrí una manera fácil de hacer que esto funcione, así que pensé en compartirlo.
Simplemente use tmux, que le permite acceder y desplazarse por un historial más amplio y preserva los colores perfectamente.
Siempre que el texto de salida tenga caracteres de control de color, less -R
servirá.
less
: los colores se pierden. (Las respuestas a ese "problema de tuberías" implicanless -R
,unbuffer
etc.) ¡Pero la pregunta real se refiere a abrir un archivo ! - La ambigüedad radica principalmente en el título de la pregunta, pero además de eso, en mi humilde opinión, la pregunta sigue siendo demasiado amplia: "leer un archivo" podría referirse a cualquier archivo (probablemente texto sin formato). (bueno, "obtener el contenido en colores" probablemente se refiera al resaltado de sintaxis)less -R
también funcionará en los archivos, por ejemplols --color=always > /tmp/file && less -R /tmp/file