Gato de resaltado / coloreado de sintaxis


202

¿Hay un método para colorear la salida de catla manera que lo grephace?

Porque grep, en la mayoría de las consolas, muestra una salida en color que resalta las palabras clave buscadas. De lo contrario, puede forzarlo llamando. grep --color ¿Hay una forma genérica de colorear la salida de cualquier programa de acuerdo con su elección personal?

Por lo que entiendo, el programa en sí no es responsable de los colores. Es la concha.

Estoy usando el shell predeterminado en FreeBSD 5.2.1 que parece que nunca ha visto colores desde la época.


No puedo entender lo que estás tratando de decir
Lelouch Lamperouge

Oh no. No quiero mostrar un binario. Solo quiero mostrar la salida de un binario de forma coloreada.
Lelouch Lamperouge

66
meh - FTFY (siempre puedes editar tus propias preguntas)
sehe

Edité para evitar la confusión sobre el término "binario"
Volker Siegel

3
Creo que la respuesta de @buergi coincide con la pregunta, y esto también está respaldado por la cantidad de votos positivos que tiene. Considere cambiar la respuesta aceptada.
Ioannis Filippidis

Respuestas:


22

catcon resaltado de sintaxis simplemente está fuera de alcance. catNo es para eso. Si solo desea tener el contenido completo de algún archivo coloreado de alguna manera (con el mismo color para todo el archivo), puede utilizar secuencias de escape de terminal para controlar el color.

Aquí hay un script de muestra que elegirá el color según el tipo de archivo (puede usar algo como esto en lugar de invocarlo catdirectamente):

#!/bin/bash
fileType="$(file "$1" | grep -o 'text')"
if [ "$fileType" == 'text' ]; then
    echo -en "\033[1m"
else
    echo -en "\033[31m"
fi
cat $1
echo -en "\033[0m"

Lo anterior (en un terminal que admita esas secuencias de escape) imprimirá cualquier archivo de texto como 'negrita' e imprimirá cualquier archivo binario como rojo. Puede utilizarlo en stringslugar de catimprimir archivos binarios y puede mejorar la lógica para que se adapte a sus necesidades.


Estaba pensando en algo como esto. Pero necesito algo que lo haga universalmente. No solo cat/ grep/any particular program
Lelouch Lamperouge

Luego, simplemente puede pasar el comando para que se ejecute como un argumento para el script y reemplazar la catinvocación codificada con algo $cmdque se inicializa como $ 1 si hay dos argumentos o un valor predeterminado si solo hay uno. A continuación, se escribe: colorful.sh grep file.
Costi Ciudatu

8
"gato no está hecho para eso". Cat no está destinado a escribir archivos individuales en stdout tampoco: es para concatenación. Pero eso todavía no significa que escribir archivos individuales en stdout no sea útil. Esto no significa que resaltarlos no sea útil.
mikemaccana

Lo intenté, bajo cygwin pygmentizeno es capaz de colorear. ¿Algun consejo?
truthadjustr

409

Lo recomendaría pygmentizedel paquete python python-pygments. Es posible que desee definir el siguiente alias práctico (a menos que lo use ccatdel paquete ccrypt).

alias ccat='pygmentize -g'

Sintaxis resaltada salida de gato usando pygmentize

Y si quieres números de línea:

alias ccat='pygmentize -g -O style=colorful,linenos=1'

22
Otra solución es usar el highlightcomando linux . alias ccat='highlight -O ansi'
Evan Purkhiser

99
Esta debería ser la respuesta aceptada en mi humilde opinión. Además de eso, lo alias como alias dog='pygmentize -g', porque los perros son más geniales que los gatos.
polym

8
Puede agregar menos -R para que el código se pueda desplazar:#!/bin/bash \n pygmentize -g $1 | less -R
Fabricio PH

66
Llamé a mi alias nyancat.
zneak

2
pygmentize funciona como se esperaba, pero desafortunadamente parece ser bastante lento. : - /
Frerich Raabe

113

Opciones:

pygmentize es bueno. Tengo un alias:

alias c='pygmentize -g'

pero resaltar es otra alternativa ampliamente disponible es

alias cats='highlight -O ansi --force'

Instalación:

Puede que tenga que instalar pygmentsusando:

sudo pip install pygments
sudo easy_install Pygments #for Mac user

y para highlightpaquetes que están fácilmente disponibles en todas las distribuciones

sudo apt-get install highlight
sudo yum install highlight

En acción:

Adjunto tiros para ambos abajo para una buena comparación en resaltados

Aquí está pygmentizeen acción: Pygmentize resaltado en archivo Python

y esto es highlight: Resalte el resaltado en el archivo de Python


44
highlightfuncionó muy bien para mis necesidades y se instaló fácilmente, gracias. Si desea ver archivos sin extensiones (por ejemplo, .bash_aliases), agregue --syntax=bashademás -O anside forzarlo.
jerclarke

1
# pip install Pygments # echo "alias catc = 'pygmentize -g'" >> "~ / .bashrc" # cerrar terminal # abrir terminal # catc test.js --- y trabajos perfectos :-) 😊
BG Bruno

3
highlightes 34 veces más rápido que ese programa de Python. El poder de las lenguas clásicas se mantiene fuerte.
Avindra Goolcharan

2
Para highlight, desea agregar --forceal alias, de lo contrario arrojará un error para los formatos de archivo que no entiende, mientras que como catreemplazo desea que todavía muestre la salida sin resaltar, que es lo que --forcehace. Todos juntos:alias cat="highlight -O ansi --force"
Alexander Klimetschek

1
@Luke es por eso que debes agregar que el -O ansivalor predeterminado es generar html :-)
Thomas

59

Desde finales de abril de 2018 en adelante:

Bat : un clon cat (1) con resaltado de sintaxis e integración de Git.

El proyecto es un clon de gato con soporte para colores y personalizaciones escritas en Rust. Ofrece no solo resaltado de sintaxis con múltiples temas, sino también integración con Git. Como se describe en la documentación:

bat intenta alcanzar los siguientes objetivos :

  • Proporcione un resaltado de sintaxis avanzado y hermoso
  • Integrar con Git para mostrar modificaciones de archivos
  • Sea un reemplazo directo para el gato (POSIX)
  • Ofrecer una interfaz de línea de comandos fácil de usar

Es innecesario decir que es mucho más rápido que pygmentize y no se ahoga cuando se enfrenta a archivos grandes.

El código fuente y las versiones binarias + instrucciones de instalación se pueden encontrar en el repositorio de Github, así como una comparación con programas alternativos .


55
Lo que la gente olvida mencionar es que batpermanece en modo interactivo por defecto. Para que se comporte más cat, úsalo con -ppargumentos. Un alias como alias cat="bat -pp"es probablemente lo que la gente está buscando.
Canella

1
He estado usando pygmentize para colorear cat antes, pero la solución con bat es mucho más adecuada para archivos grandes (registros de varios MB), donde el rendimiento de pygmentize es deficiente.
Christian.D

35

vimcat es de un solo archivo (script de shell) y funciona bien:

http://www.vim.org/scripts/script.php?script_id=4325

La última actualización es de diciembre de 2013. Sugerencia: puede forzar el reconocimiento del tipo de archivo mediante vimcat -c "set ft=<type>".


12
Una cosa que es realmente agradable acerca de vimcat (o vimpager) es que respetará el esquema de colores que ha definido en su ~/.vimrcresaltado de sintaxis será el mismo cuando desee editar (vim) o imprimir (vimcat). Tenga en cuenta que se puede encontrar una versión actualizada de vimcat en el repositorio de vimpager .
timss

La respuesta de Amaynut es más antigua y similar
olibre

vimpagerno usa mi vim colorscheme.
WhyNotHugo

2
En mi prueba rápida no científica, vimcat(1 ~ 2 segundos de tiempo de ejecución) es mucho más lento que pymentize(~ 200 ms), que es mucho más lento que highlight(~ 20 ms), que es mucho más lento que cat(~ 2 ms). Por otra parte, vimcatse ocupa más tipos de archivos y es más precisa que la hightlighty pygmentize, y es todavía más rápido que la primera vimcontinuación :q. Por lo tanto, gana mi elección para esta tarea específica.
Penghe Geng

1
@olibre Esta respuesta parece más antigua que la de Amaynut.
Franklin Yu

31

La herramienta que está buscando es probablemente supercat (aquí hay una introducción rápida publicada por Linux Journal).

Me doy cuenta de que esta respuesta llega tarde y que no cumple completamente con los requisitos de OP. Así que lo agrego solo como referencia (podría ser útil para otras personas que buscan cómo colorear la salida del archivo de texto).


1
Esto no parece funcionar tan fácilmente, lo instalé y utilicé la configuración de ejemplo, pero eso no tuvo ningún efecto de color
rubo77

Bien, todo lo demás es demasiado lento. Esto es bueno. Para obtener ayuda con la configuración, consulte manpages.debian.org/testing/supercat/spc.1.en.html
okovko

Además para algunas configuraciones para varios idiomas: github.com/tanderson92/supercat/tree/master/spcrc
okovko

20

Hay una versión coloreada de cat - ccat . Consíguelo en https://github.com/jingweno/ccat/ .

Instalación en Linux / Windows / macOS

Es un solo ejecutable independiente, por lo que para instalarlo puede desempaquetar la versión binaria para su sistema operativo desde https://github.com/jingweno/ccat/releases y copiar el binario ccat, por ejemplo, en /usr/local/bin.

Si desea evitar los binarios, o si no hay un binario para su plataforma (por ejemplo, raspberry pi, etc.), puede compilar alternativamente desde la fuente dado que tiene un goentorno de desarrollo de trabajo ( apt install golangen Linux basado en Debian o brew install golangen Mac):

go get -u github.com/jingweno/ccat

El ccatbinario se creará bajo su $GOPATH/bin.

Instalación en Mac a través de homebrew

brew install ccat

Alias ​​a cat

Para reemplazar regular catcon ccatadd in ~/.bashrc:

alias cat="ccat $*"
alias cat0="/bin/cat $*" # for cases when you need plain `cat`

ccatse implementa en Go , por lo que es un binario nativo que se ejecuta mucho más rápido que las soluciones basadas en Python, como pygments , el módulo detrás pygmentize; No vi ninguna diferencia de velocidad notable entre caty ccat.


1
¿Cuál es el nombre correcto del repositorio? apt-get CCAT en Ubuntu 16 me da algún tipo de programa de encriptación y algo hilarante ladrillo mi terminal, ya que está actualmente tratando de cifrar o descifrar toda mi proc ...
Katastic Voyage

@KatasticVoyage: mi mal: por alguna razón supuse que estaba en los repositorios, y olvidé cómo lo conseguí en mi caja de ubuntu. Ver la respuesta actualizada.
ccpizza

2
Actualmente, parece que brew install ccates suficiente, ya no es necesario brew tap.
Jeff Huijsmans

12

La mejor manera y la manera más fácil de hacerlo si tiene vim en su máquina es usar el vimcatque viene con el vimpagerprograma.

  1. Instalar vimpage con git clone git://github.com/rkitover/vimpager cd vimpager sudo make install
  2. Ejecute vimcat:

    vimcat index.html


Me encanta la idea, pero vimcat es una de las más lentas aquí. Es casi tan lento como pygmentize. 15 highlightveces más lento que y 3 veces más lento que batpara un script bash de 30 líneas en mi máquina.
Ponkadoodle

11

source-highlight

Tal vez sea posible encontrar interesantes source-highlight lanzados bajo GNU : un paquete diferente dehighlight .

Extracto de apt-cache show source-highlight:

Descripción-en: convierte el código fuente en un documento resaltado de sintaxis.
Este programa, dado un archivo fuente, produce un documento con resaltado de sintaxis.
Admite resaltado de sintaxis para más de 100 formatos de archivo ...
Para la salida, se admiten los siguientes formatos: HTML, XHTML, LaTeX, Texinfo, secuencias de escape de color ANSI y DocBook

Hice algunos alias (Cat y PCat, ver más abajo) y esta es su salida

Ejemplo de pantalla

Puede instalar en Debian basado en

sudo apt-get install source-highlight

y agréguelo como alias, por ejemplo, en su .bash_aliasescon algo como la línea de abajo.

alias Cat='source-highlight --out-format=esc -o STDOUT -i'  
Cat myfile.c # or myfile.xml ...

O puede hacer un alias similar (sin que -ial final tenga la posibilidad de canalizar )

alias PCat='source-highlight --out-format=esc -o STDOUT '
tail myfile.sh | PCat     # Note the absence of the `-i`

Entre las opciones que es posible leer de man source-highlightlos -ssubrayados es posible seleccionar o forzar el resaltado por línea de comando o dejar al programa esta tarea:

-s , --src-lang = lenguaje fuente STRING (use --lang-list para obtener la lista completa). Si no se especifica, el idioma de origen se adivinará a partir de la extensión del archivo .

--lang-list lista todo el idioma admitido y el archivo de definición de idioma asociado


1
Si quieres también de colorear lesscon source-highlight, alguien en GitHub da la respuesta: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"y export LESS=" -R ". Muy útil cuando pygmentizeno está disponible y no se puede instalar.
Lalylulelo

8

Por lo que entiendo, el binario en sí no es responsable de los colores. Es la concha.

Eso no es correcto El terminal solo interpreta los códigos de color que se envían al terminal. Dependiendo de su capacidad, puede ignorar ciertos códigos de formato / coloración.

Desde la página de manual no parece que cat soporta colorear su salida. Incluso si fuera para soportar la coloración como grep, ¿qué debería colorear en el archivo de texto? La sintaxis que resalta el conocimiento requerido del lenguaje subyacente que no está dentro del alcance de una utilidad simple como cat.

Puede probar editores más potentes como vim, emacs, gedit, etc. en la plataforma Unix si su objetivo es ver el código resaltado.


3
" catNo es para imprimir archivos con números de línea, no es para comprimir varias líneas en blanco, no es para mirar caracteres ASCII que no se imprimen, es para concatenar archivos". - del estilo UNIX, o cat -v Considerado dañino .
Scott

7

En OSX simplemente hazlo brew install ccat.

https://github.com/jingweno/ccat . Como cat pero muestra contenido con resaltado de sintaxis. Construido en Go.


Agradable. Tiene algunas limitaciones de idioma, pero se siente mucho más rápido que los pigmentos.
Gustavo Bezerra

ccat también se puede encontrar en el repositorio AUR de Arch Linux. Use yaourt o pacaur para instalar el paquete.
Marcs


3

Antigua pregunta, solo respondiendo por el registro para proporcionar la solución que terminé usando. Quizás esto sea un poco confuso (probablemente no sea la intención original del parámetro), pero:

alias cgrep = 'grep -C 9000'

gato lo que sea | cgrep 'snozzberries'

.. grep -C Nproporcionará N líneas de contexto encima y debajo del elemento encontrado. Si es más grande que la entrada, se incluye toda la entrada. En este caso, solo nos aseguramos de que sea más grande que cualquier salida de terminal típica que queremos ver manualmente, que generalmente es lo que está buscando hacer si se resalta.

EDITAR: Sin embargo, esta solución sugerida a continuación por Beni Cherniavsky-Paskin es superior: coincide (y resalta) la palabra que está buscando o el comienzo de la línea (no resaltable). El resultado neto es exactamente lo que quieres.

cat whatever | egrep 'snozzberries|$'

Esa es la mejor solución nueva que he visto para ese problema, gracias Beni.


2
Una forma más robusta de resaltar un patrón e incluir todas las líneas esegrep 'snozzberries|$'
Beni Cherniavsky-Paskin


1

He escrito el pequeño script para realizar la coloración usando pygmentize.

colorize_via_pygmentize() {
    if [ ! -x "$(which pygmentize)" ]; then
        echo "package \'Pygments\' is not installed!"
        return -1
    fi

    if [ $# -eq 0 ]; then
        pygmentize -g $@
    fi

    for FNAME in $@
    do
        filename=$(basename "$FNAME")
        lexer=`pygmentize -N \"$filename\"`
        if [ "Z$lexer" != "Ztext" ]; then
            pygmentize -l $lexer "$FNAME"
        else
            pygmentize -g "$FNAME"
        fi
    done
}

Y luego crea un alias para el script. alias cat=colorize_via_pygmentize. Además, no olvide guardar esto en ~ / .bashrc .


0

Si solo desea que un trazador de líneas establezca la catsalida en un color determinado, puede agregar

alias cat="echo -en 'code' | cat - "

para usted ~/.$(basename $SHELL)rc

Aquí hay una esencia con códigos de color: https://gist.github.com/chrisopedia/8754917

Me gusta '\e[1;93m', que es amarillo de alta intensidad. Se parece a esto:ingrese la descripción de la imagen aquí


0

solo use vim y este archivo vimrc .

un trazador de líneas:

vim -c '1' -c 'set cmdheight=1' -c 'set readonly' -c 'set nomodifiable' -c 'syntax enable' -c 'set guioptions=aiMr' -c 'nmap q :q!<CR>' -c 'nmap <Up> <C-Y>' -c 'nmap <Down> <C-E>' -c 'nmap ^V <C-F><C-G>' "$@" 

nano -v También puede ser una alternativa.


0

Coloque en su ~ / .bashrc

function ccat() { docker run -it -v "$(pwd)":/workdir -w /workdir whalebrew/pygmentize $1; }

luego

ccat filename

Whalebrew crea alias para las imágenes de Docker para que pueda ejecutarlas como si fueran comandos nativos. Es como Homebrew, pero con imágenes de Docker.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.