Gato de destaque / coloração de sintaxe

202

Existe um método para colorir a saída cat, da maneira que grepsim.

Pois grep, na maioria dos consoles, exibe uma saída colorida destacando as palavras-chave pesquisadas. Caso contrário, você pode forçá-lo chamando grep --color Existe uma maneira genérica de colorir a saída de qualquer programa de acordo com sua escolha pessoal.

Pelo que entendi, o programa em si não é responsável pelas cores. É a concha.

Estou usando o shell padrão no FreeBSD 5.2.1, que parece nunca ter visto cores desde a época.

Lelouch Lamperouge
fonte
Eu não consigo entender o que você está tentando dizer
Lelouch Lamperouge
Ah não. Eu não quero exibir um binário. Eu só quero exibir a saída de um binário de uma maneira colorida.
Lelouch Lamperouge
6
meh - FTFY (você sempre pode editar suas próprias perguntas)
sehe
Eu editei para evitar a confusão sobre o termo "binário"
Volker Siegel
3
Acho que a resposta de @buergi corresponde à pergunta, e isso também é suportado pelo número de votos positivos. Considere alterar a resposta aceita.
Ioannis Filippidis

Respostas:

22

catcom destaque de sintaxe está simplesmente fora do escopo. catnão é para isso. Se você deseja que todo o conteúdo de um arquivo seja colorido de alguma forma (com a mesma cor para o arquivo inteiro), você pode usar seqüências de escape de terminal para controlar a cor.

Aqui está um exemplo de script que escolherá a cor com base no tipo de arquivo (você pode usar algo parecido com isto em vez de chamar catdiretamente):

#!/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"

O item acima (em um terminal que suporta essas seqüências de escape) imprime qualquer arquivo de texto como 'negrito' e imprime qualquer arquivo binário como vermelho. Você pode usar em stringsvez de catimprimir arquivos binários e aprimorar a lógica para adequá-la às suas necessidades.

Costi Ciudatu
fonte
Eu estava pensando em algo assim. Mas preciso de algo que o faça universalmente. Não apenas cat/ grep/any particular program
Lelouch Lamperouge 21/10
Em seguida, você pode simplesmente passar o comando a ser executado como um argumento para o script e substituir a catchamada codificada por uma $cmdque seja inicializada como $ 1 se houver dois argumentos ou um padrão se houver apenas um. Então você simplesmente escrever: colorful.sh grep file.
Costi Ciudatu
8
"gato não é para isso." O gato também não serve para gravar arquivos individuais no stdout - é para concatenação. Mas isso ainda não significa que gravar arquivos individuais no stdout não seja útil. Isso não significa que destacá-los não é útil.
Mikemaccana # 9/17
Eu tentei, sob cygwin pygmentizenão é capaz de colorir. Alguma dica?
truthadjustr
409

Eu recomendo pygmentizedo pacote python python-pygments. Você pode definir o seguinte alias útil (a menos que você use ccatdo pacote ccrypt).

alias ccat='pygmentize -g'

Sintaxe destacada saída de gato usando pycementize

E se você quiser números de linha:

alias ccat='pygmentize -g -O style=colorful,linenos=1'
buergi
fonte
22
Outra solução é usar o highlightcomando linux . alias ccat='highlight -O ansi'
Evan Purkhiser
99
Esta deve ser a resposta aceita IMHO. Acrescentando a isso, eu fiz um alias alias dog='pygmentize -g', porque os cães são mais legais que os gatos!
Pol13
8
Você pode adicionar menos -R para tornar o código rolável:#!/bin/bash \n pygmentize -g $1 | less -R
Fabricio PH
6
Eu chamei meu apelido nyancat.
zneak
2
pycementize funciona conforme o esperado, mas infelizmente parece ser bastante lento. : - /
Frerich Raabe 23/03
113

Opções:

pycementize é bom. Eu tenho um apelido:

alias c='pygmentize -g'

mas destaque é outra alternativa amplamente disponível

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

Instalação:

Pode ser necessário instalar pygmentsusando:

sudo pip install pygments
sudo easy_install Pygments #for Mac user

e para highlightembalagens facilmente disponíveis em todas as distribuições

sudo apt-get install highlight
sudo yum install highlight

Em ação:

Estou anexando fotos para os dois abaixo para uma boa comparação nos destaques

Aqui está pygmentizeem ação: Destacando Pythonize no arquivo python

e isto é highlight: Destaque destaque no arquivo python

Shubham Chaudhary
fonte
4
highlightfuncionou muito bem para as minhas necessidades e instalou facilmente, obrigado. Se você quiser ver arquivos sem extensões (por exemplo, .bash_aliases), adicione --syntax=bashalém -O anside forçá-lo.
jerclarke
1
# pip install Pygments # echo "alias catc = 'pycementize -g'" >> "~ / .bashrc" # terminal fechado # terminal aberto # terminal aberto # catc test.js --- e trabalhos perfeitos :-) 😊
BG Bruno
3
highlighté 34x mais rápido que o programa python. O poder das línguas clássicas é forte.
Avindra Goolcharan 4/11
2
Pois highlight, você deseja adicionar --forceao alias; caso contrário, ele emitirá um erro para os formatos de arquivo que não entende, enquanto como catsubstituição, você deseja que ele ainda mostre a saída sem realçar, e é --forceisso que faz. Todos juntos:alias cat="highlight -O ansi --force"
Alexander Klimetschek 4/17/17
1
@ Lucas é por isso que você deve adicionar o -O ansipadrão é a saída html :-)
Thomas
59

A partir do final de abril de 2018:

Bat - Um clone cat (1) com destaque de sintaxe e integração com Git.

O projeto é um clone de gato com suporte para cores e personalizações escritas em Rust. Ele oferece não apenas o destaque da sintaxe com vários temas, mas também a integração do Git. Conforme descrito na documentação:

bat tenta alcançar os seguintes objetivos :

  • Forneça destaque de sintaxe avançado e bonito
  • Integre-se ao Git para mostrar modificações no arquivo
  • Seja um substituto direto para (POSIX) cat
  • Oferecer uma interface de linha de comando amigável

É, escusado será dizer, muito mais rápido do que pythonize e não engasga quando confrontado com arquivos grandes.

O código fonte e as versões binárias + instruções de instalação podem ser encontradas no repositório do Github, bem como uma comparação com programas alternativos .

dangom
fonte
5
O que as pessoas esquecem de mencionar é que batpermanece no modo interativo por padrão. Para que ele se comporte mais cat, use-o com -ppargumento. Um apelido semelhante alias cat="bat -pp"é provavelmente o que as pessoas estão procurando.
Canella
1
Eu já usei pycementize para colorir gato antes, mas a solução com bat é muito mais adequada para arquivos grandes (logs de vários MB), nos quais o desempenho de pythonize é inferior.
Christian.D
35

vimcat é um arquivo único (shell script) e funciona bem:

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

A última atualização é de dezembro de 2013. Dica: você pode forçar o reconhecimento de tipo de arquivo por vimcat -c "set ft=<type>".

Soergener
fonte
12
Uma coisa realmente interessante sobre o vimcat (ou vimpager) é que ele respeitará o esquema de cores que você definiu em seu ~/.vimrcrealce de sintaxe, para que o realce da sintaxe seja o mesmo quando desejar editar (vim) ou imprimir (vimcat). Observe que uma versão atualizada do vimcat pode ser encontrada no repositório do vimpager .
timss
A resposta de Amaynut é mais velho e semelhante
olibre
vimpagernão usa meu esquema de cores vim.
WhyNotHugo
2
No meu teste rápido não-científico, vimcat(1 ~ 2 segundos de tempo de execução) é muito mais lento que pymentize(~ 200ms), que é muito mais lento que highlight(~ 20ms), que é muito mais lento que cat(~ 2ms). Por outro lado, vimcatlida com mais tipos de arquivos e é mais preciso do que hightlighte pygmentize, e é ainda mais rápido do que primeiro vim, em seguida :q. Por isso, ganha a minha escolha para esta tarefa específica.
Penghe Geng 20/08/18
1
@olibre Esta resposta parece mais antiga que a do Amaynut.
Franklin Yu
31

A ferramenta que você está procurando é provavelmente supercat (aqui está uma rápida introdução publicada pelo Linux Journal).

Sei que essa resposta está atrasada e que não atende totalmente aos requisitos do OP. Então, eu estou adicionando apenas para referência (pode ser útil para outras pessoas que procuram como colorir a saída do arquivo de texto).

mfriedman
fonte
1
Isso não parece funcionar tão facilmente, eu instalei ele e usou o exemplo de configuração, mas que não tinha qualquer efeito de cor
rubo77
Bom, tudo o resto é muito lento. Isso é bom. Para obter ajuda com a configuração, consulte manpages.debian.org/testing/supercat/spc.1.en.html
okovko
Além disso, para algumas configurações para vários idiomas: github.com/tanderson92/supercat/tree/master/spcrc
okovko
20

Existe uma versão colorida do cat- ccat . Obtenha-o em https://github.com/jingweno/ccat/ .

Instalação no Linux / Windows / macOS

É um único executável independente. Para instalá-lo, você pode descompactar a versão binária do seu sistema operacional em https://github.com/jingweno/ccat/releases e copiar o binário ccat, por exemplo, para /usr/local/bin.

Se você deseja evitar binários ou se não há binário para sua plataforma (por exemplo, raspberry pi, etc), você pode compilar alternativamente a partir da fonte, desde que tenha um goambiente de desenvolvimento funcional ( apt install golangem linuxes baseados em debian ou brew install golangno mac):

go get -u github.com/jingweno/ccat

O ccatbinário será criado sob o seu $GOPATH/bin.

Instalando no Mac via homebrew

brew install ccat

Alias ​​para cat

Para substituir regular catpor ccatadicionar ~/.bashrc:

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

ccaté implementado no Go , por isso é um binário nativo que roda muito mais rápido que as soluções baseadas em Python, como pigmentos , o módulo por trás pygmentize; Não vi nenhuma diferença notável de velocidade entre cate ccat.

ccpizza
fonte
1
Qual é o nome do repo adequado? apt-get CCAT no Ubuntu 16 dá-me algum tipo de programa de criptografia e um pouco divertida emparedada meu terminal como é actualmente a tentar criptografar ou descriptografar meu diretório proc toda ...
Katastic Voyage
@ KatasticVoyage: my bad: por alguma razão, presumi que estava nos repositórios e esqueci como consegui na minha caixa do ubuntu. Veja a resposta atualizada.
Ccpizza # 6/17
2
Atualmente, parece que brew install ccaté suficiente, não é brew tapmais necessário.
Jeff Huijsmans
12

A melhor maneira e a maneira mais fácil de fazer isso se você tiver o vim em sua máquina é usar o vimcatque acompanha o vimpagerprograma.

  1. Instale o vimpage com git clone git://github.com/rkitover/vimpager cd vimpager sudo make install
  2. Execute o vimcat:

    vimcat index.html

Amaynut
fonte
Adoro a ideia, mas o vimcat está entre os mais lentos aqui. É tão lento quanto o pitonismo. 15x mais lento que highlighte 3x mais lento que batem um script bash de 30 linhas na minha máquina.
Ponkadoodle
11

source-highlight

Talvez seja possível encontrar interessantes source-highlight lançados no GNU : um pacote diferente de highlight.

Trecho de apt-cache show source-highlight:

Description-pt: converte o código-fonte em documento destacado da sintaxe.
Este programa, dado um arquivo de origem, produz um documento com destaque de sintaxe.
Ele suporta realce de sintaxe para mais de 100 formatos de arquivo ...
Para saída, os seguintes formatos são suportados: HTML, XHTML, LaTeX, Texinfo, seqüências de escape de cores ANSI e DocBook

Eu fiz alguns apelidos (Cat e PCat, veja abaixo) e esta é a saída deles

Exemplo de tela

Você pode instalar no Debian com base em

sudo apt-get install source-highlight

e adicione-o como pseudônimo, por exemplo, no seu .bash_aliasescom algo como a linha abaixo.

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

Ou você pode fazer um alias semelhante (sem o -ino final para ter a possibilidade de inserir )

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

Entre as opções que é possível ler a partir man source-highlightdos -ssublinhados, é possível selecionar ou forçar o realce por linha de comando ou deixar para o programa esta tarefa:

-s , --src-lang = STRING idioma de origem (use --lang-list para obter a lista completa). Se não especificado, o idioma de origem será adivinhado a partir da extensão do arquivo .

--lang-list lista todo o idioma suportado e o arquivo de definição de idioma associado

Hastur
fonte
1
Se você também quiser colorir lesscom source-highlight, alguém no GitHub dá a resposta: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"e export LESS=" -R ". Muito útil quando pygmentizenão está disponível e não pode ser instalado.
Lalylulelo
8

Pelo que entendi, o binário em si não é responsável pelas cores. É a concha.

Isso não está correto. O terminal apenas interpreta os códigos de cores que são enviados para o terminal. Dependendo de sua capacidade, ele pode ignorar certos códigos de formatação / coloração.

Na página de manual, não parece que o gato suporta a coloração de sua saída. Mesmo se fosse compatível com cores como grep, o que deveria ser colorido no arquivo de texto? Sintaxe que destaca o conhecimento necessário da linguagem subjacente, que não está no escopo de utilidades simples, como cat.

Você pode tentar editores mais poderosos, como vim, emacs, gedit etc. na plataforma unix, se ver o código destacado é seu objetivo.

Ashwinee K Jha
fonte
3
" catNão é para imprimir arquivos com números de linha, não é para compactar várias linhas em branco, não é para olhar caracteres ASCII que não imprimem, é para concatenar arquivos". - do estilo UNIX ou cat -v Considerado prejudicial .
Scott Scott
7

No OSX simplesmente faça brew install ccat.

https://github.com/jingweno/ccat . Como gato, mas exibe conteúdo com destaque de sintaxe. Construído em Go.

joost
fonte
Agradável. Tem algumas limitações de idioma, mas parece muito mais rápido que os pigmentos.
Gustavo Bezerra
O ccat também pode ser encontrado no repositório AUR do Arch Linux. Use yaourt ou pacaur para instalar o pacote.
Marcs
6

bastão faz exatamente isso e pode ser alias ao gatoalias cat='bat'

Sailendra Pinupolu
fonte
3

Pergunta antiga, apenas respondendo pelo registro para fornecer a solução que acabei usando. Talvez isso seja um pouco hacky (provavelmente não é a intenção original do parâmetro), mas:

alias cgrep = 'grep -C 9000'

gato qualquer que seja | cgrep 'snozzberries'

.. grep -C Nfornecerá N linhas de contexto acima e abaixo do item encontrado. Se for maior que a entrada, toda a entrada será incluída. Nesse caso, apenas garantimos que seja maior do que qualquer saída de terminal típica que desejaremos examinar manualmente, que geralmente é o que você deseja fazer se destacar.

EDIT: No entanto, esta solução sugerida abaixo por Beni Cherniavsky-Paskin é superior - ela corresponde (e destaca) à palavra que você está procurando ou ao início da linha (não destacável). O resultado líquido é exatamente o que você deseja.

cat whatever | egrep 'snozzberries|$'

Essa é a nova melhor solução que eu já vi para esse problema, obrigado Beni.

Mr. B
fonte
2
Uma maneira mais robusta para destacar um padrão, enquanto incluindo todas as linhas éegrep 'snozzberries|$'
Beni Cherniavsky-Paskin
1

Eu escrevi o pequeno script para executar a coloração 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
}

E então faça um alias para o script. alias cat=colorize_via_pygmentize. Também não se esqueça de salvar isso em ~ / .bashrc .

Rohit Sehgal
fonte
0

Se você quer apenas um liner para definir a catsaída para uma determinada cor, você pode acrescentar

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

para o seu ~/.$(basename $SHELL)rc

Aqui está uma essência com códigos de cores: https://gist.github.com/chrisopedia/8754917

Eu gosto '\e[1;93m', que é amarelo de alta intensidade. Se parece com isso:insira a descrição da imagem aqui

okovko
fonte
0

basta usar o vim e esse arquivo vimrc .

oneliner:

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 também pode ser uma alternativa.

eadmaster
fonte
0

Coloque em seu ~ / .bashrc

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

então

ccat filename

O Whalebrew cria aliases para imagens do Docker para que você possa executá-las como se fossem comandos nativos. É como Homebrew, mas com imagens do Docker.

javajon
fonte