O título desta pergunta é muito enganador. Muitas pessoas que chegam nesta página esperam uma solução para o problema de coloração que obterá ao canalizar um comando com saída colorida para less: cores perdidas. (As respostas a essa “questão tubulação” envolvem less -R, unbufferetc.) Mas a questão real refere-se a abertura de um arquivo ! - A ambiguidade está primariamente no título da pergunta, mas mesmo assim, IMHO a questão ainda é muito ampla: "leia um arquivo" pode se referir a qualquer arquivo (provavelmente texto sem formatação). (bem, "obter o conteúdo em cores" provavelmente está se referindo ao realce da sintaxe.) #
03rd18
Preciso me corrigir, apenas 3 (ou 4) das 14 respostas estão faltando à pergunta real do OP: as respostas de ChristopheD , Puneet e Onlyjob ; e talvez jbbr . Ainda assim, duas dessas respostas fazem parte das três mais votadas.
myrdd
@myrdd "destaque de sintaxe" é o termo relevante, então ... (Ele pergunta sobre mostrar cores, não adicionar cores?) less -Rtambém funcionará em arquivos, por exemplols --color=always > /tmp/file && less -R /tmp/file
Gert van den Berg
1
@myrdd Pode fazer mais sentido que a pergunta seja encerrada como "não está claro o que está sendo solicitado", uma vez que as perguntas feitas a qualquer um dos dois provavelmente serão marcadas como duplicatas disso ... baseado em como o eleitor o interpreta ...) (Meu caso de uso era um arquivo de log que (irritantemente) possui códigos de escape de cores)
Gert van den Berg -
Respostas:
149
Você pode utilizar o poder do pytograma com menos - automaticamente! (Não há necessidade de canalizar manualmente).
Instale pygmentscom o seu gerenciador de pacotes ou pip (possivelmente chamado python-pygments) ou obtenha-o aqui http://pygments.org/download/ .
Escreva um arquivo ~/.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
Além disso, você precisa tornar o ~/.lessfilterexecutável executando
chmod u+x ~/.lessfilter
Testado no Debian.
Você entendeu a ideia. Obviamente, isso pode ser melhorado, aceitando mais extensões ou analisando o shebang para outros intérpretes que não o bash. Veja algumas das outras respostas para isso.
A idéia veio de uma antiga postagem de blog dos criadores de Pygments , mas a postagem original não existe mais.
Se você deseja colorir os arquivos de código-fonte, também precisa tornar ~ / .lessfilter executável executando chmod u+x ~/.lessfilter. Você também precisa ter o pycementize ( pygments.org/download ) instalado.
Sergiy Belozorov 18/12/12
Alguém pode confirmar que isso funciona, pois não tem efeito para mim quando executo um comando comols -l | less
puk 30/10
7
@uk você pode fazer algo parecido ls --color=always -l | less -R. Obviamente, muito para digitar, mas você pode usar o apelido para algo assim ll. Ou seja, se você não quiser usar nenhuma biblioteca extra.
PhilT 23/07
2
adicionou o comentário de @ SergiyByelozyorov na resposta.
precisa saber é o seguinte
2
Minha edição foi rejeitada, então acho que vou postá-la como um comentário: não teste os códigos de saída dos comandos indiretamente. Você pode usar if grep -q "#\!/bin/bash" "$1"( -qsuprime a saída padrão). Você pode redirecionar o erro padrão com 2>/dev/null.
Tom Fenech
503
Tente o seguinte:
less -R
de man less:
-r ou --raw-control-chars
Faz com que caracteres de controle "brutos" sejam exibidos. (...)
-R ou --RAW-CONTROL-CHARS
Como -r, mas apenas as seqüências de escape "cor" ANSI são exibidas na forma "bruta". (...)
Isso é útil quando o próprio arquivo contém os códigos de escape que precisam ser exibidos.
Nitrodist
1
Eu costumava conhecer menos -r, mas pesquisar no arquivo usando "/" continuava trazendo as linhas erradas. -R parece fazer um trabalho melhor. Obrigado pela dica.
Amos Shapira
54
Deve-se observar que a maioria dos programas usa o isatty(2)syscall para verificar se a saída padrão é um terminal e, geralmente, desativa a saída colorida. Para qualquer pipe para menos, isattyretornará 0. Para verificar se isso funciona, tenteecho -e '\x1b[32;1mtest\x1b[m' | less -r
mic_e
11
Esta resposta não se destaca no teste realmente faz alguma coisa.
Michael Wolf
18
Você também pode digitar -Rquando já abriu lesspara conseguir isso.
Quando você simplesmente executa grep --color, implica em grep --color=autoqual detecta se a saída é um terminal e, em caso afirmativo, ativa as cores. No entanto, quando detecta um tubo, desativa a coloração. O seguinte comando:
grep --color=always "search string" * | less -R
Sempre habilitará a cor e substituirá a detecção automática, e você obterá o realce da cor em menos.
Aviso: Não coloque --color=alwayscomo um pseudônimo, às vezes isso quebra coisas. É por isso que existe uma --color=autoopção.
Bom obrigado. Exceto que eu preciso usar -Rcomo opção lesstambém.
N
10
Eu acredito que grep -Ré para especificar a pesquisa recursiva. less -Ré necessário para lesscuspir corretamente as cores. grep --color=always [grep cmds] | less -Rfunciona para mim no OS X 10.7.3!
Steven Lu
@ naught101 @Steven Lu Editado em, embora pareça que algumas pessoas talvez não precisem usar less -R(de qualquer maneira, de acordo com o autor da postagem original).
Jtpereyda # 22/13
2
Existe alguma maneira de deixar o grep saber canalizar menos o comando -R e depois colorir? Portanto, não precisamos colocar --color = sempre e menos -R o tempo todo.
A-letubby
1
Esta é de longe a resposta mais simples de trabalho. Obrigado!
Danny Staple
37
Use em viewvez de less. Ele abre o arquivo vimno modo somente leitura.
É praticamente um colorido less: um pager onde você pode pesquisar /(e mais). A única desvantagem é que você não pode sair com qmas precisa:q
Além disso, você obtém a mesma cor que vim(já que está de fato usando vim).
E o desempenho de arquivos grandes? O destaque da sintaxe do Vim é lento em arquivos grandes.
pihentagy
Não sei qual é o seu valor para 'grande', mas abrir um arquivo de ~ 10000 linhas é instantâneo, e a pesquisa é incluída.
Riccardo Galli
1
Votou (não sabia view), mas outra desvantagem é que j / k / para cima / para baixo não rola instantaneamente, pois existe um cursor.
Tyler Collier
7
Observe que você pode precisar adicionar view -ao fazer a tubulação
user45909 2/15/15
6
vimé um editor que carrega o arquivo completo na memória, enquanto lessé um pager, carregando o arquivo apenas parcialmente na memória. Você saberá a diferença com arquivos enormes.
S2 20/07
16
Para dizer menos para mostrar cores, chame-o com -R:
less -R
Infelizmente, alguns programas detectam que seu stdout não é um terminal e desativam cores - por exemplo, pacman (gerenciador de pacotes do Arch Linux).
Nesses casos, é possível usar unbuffer:
unbuffer <command> | less -R
Exemplo usando pacman
unbuffer pacman -Ss firefox | less -R
O unbuffercomando geralmente faz parte do pacote expect(Arch Linux, Debian / Ubuntu) ou expect-dev(versões herdadas do Debian / Ubuntu).
Para responder à pergunta por completo:
Como outros já responderam, pygmentizeé ótimo para colorir o código fonte. Não requer unbuffer. Chamada mais fácil:
Para usar unbufferno Ubuntu, #sudo apt install expect
415 wisbucky
Esta resposta precisa de mais votos.
Thomas Dignan 19/04
Eu estava tentando canalizar a saída do dmesg para verificar os erros de inicialização, mas as cores não funcionavam, a menos que eu usasse o buffer, o que estava confundindo muita coisa: unbuffer dmesg | less -Rfunciona como esperado.
pbhj
15
pygmentizesuporta a -gopção de adivinhar automaticamente o lexer a ser usado, o que é útil para leitura de arquivos STDINsem verificar nenhum tipo de extensão.
Usando isso, você só precisa definir as 2 exportações a seguir no seu, .bashrcsem scripts adicionais:
Conciso e eficaz. Eu prefiro definir um alias, porque às vezes menos é melhor. Então: alias lesc = 'LESS = "- R" LESSOPEN = "| pycementize -g% s" less' '
Tiago
9
Você não disse o que essa cor deveria significar, por exemplo, quais deveriam ser as cores de um arquivo de texto?
Se o que você deseja é o destaque da sintaxe para o código fonte, você precisa de um marcador de código fonte. Às vezes eu uso pycementize assim
pygmentize file.cpp | less
ou
pygmentize file.cpp | more
Existem outros marcadores por aí.
Isso é bem rápido. Se você não se importa em iniciar, vimexiste um modo somente leitura que pode destacar a sintaxe se você o tiver vim.
Se você não lesspipevir nenhum dos programas mencionados lá, verifique se está instalado (a maioria das distros vem com ele).
Adicione o seguinte 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'
Se você não quiser lesspipe, substitua a evalinstrução por:
export LESSOPEN='|~/.lessfilter %s'
Crio ~/.lessfilter
Adicione o seguinte código e torne o arquivo executável: chmod u+x ~/.lessfilter
A única desvantagem dessa abordagem é que o Pygments é um programa Python; portanto, no primeiro uso durante uma sessão de shell, há um atraso de "início a frio". As invocações subsequentes são muito mais rápidas.
Joe Coder
Agradável! Realmente abrangente.
Dario Seidl
4
Use o destaque da fonte GNU ; você pode instalá-lo aptse tiver, ou instalá-lo da fonte. Em seguida, configure um "pré-processador de entrada" por menos, com a ajuda das documentações Source-highligh 'para configurar com menos :
Isto foi sugerido por Konstantine Serebriany. O script src-hilite-lesspipe.sh será instalado juntamente com o destaque da fonte. Você pode usar as seguintes variáveis de ambiente:
Dessa forma, quando você usa menos para procurar um arquivo, se for um arquivo de origem tratado pelo destaque de origem, ele será destacado automaticamente.
Xavier-Emmanuel Vincent recentemente forneceu uma versão alternativa do esquema de cores ANSI, esc256.style: alguns terminais podem lidar com 256 cores. Xavier também forneceu um script que verifica quantas cores o seu terminal pode suportar e, no caso, usa a variante 256. O script é chamado source-highlight-esc.sh e será instalado junto com os outros binários.
Para expandir para outra resposta, você pode fazê-lo funcionar para a maioria, senão todos os scripts que não possuem extensões, alterando um pouco o arquivo .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"
;;
*)
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
Você ainda precisará adicionar as duas variáveis ao .bashrc:
E você ainda precisará tornar o .lessfilter executável:
$ chmod 700 ~/.lessfilter
Também queria acrescentar que, no debian, o pacote pygments é chamado python-pygments. Eu tive problemas para localizá-lo no início, porque o erro ortográfico óbvio de "pigmentos" como "pigmentos" não era o suficiente para sugerir que era um pacote que poderia ser prefixado com "python-" pelo gerenciador de pacotes.
2 comentários: 1) Obrigado pela melhoria. 2) Frases como "melhor resposta votada" não são ótimas; isso pode mudar (na verdade, se isso for melhor do que essa resposta, esse post poderá se tornar a resposta principal, quando será confuso. Talvez diga apenas "expandir sobre outra resposta" ou "resposta do capitão-cômico"?
cpast
2
Você pode considerar o uso de um mostutilitário que é uma alternativa ecologicamente correta para lesse more.
você pode nos mostrar um exemplo? Eu tentei aqui, e a saída foi em preto e branco.
danilo
Sua entrada deve conter cores. Primeiro produzir uma amostra colorised (por exemplo ccze -A </var/log/dpkg.log, ls -1 --color /var/log), em seguida, tubo isso de most: ls -1 --color /var/log | most.
Onlyjob 15/06
sim, eu usei: git status | less --color,git status | most --color
danilo
Eu usei mais, mais, menos, e todas as ferramentas mostram preto e branco
danilo
Certifique-se de que seu comando produz cores antes de canalizar para lessoutras pessoas. Verifique se o emulador de terminal pode gerar cores. Verifique TERMa variável de ambiente. Leia mais em unix.stackexchange.com/questions/148/… Quando possível, use a moderna distribuição GNU + Linux como o Debian . Use motor de busca (por exemplo duckduckgo.com startpage.com ) para encontrar respostas. Lembre-se de que os comentários não são para discussão.
Encontrei esta solução simples e elegante. Você não precisa instalar nada extra, pois ele já existe por padrão na maioria das máquinas. Como vimé instalado por padrão na maioria das máquinas, inclui uma macro para executar vimcomoless
Algumas das opções para usá-lo são para criar um alias:
alias vless='vim -u /usr/share/vim/vim74/macros/less.vim'
ou crie um link simbólico:
ln -s /usr/share/vim/vim74/macros/less.sh ~/bin/vless
Eu tenho alias lesser='/usr/share/vim/vim80/macros/less.sh'em ~/bash_aliases(no Ubuntu 18.04). Pode usar atalhos como f para frente, b para trás, d meio para baixo, u meio para cima, q sair, etc ...
Daniel
0
A solução mais intuitiva e direta para mim foi usando pygmentize
adicionando as linhas abaixo ao .bashrc
less
: cores perdidas. (As respostas a essa “questão tubulação” envolvemless -R
,unbuffer
etc.) Mas a questão real refere-se a abertura de um arquivo ! - A ambiguidade está primariamente no título da pergunta, mas mesmo assim, IMHO a questão ainda é muito ampla: "leia um arquivo" pode se referir a qualquer arquivo (provavelmente texto sem formatação). (bem, "obter o conteúdo em cores" provavelmente está se referindo ao realce da sintaxe.) #less -R
também funcionará em arquivos, por exemplols --color=always > /tmp/file && less -R /tmp/file
Respostas:
Você pode utilizar o poder do pytograma com menos - automaticamente! (Não há necessidade de canalizar manualmente).
Instale
pygments
com o seu gerenciador de pacotes ou pip (possivelmente chamadopython-pygments
) ou obtenha-o aqui http://pygments.org/download/ .Escreva um arquivo
~/.lessfilter
No seu
.bashrc
addAlém disso, você precisa tornar o
~/.lessfilter
executável executandoTestado no Debian.
Você entendeu a ideia. Obviamente, isso pode ser melhorado, aceitando mais extensões ou analisando o shebang para outros intérpretes que não o bash. Veja algumas das outras respostas para isso.
A idéia veio de uma antiga postagem de blog dos criadores de Pygments , mas a postagem original não existe mais.
fonte
chmod u+x ~/.lessfilter
. Você também precisa ter o pycementize ( pygments.org/download ) instalado.ls -l | less
ls --color=always -l | less -R
. Obviamente, muito para digitar, mas você pode usar o apelido para algo assimll
. Ou seja, se você não quiser usar nenhuma biblioteca extra.if grep -q "#\!/bin/bash" "$1"
(-q
suprime a saída padrão). Você pode redirecionar o erro padrão com2>/dev/null
.Tente o seguinte:
de
man less
:fonte
isatty(2)
syscall para verificar se a saída padrão é um terminal e, geralmente, desativa a saída colorida. Para qualquer pipe para menos,isatty
retornará 0. Para verificar se isso funciona, tenteecho -e '\x1b[32;1mtest\x1b[m' | less -r
-R
quando já abriuless
para conseguir isso.Eu recebi a resposta em outro post: Less e Grep: Obtendo resultados coloridos ao usar um pipe de grep para less
Aviso: Não coloque
--color=always
como um pseudônimo, às vezes isso quebra coisas. É por isso que existe uma--color=auto
opção.fonte
-R
como opçãoless
também.grep -R
é para especificar a pesquisa recursiva.less -R
é necessário paraless
cuspir corretamente as cores.grep --color=always [grep cmds] | less -R
funciona para mim no OS X 10.7.3!less -R
(de qualquer maneira, de acordo com o autor da postagem original).Use em
view
vez deless
. Ele abre o arquivovim
no modo somente leitura.É praticamente um colorido
less
: um pager onde você pode pesquisar /(e mais). A única desvantagem é que você não pode sair com qmas precisa:q
Além disso, você obtém a mesma cor que
vim
(já que está de fato usandovim
).fonte
view
), mas outra desvantagem é que j / k / para cima / para baixo não rola instantaneamente, pois existe um cursor.view -
ao fazer a tubulaçãovim
é um editor que carrega o arquivo completo na memória, enquantoless
é um pager, carregando o arquivo apenas parcialmente na memória. Você saberá a diferença com arquivos enormes.Para dizer menos para mostrar cores, chame-o com -R:
Infelizmente, alguns programas detectam que seu stdout não é um terminal e desativam cores - por exemplo, pacman (gerenciador de pacotes do Arch Linux).
Nesses casos, é possível usar
unbuffer
:Exemplo usando pacman
O
unbuffer
comando geralmente faz parte do pacoteexpect
(Arch Linux, Debian / Ubuntu) ouexpect-dev
(versões herdadas do Debian / Ubuntu).Para responder à pergunta por completo:
Como outros já responderam,
pygmentize
é ótimo para colorir o código fonte. Não requerunbuffer
. Chamada mais fácil:fonte
unbuffer
no Ubuntu, #sudo apt install expect
unbuffer dmesg | less -R
funciona como esperado.pygmentize
suporta a-g
opção de adivinhar automaticamente o lexer a ser usado, o que é útil para leitura de arquivosSTDIN
sem verificar nenhum tipo de extensão.Usando isso, você só precisa definir as 2 exportações a seguir no seu,
.bashrc
sem scripts adicionais:fonte
Você não disse o que essa cor deveria significar, por exemplo, quais deveriam ser as cores de um arquivo de texto?
Se o que você deseja é o destaque da sintaxe para o código fonte, você precisa de um marcador de código fonte. Às vezes eu uso pycementize assim
ou
Existem outros marcadores por aí.
Isso é bem rápido. Se você não se importa em iniciar,
vim
existe um modo somente leitura que pode destacar a sintaxe se você o tivervim
.ou, alternativamente, veja a resposta de churnd.
fonte
Esta é mais uma resposta baseada em pigmentos , com várias melhorias importantes:
lesspipe
oulessfile
filtraless
Instalar pigmentos e Gawk
Definir variáveis de ambiente
Verifique se
lesspipe
oulessfile
já está ativado:Se você não
lesspipe
vir nenhum dos programas mencionados lá, verifique se está instalado (a maioria das distros vem com ele).Adicione o seguinte a
~/.bashrc
:Se você não quiser
lesspipe
, substitua aeval
instrução por:Crio
~/.lessfilter
Adicione o seguinte código e torne o arquivo executável:
chmod u+x ~/.lessfilter
fonte
Use o destaque da fonte GNU ; você pode instalá-lo
apt
se tiver, ou instalá-lo da fonte. Em seguida, configure um "pré-processador de entrada" por menos, com a ajuda das documentações Source-highligh 'para configurar com menos :fonte
Para expandir para outra resposta, você pode fazê-lo funcionar para a maioria, senão todos os scripts que não possuem extensões, alterando um pouco o arquivo .lessfilter:
Você ainda precisará adicionar as duas variáveis ao .bashrc:
E você ainda precisará tornar o .lessfilter executável:
Também queria acrescentar que, no debian, o pacote pygments é chamado python-pygments. Eu tive problemas para localizá-lo no início, porque o erro ortográfico óbvio de "pigmentos" como "pigmentos" não era o suficiente para sugerir que era um pacote que poderia ser prefixado com "python-" pelo gerenciador de pacotes.
fonte
Você pode considerar o uso de um
most
utilitário que é uma alternativa ecologicamente correta paraless
emore
.fonte
ccze -A </var/log/dpkg.log
,ls -1 --color /var/log
), em seguida, tubo isso demost
:ls -1 --color /var/log | most
.git status | less --color
,git status | most --color
less
outras pessoas. Verifique se o emulador de terminal pode gerar cores. VerifiqueTERM
a variável de ambiente. Leia mais em unix.stackexchange.com/questions/148/… Quando possível, use a moderna distribuição GNU + Linux como o Debian . Use motor de busca (por exemplo duckduckgo.com startpage.com ) para encontrar respostas. Lembre-se de que os comentários não são para discussão.Condensado do meu post completo sobre como melhorar menos experiência: https://www.topbug.net/blog/2016/09/27/make-gnu-less-more-powerful/
Para páginas de manual coloridas, adicione o seguinte ao seu
.bashrc
ou.zshrc
:Para realçar a sintaxe, use um poderoso existente
lesspipe.sh
para lidar com isso, em vez de escrever o seu próprio: https://github.com/wofr06/lesspipefonte
Encontrei esta solução simples e elegante. Você não precisa instalar nada extra, pois ele já existe por padrão na maioria das máquinas. Como
vim
é instalado por padrão na maioria das máquinas, inclui uma macro para executarvim
comoless
Algumas das opções para usá-lo são para criar um alias:
alias vless='vim -u /usr/share/vim/vim74/macros/less.vim'
ou crie um link simbólico:
ln -s /usr/share/vim/vim74/macros/less.sh ~/bin/vless
Então você apenas corre
vless myfile.py
Eu tenho a maioria das informações aqui
fonte
alias lesser='/usr/share/vim/vim80/macros/less.sh'
em~/bash_aliases
(no Ubuntu 18.04). Pode usar atalhos como f para frente, b para trás, d meio para baixo, u meio para cima, q sair, etc ...A solução mais intuitiva e direta para mim foi usando
pygmentize
adicionando as linhas abaixo ao .bashrc
Caso você não possa ligar
pygmentize
, basta instalar comops. O
pygmentize
binário executável ficava/usr/local/bin/
no seu/home/username/.virtualenv/venvname/bin/
ou em algum lugar.fonte
Nenhuma delas estava funcionando bem para mim e eu descobri uma maneira fácil de fazer esse trabalho, então pensei em compartilhar.
Basta usar o tmux, que permite acessar e rolar por uma história maior e preservar as cores perfeitamente.
fonte
Contanto que o texto de saída tenha caracteres de controle de cores, o
less -R
fará.fonte