Obtenha cores em menos ou mais

355

Quando leio um arquivo no Linux com o comando less ou more , como posso obter o conteúdo em cores?

    
por flow 09.03.2010 / 11:44

14 respostas

133

Você pode utilizar o poder do pygmentize com menos - automaticamente! (Não há necessidade de canalizar à mão.)

Instale pygments com seu gerenciador de pacotes ou pip (possivelmente chamado de python-pygments ) ou acesse aqui o link .

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"
        ;;
    *)
        grep "#\!/bin/bash" "$1" > /dev/null
        if [ "$?" -eq "0" ]; then
            pygmentize -f 256 -l sh "$1"
        else
            exit 1
        fi
esac

exit 0

No seu .bashrc add

export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'

Além disso, você precisa tornar o ~/.lessfilter executável executando

chmod u+x ~/.lessfilter

Testado no Debian.

A idéia veio de uma postagem de blog antiga dos criadores de Pygments , mas a postagem original não existe mais.

    
por 20.09.2011 / 05:29
421

Tente o seguinte:

less -R

de man less :

-r or --raw-control-chars

Causes "raw" control characters to be displayed. (...)

-R or --RAW-CONTROL-CHARS

Like -r, but only ANSI "color" escape sequences are output in "raw" form. (...)

    
por 09.03.2010 / 11:48
118

Eu tenho a resposta em outro post: menos e grep: obtendo resultados coloridos ao usar um pipe do grep para menos

When you simply run grep --color it implies grep --color=auto which detects whether the output is a terminal and if so enables colors. However, when it detects a pipe it disables coloring. The following command:

grep --color=always "search string" * | less -R

Will always enable coloring and override the automatic detection, and you will get the color highlighting in less.

Aviso: não coloque --color=always como um alias. Às vezes, ele quebra as coisas. É por isso que existe uma opção --color=auto .

    
por 27.04.2011 / 06:19
29

Use view em vez de less . Ele abre o arquivo com vim no modo somente leitura.

É praticamente uma cor less : um pager onde você pode pesquisar com / (e mais). A única desvantagem é que você não pode sair com q , mas você precisa de :q

Além disso, você obtém a mesma coloração de vim (já que você está usando vim ).

    
por 24.09.2013 / 11:50
12

pygmentize suporta a opção -g para adivinhar automaticamente o léxico a ser usado, o que é útil para arquivos lidos de STDIN sem verificar qualquer tipo de extensão.

Usando isso, você só precisa definir as 2 exportações a seguir no seu .bashrc sem nenhum script adicional:

export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
    
por 12.03.2013 / 08:17
9

Você não disse o que essa cor deveria significar, por exemplo quais devem ser as cores de um arquivo de texto?

Se o que você deseja é o realce de sintaxe para o código-fonte, você precisa de um marcador de código-fonte. Eu às vezes uso pygmentize assim

pygmentize file.cpp | less

ou

pygmentize file.cpp | more

Existem outros marcadores ao redor.

Isso é bem rápido. Se você não se importa de ativar vim , há um modo somente leitura que pode fornecer realce de sintaxe se você o tiver em vim .

view file.cpp

ou, alternativamente, veja a resposta do churnd.

    
por 09.03.2010 / 14:30
8

Para dizer menos para mostrar cores, chame-o com -R:

less -R
Infelizmente, alguns programas detectam que seu stdout não é um terminal e desabilita 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 comando unbuffer geralmente faz parte do pacote expect-dev (Debian / Ubuntu) ou expect (Arch Linux).

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:

pygmentize someSource.cpp | less -R
    
por 08.10.2016 / 12:37
3

Use o destaque do GNU Source ; você pode instalá-lo com apt , se tiver, ou instalá-lo da fonte. Em seguida, configure um "pré-processador de entrada" por menos, com a ajuda das documentações do Source-highligh 'para configurando com menos :

This was suggested by Konstantine Serebriany. The script src-hilite-lesspipe.sh will be installed together with source-highlight. You can use the following environment variables:

 export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
 export LESS=' -R '

This way, when you use less to browse a file, if it is a source file handled by source-highlight, it will be automatically highlighted.

Xavier-Emmanuel Vincent recently provided an alternative version of ANSI color scheme, esc256.style: some terminals can handle 256 colors. Xavier also provided a script which checks how many colors your terminal can handle, and in case, uses the 256 variant. The script is called source-highlight-esc.sh and it will be installed together with the other binaries.

    
por 25.05.2014 / 21:52
3

Para expandir outra resposta, você pode fazer com que funcione para a maioria, se não para todos os seus 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 precisa adicionar as duas variáveis ao .bashrc:

export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'

E você ainda precisará criar o executável .lessfilter:

$ chmod 700 ~/.lessfilter

Além disso, gostaria de acrescentar que, no debian, o pacote pygments é chamado python-pygments. Eu tive problemas para localizá-lo no começo porque o erro de grafia óbvio de "pigmentos" como "pygments" não era o suficiente para indicar que era um pacote que poderia ser prefixado com "python-" pelo gerenciador de pacotes.

    
por 27.02.2013 / 23:45
3

Esta é mais uma resposta baseada em pygments , com várias melhorias importantes:

  • não quebra lesspipe ou lessfile filtros
  • funciona com várias entradas para less
  • analisa corretamente o tipo de script do cabeçalho da shebang
  • funciona para todos os 434 tipos de arquivos lexáveis por Pygments
  • O
  • esquema de cores é parametrizado como uma variável de ambiente

Instalar Pygments e Gawk

sudo apt-get install python-pygments python3-pygments gawk

Definir variáveis de ambiente

Verifique se lesspipe ou lessfile já está ativado:

echo $LESSOPEN

Se você não visualizar nenhum dos programas mencionados aqui, certifique-se de que lesspipe esteja instalado (a maioria das distribuições vem com ele) .

Adicione o seguinte 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'

Se você não quiser lesspipe , substitua a instrução eval por:

export LESSOPEN='|~/.lessfilter %s'

Criar ~/.lessfilter

Adicione o seguinte código e torne o arquivo executável: 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
    
por 29.05.2017 / 11:21
2

Você pode considerar o uso do utilitário most , que é uma alternativa que aceita cores para less e more .

    
por 22.08.2013 / 02:34
1

Condensada em meu post completo sobre melhorar menos experiência: link

Para manpages coloridas, adicione o seguinte ao seu .bashrc ou .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 destacar a sintaxe, usando um poderoso lesspipe.sh para lidar com ele, em vez de escrever o seu próprio: link

    
por 04.10.2016 / 04:51
0

Eu encontrei esta solução elegante e simples. Você não precisa instalar nada extra, pois ele já está lá por padrão na maioria das máquinas. Como vim é instalado por padrão na maioria das máquinas, ele inclui uma macro para executar vim como less

Algumas das opções para usá-lo são 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ê acabou de executar vless myfile.py

Eu obtive a maioria das informações aqui

    
por 31.05.2018 / 11:59
-2

Nada disso funcionou para mim e descobri uma maneira fácil de fazer isso funcionar, então pensei em compartilhar.

Basta usar o tmux, que permite acessar e percorrer um histórico maior e preserva as cores perfeitamente.

    
por 25.01.2018 / 19:35