Questão Obter cores em menos ou mais


Quando eu leio um arquivo no Linux com o comando less ou moreComo posso obter o conteúdo em cores?


342


origem


Isso parece relacionado: superuser.com/questions/36022/less-and-grep-color - ajuda? - Jonik


Respostas:


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

Instalar pygments com seu gerenciador de pacotes ou pip (possivelmente chamado python-pygmentsou pegue 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"
        ;;
    *)
        grep "#\!/bin/bash" "$1" > /dev/null
        if [ "$?" -eq "0" ]; then
            pygmentize -f 256 -l sh "$1"
        else
            exit 1
        fi
esac

exit 0

Na tua .bashrc adicionar

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

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

chmod u+x ~/.lessfilter

Testado no Debian.

A ideia veio de um post antigo do blog fabricantes de Pygments, mas o post original não existe mais.


124



Se você quer colorir os arquivos do código fonte, você também precisa tornar o ~ / .lessfilter executável rodando chmod u+x ~/.lessfilter. Você também precisa ter pygmentize (pygments.org/download) instalado. - Sergiy Byelozyorov
Alguém pode confirmar que isso funciona, pois não tem efeito para mim quando eu executar um comando como ls -l | less - puk
Alguma idéia de como encadear isso com o lessopen.sh de Vladimir Linek? é configurado com este formulário: LESSOPEN = "lessopen.sh% s" - Gregory
@puk você pode fazer algo parecido ls --color=always -l | less -R. Obviamente, muito a digitar, mas você poderia apelidar de algo como ll. Isto é, se você não quiser usar nenhuma biblioteca extra. - PhilT
adicionado @ comentário de SergiyByelozyorov na resposta. - andrybak


Tente o seguinte:

less -R

a partir de man less:

-r ou --raw-control-chars

Faz com que os caracteres de controle "brutos" sejam exibidos. (...)

-R ou --RAW-CONTROL-CHARS

Gostar -r, mas apenas as seqüências de escape "coloridas" ANSI são exibidas na forma "bruta". (...)


405



Isso é útil quando o próprio arquivo contém os códigos de escape que precisam ser exibidos. - Nitrodist
Eu costumava saber sobre menos -r, mas pesquisar no arquivo usando "/" continuava trazendo as linhas erradas. -R parece fazer um trabalho melhor. Obrigado pela dica. - Amos Shapira
Deve-se notar que a maioria dos programas usa o isatty(2) syscall para verificar se a saída padrão é um terminal e geralmente desabilita a saída colorida se não for. Para qualquer tubo para menos, isattyretornará 0. Para verificar se isso funciona, tente echo -e '\x1b[32;1mtest\x1b[m' | less -r - mic_e
Esta resposta não se sobressai na verdade faz algo teste. - Michael Wolf
Você também pode digitar -R quando você já abriu less Para alcançar isto. - Scz


Eu recebi a resposta em outro post: Less e Grep: Obtendo resultados coloridos ao usar um pipe do grep para menos

Quando você simplesmente corre grep --color isto   implica grep --color=auto qual   detecta se a saída é um   terminal e se sim, permite cores.   No entanto, quando detecta um tubo,   desativa a coloração. Os seguintes   comando:

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

Sempre permitirá colorir e   substituir a detecção automática e   você vai ter a cor destacando em   Menos.

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


114



Bom obrigado. Exceto que eu preciso usar -R como uma opção para less, também. - naught101
Acredito grep -R é para especificar pesquisa recursiva. less -R é necessário para less para cuspir corretamente as cores de volta. grep --color=always [grep cmds] | less -R funciona para mim no OS X 10.7.3! - Steven Lu
@ naught101 @Steven Lu Editado, embora pareça que algumas pessoas podem não precisar usar less -R (de acordo com o autor do post original, de qualquer forma). - jtpereyda
Existe alguma maneira de deixar o grep saber apenas canalizar menos o comando -R e depois fazer a coloração? Então, não temos que colocar --color = sempre e menos - R o tempo todo. - A-letubby
Esta é de longe a resposta mais simples de trabalho. Obrigado! - Danny Staple


Usar view ao invés de less. Abre o arquivo com vim no modo somente leitura.

É praticamente um colorido less: um pager onde você pode pesquisar com / (e mais). O único inconveniente é que você não pode sair com q mas você precisa :q

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


30



Como sobre o desempenho de arquivos grandes? O realce de sintaxe do Vim é conhecido por ser lento em arquivos grandes. - pihentagy
Eu não sei qual é o seu valor para 'big', mas abrir um arquivo de ~ 10000 linhas é instantâneo, procure dentro incluído. - Riccardo Galli
Eu inventei (eu não sabia sobre view) mas outra desvantagem é que j / k / up / down não rola instantaneamente, já que existe um cursor. - Tyler Collier
Note que você pode precisar adicionar view - quando a tubulação - user45909
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. - sjas


Use o VIM como um pager de destaque de sintaxe.


12



não, eu pedi mais (ou menos), não por vim obrigado de qualquer maneira - flow
Obviamente, o realce de sintaxe não é incorporado em mais ou menos por padrão, portanto, a solução alternativa está usando um alias para uma das macros do VIM. Ele se comporta mais ou menos como mais ou menos. :) - churnd
Se você preferir usar o vim ao invés do vim emulando menos, você pode fazer ... | vim - ler de stdin, ou ... | vim -R - para somente leitura (para evitar "Não escreva desde a última alteração" ao sair). Alias ​​para uso rápido: alias r='vim -R -' então ... | r - bain


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

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

export LESS='-R'
export LESSOPEN='|pygmentize -g %s'

11



Conciso e eficaz. Eu prefiro definir um alias, porque às vezes menos é melhor. Então: alias lesc = 'LESS = "- R" LESSOPEN = "| pygmentize -g% s" menos " - Tiago


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 como isso

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 disparar vim existe um modo somente leitura que pode dar destaque à sintaxe se você o tiver em vim.

view file.cpp

ou, alternativamente, veja a resposta do churnd.


9





Para dizer menos para mostrar as 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 o pacman

unbuffer pacman -Ss firefox | less -R

o unbuffer comando é geralmente parte do expect-dev(Debian / Ubuntu) ou expect Pacote (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

7





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

Isso foi sugerido por Konstantine Serebriany. O script src-hilite-lesspipe.sh será instalado junto com o destaque da fonte. Você pode usar as seguintes variáveis ​​de ambiente:

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

Dessa forma, quando você usa menos para navegar em um arquivo, se for um arquivo de origem manipulado pelo recurso de destaque da fonte, ele será realçado automaticamente.

Xavier-Emmanuel Vincent forneceu recentemente uma versão alternativa do esquema de cores ANSI, esc256.style: alguns terminais podem manipular 256 cores. Xavier também forneceu um script que verifica quantas cores seu terminal pode manipular e, no caso, usa a variante 256. O script é chamado de source-highlight-esc.sh e será instalado junto com os outros binários.


3





Para expandir uma 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 o arquivo .lessfilter apenas um pouco:

#!/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á fazer o .lessfilter executable:

$ 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 ó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.


3



2 comentários: 1) Obrigado pela melhoria. 2) Frases como "votou melhor resposta" não são ótimas; que pode mudar (na verdade, se é melhor que essa resposta, esta A postagem pode se tornar a melhor resposta, e nesse ponto ela será confusa. Talvez apenas dizer "expandir em cima de outra resposta" ou "resposta de capitão de guerra"? - cpast