El título de esta pregunta es muy engañoso. Muchas personas que llegan a esta página esperan una solución al problema de coloración que obtendrá al canalizar un comando con salida de color a less: los colores se pierden. (Las respuestas a ese "problema de tuberías" implican less -R, unbufferetc.) ¡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)
myrdd
Necesito corregirme, solo faltan 3 (o 4) de las 14 respuestas a la pregunta real del OP: las respuestas de ChristopheD , Puneet y Onlyjob ; y tal vez jbbr . Aún así, dos de esas respuestas son parte de las tres más votadas.
myrdd
@myrdd "resaltado de sintaxis" es el término relevante entonces ... (¿Pregunta sobre mostrar colores, no agregar colores?) less -Rtambién funcionará en los archivos, por ejemplols --color=always > /tmp/file && less -R /tmp/file
Gert van den Berg
1
@myrdd Podría tener más sentido que la pregunta se cierre como "no está claro lo que se está preguntando", ya que las preguntas que hacen cualquiera de los dos probablemente se marcarán como duplicados de esto ... (Y las respuestas para cualquiera de los dos pueden ser rechazadas basado en cómo lo interpreta el votante ...) (Mi caso de uso fue un archivo de registro que (molestamente) tiene códigos de escape de color)
Gert van den Berg
Respuestas:
149
Puede utilizar el poder de pygmentize con menos, ¡automáticamente! (No es necesario hacer tubos a mano).
Instale pygmentscon 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
Además, debe hacer ~/.lessfilterejecutable 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.
Si desea colorear los archivos de código fuente, también debe hacer que ejecute ~ / .lessfilter ejecutando chmod u+x ~/.lessfilter. También necesita tener pygmentize ( pygments.org/download ) instalado.
Sergiy Belozorov
¿Alguien puede confirmar que esto funciona ya que no tiene ningún efecto para mí cuando ejecuto un comando comols -l | less
Puk
77
@puk puedes hacer algo como 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.
PhilT
2
agregó el comentario de @ SergiyByelozyorov a la respuesta.
andrybak
2
Mi edición fue rechazada, así que supongo que la publicaré como un comentario en su lugar: no pruebe los códigos de salida de los comandos indirectamente. Puede usar if grep -q "#\!/bin/bash" "$1"( -qsuprime la salida estándar). Es posible que desee redirigir el error estándar con 2>/dev/null.
Tom Fenech
503
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". (...)
Esto es útil cuando el archivo en sí contiene los códigos de escape que deberán mostrarse.
Nitrodist
1
Solía saber acerca de less -r pero buscando en el archivo usando "/" seguía apareciendo las líneas incorrectas. -R parece hacer un mejor trabajo. Gracias por el consejo.
Amos Shapira
54
Cabe señalar que la mayoría de los programas utilizan la 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, isattydevolverá 0. Para verificar si esto funciona, intenteecho -e '\x1b[32;1mtest\x1b[m' | less -r
mic_e
11
Esta respuesta no sobresale en la prueba realmente hace algo.
Michael Wolf
18
También puede escribir -Rcuando ya lo abrió lesspara lograr esto.
Cuando simplemente ejecuta grep --color, implica grep --color=autoque 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=alwayscomo un alias, a veces rompe cosas. Por eso hay una --color=autoopción.
Genial gracias. Excepto que necesito usar -Rcomo opción lesstambién.
naught101
10
Creo que grep -Res para especificar la búsqueda recursiva. less -Res necesario para lessescupir correctamente los colores. grep --color=always [grep cmds] | less -R¡funciona para mí en OS X 10.7.3!
Steven Lu
@ naught101 @Steven Lu Editado, aunque parece que algunas personas pueden no necesitar usar less -R(de acuerdo con el autor de la publicación original, de todos modos).
jtpereyda
2
¿Hay alguna forma de hacerle saber a Grep que solo canalice el comando -R y luego simplemente coloree? Por lo tanto, no tenemos que poner --color = siempre y menos -R todo el tiempo.
A-letubby
1
Esta es, con mucho, la respuesta de trabajo más simple. ¡Gracias!
Danny Staple el
37
Usar en viewlugar de less. Abre el archivo vimen 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).
¿Qué tal el rendimiento de los archivos grandes? El resaltado de sintaxis de Vim es lento en archivos grandes.
pihentagy
No sé cuál es su valor para 'grande', pero abrir un archivo de ~ 10000 líneas es instantáneo, buscar dentro incluido.
Riccardo Galli
1
He votado a favor (no lo sabía view) pero otra desventaja es que j / k / arriba / abajo no se desplaza instantáneamente, ya que hay un cursor.
Tyler Collier
77
Tenga en cuenta que es posible que deba agregar view -al realizar la tubería
user45909
66
vimes un editor, que carga el archivo completo en la memoria, mientras que lesses un localizador, cargando el archivo solo parcialmente en la memoria. Sabrás la diferencia con archivos enormes.
sjas
16
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 unbuffercomando 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, pygmentizees genial para colorear el código fuente. No requiere unbuffer. Llamada más fácil:
Para usar unbufferen Ubuntu,sudo apt install expect
wisbucky
Esta respuesta necesita más votos a favor.
Thomas Dignan
Estaba tratando de canalizar la salida de dmesg para verificar los errores de arranque, pero los colores no funcionaron a menos que usara unbuffer, lo que me confundía muchísimo: unbuffer dmesg | less -Rfunciona como se esperaba.
pbhj
15
pygmentizeadmite la -gopción de adivinar automáticamente el lexer que se utilizará, lo cual es útil para los archivos leídos STDINsin verificar ningún tipo de extensión.
Con eso, solo necesita establecer las siguientes 2 exportaciones en su .bashrcsin ningún script adicional:
Conciso y efectivo. Prefiero definir un alias, porque a veces menos es mejor. Entonces: alias lesc = 'LESS = "- R" LESSOPEN = "| pygmentize -g% s" less'
Tiago
9
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, vimhay un modo de solo lectura que puede darle resaltado de sintaxis si lo tiene activado vim.
Comprobar si lesspipeo lessfileya está habilitado:
echo $LESSOPEN
Si no ve ninguno de los programas mencionados allí, asegúrese de que lesspipeesté instalado (la mayoría de las distribuciones vienen con él).
Agregue lo siguiente a ~/.bashrc:
# sets LESSOPEN and LESSCLOSE variableseval"$(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 evaldeclaración con:
export LESSOPEN='|~/.lessfilter %s'
Crear ~/.lessfilter
Agregue el siguiente código y haga que el archivo sea ejecutable: chmod u+x ~/.lessfilter
El único inconveniente de este enfoque es que Pygments es un programa de Python y, por lo tanto, cuando se usa por primera vez durante una sesión de shell, hay un retraso de "arranque en frío". Las invocaciones posteriores son mucho más rápidas.
Joe Coder
¡Agradable! Realmente completo.
Dario Seidl
4
Use el resaltado de fuente GNU ; puede instalarlo aptsi 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:
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:
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.
2 comentarios: 1) Gracias por la mejora. 2) Las frases como "mejor respuesta votada" no son geniales; eso puede cambiar (de hecho, si esto es mejor que esa respuesta, esta publicación podría convertirse en la respuesta principal, en cuyo punto será confuso. ¿Quizás simplemente diga "expandir sobre otra respuesta" o "respuesta del capitáncomic"?
cpast
2
Puede considerar usar la mostutilidad, que es una alternativa amigable con el color para lessy more.
¿Puedes mostrarnos un ejemplo? Lo intenté aquí, y la salida fue en blanco y negro.
Danilo
Su entrada debe contener colores. En primer lugar producir una muestra colorised (por ejemplo ccze -A </var/log/dpkg.log, ls -1 --color /var/log) entonces tubería a most: ls -1 --color /var/log | most.
Onlyjob
Sí, he utilizado: git status | less --color,git status | most --color
Danilo
Usé la mayoría, más, menos, y todas las herramientas se muestran en blanco y negro
danilo
Asegúrese de que su comando produzca colores antes de canalizar a lessotros. Asegúrese de que su emulador de terminal pueda generar colores. Comprobar TERMvariable 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.
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 vimse instala por defecto en la mayoría de las máquinas, incluye una macro para ejecutar vimcomoless
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
Tengo 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 ...
Daniel
0
La solución más intuitiva y directa para mí fue usar pygmentize
agregando las siguientes líneas a .bashrc
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
Respuestas:
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 llamadopython-pygments
) u obténgalo aquí http://pygments.org/download/ .Escribir un archivo
~/.lessfilter
En su
.bashrc
complementoAdemás, debe hacer
~/.lessfilter
ejecutable ejecutandoProbado 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.
fuente
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 con2>/dev/null
.Intenta lo siguiente:
de
man less
:fuente
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
Advertencia: no lo pongas
--color=always
como un alias, a veces rompe cosas. Por eso hay una--color=auto
opción.fuente
-R
como opciónless
también.grep -R
es para especificar la búsqueda recursiva.less -R
es necesario paraless
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 deless
. Abre el archivovim
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 usandovim
).fuente
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íavim
es un editor, que carga el archivo completo en la memoria, mientras queless
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:
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
:Ejemplo usando pacman
El
unbuffer
comando generalmente forma parte del paqueteexpect
(Arch Linux, Debian / Ubuntu) oexpect-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 requiereunbuffer
. Llamada más fácil:fuente
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ídosSTDIN
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:fuente
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í
o
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 activadovim
.o alternativamente vea la respuesta de Churnd.
fuente
Esta es otra respuesta basada en pigmentos , con varias mejoras importantes:
lesspipe
nilessfile
filtraless
Instalar pigmentos y Gawk
Establecer variables de entorno
Comprobar si
lesspipe
olessfile
ya está habilitado: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
:Si no quiere
lesspipe
, reemplace laeval
declaración con:Crear
~/.lessfilter
Agregue el siguiente código y haga que el archivo sea ejecutable:
chmod u+x ~/.lessfilter
fuente
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 :fuente
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:
Aún necesitaría agregar las dos variables a .bashrc:
Y aún necesitará hacer que .lessfilter sea ejecutable:
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.
fuente
Puede considerar usar la
most
utilidad, que es una alternativa amigable con el color paraless
ymore
.fuente
ccze -A </var/log/dpkg.log
,ls -1 --color /var/log
) entonces tubería amost
: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. ComprobarTERM
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
:Para resaltar la sintaxis, use un potente existente
lesspipe.sh
para manejarlo en lugar de escribir el suyo propio: https://github.com/wofr06/lesspipefuente
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 ejecutarvim
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í
fuente
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
En caso de que no pueda llamar
pygmentize
, simplemente instale comoPD. El
pygmentize
binario ejecutable se sentaría en/usr/local/bin/
o en su/home/username/.virtualenv/venvname/bin/
o en algún lugar.fuente
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.
fuente
Siempre que el texto de salida tenga caracteres de control de color,
less -R
servirá.fuente