Ao ler um ficheiro com &007 ou &007, como posso obter o conteúdo em cores?
Ao ler um ficheiro em Linux com o comando less
ou more
, como posso obter o conteúdo em cores?
Ao ler um ficheiro em Linux com o comando less
ou more
, como posso obter o conteúdo em cores?
Experimente o seguinte:
less -R
man less
:
-r
ou--raw-control-chars
Provoca a exibição de caracteres de controlo “brutos”. (…)
-R
ou--RAW-CONTROL-CHARS
Como
-r
, mas apenas as sequências de fuga “a cores” ANSI são produzidas sob a forma “em bruto”. (…)
(actualização em 2020)
A forma mais rápida seria utilizar o less -R
ref. https://superuser.com/a/117842/34893
Pode utilizar o poder da pigmentação com menos - automaticamente! (Não é necessário canalizar manualmente.)
Instale o pygments
com o seu gestor de pacotes ou pip (possivelmente chamado python-pygments
) ou obtenha-o aqui http://pygments.org/download/ .
Escreva um ficheiro ~/.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
No seu .bashrc
adicione
export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'
Também precisa de tornar o ~/.lessfilter
executável executando
chmod u+x ~/.lessfilter
Testado em Debian.
A ideia é sua. Isto pode, claro, ser melhorado, aceitando mais extensões ou analisando o shebang para outros intérpretes do que a bash. Veja algumas das outras respostas para isso.
A ideia veio de um antigo post de blog dos criadores de Pygments , mas o post original já não existe.
Recebi a resposta noutro posto: Menos e Grep: Obtendo resultados coloridos ao usar um pipe do grep para o less
Quando você simplesmente executa
grep --color
implicagrep --color=auto
que detecta se a saída é um terminal e se assim permite cores. No entanto, quando detecta um tubo, desactiva a coloração. O seguinte comando:grep --color=always "search string" * | less -R
irá sempre activar a coloração e anular a detecção automática, e obterá o realce da cor em menos.
Aviso: Não coloque o --color=always
como um pseudónimo, às vezes quebra as coisas. É por isso que existe uma opção --color=auto
.
Use view
em vez de less
. Abre o ficheiro com vim
em modo só leitura.
É praticamente um less
colorido: um pager onde pode pesquisar com / (e mais). A única desvantagem é que não pode sair com q mas precisa do :q
Além disso, obtém a mesma cor do vim
(uma vez que está de facto a usar o vim
).
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 desativam as cores - por exemplo, pacman (gerenciador de pacotes Arch Linux).
Nesses casos é possível usar unbuffer
:
unbuffer <command> | less -R
Exemplo usando pacman
unbuffer pacman -Ss firefox | less -R
O comando unbuffer
é normalmente parte do pacote expect
(Arch Linux, Debian/Ubuntu) ou expect-dev
(versões antigas do Debian/Ubuntu).
Para responder à pergunta por completude:
Como outros já responderam, pygmentize
é ótimo para colorir código fonte. Ele não requer o unbuffer
. Chamada mais fácil:
pygmentize someSource.cpp | less -R
pygmentize
suporta a opção -g
para adivinhar automaticamente o lexer a ser utilizado, o que é útil para ficheiros lidos a partir de STDIN
sem verificar qualquer tipo de extensão.
Usando isso, só precisa de definir as 2 exportações seguintes no seu .bashrc
sem quaisquer scripts adicionais:
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
Não disse o que esta cor deve significar, por exemplo, quais devem ser as cores para um ficheiro de texto?
Se o que pretende é realçar a sintaxe para o código fonte, precisa de um marcador de código fonte. Eu por vezes uso pygmentize como este
pygmentize file.cpp | less
ou
pygmentize file.cpp | more
Há outros realçadores à volta.
Isto é bastante rápido. Se não se importar de disparar vim
há um modo só de leitura que lhe pode dar destaque de sintaxe se o tiver em vim
.
view file.cpp
ou alternativamente ver a resposta do churnd.
Esta é mais uma resposta de pygments , com várias melhorias importantes:
lesspipe
ou lessfile
filtros less
sudo apt-get install python-pygments python3-pygments gawk
lesspipe
ou lessfile
já está activado:echo $LESSOPEN
Se não vir nenhum dos programas aí referenciados, certifique-se de que lesspipe
está instalado (a maioria das distros 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 não quiser lesspipe
, substitua a declaração eval
por:
export LESSOPEN='|~/.lessfilter %s'
~/.lessfilter
Adicione o seguinte código e torne o ficheiro 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
Utilize o GNU Source-highlight ; pode instalá-lo com apt
se o tiver, ou instalá-lo de outra forma a partir do código fonte. Depois configure um “pré-processador de entrada” para menos, com a ajuda da documentação do Source-highligh para configurar com menos :
Isto foi sugerido por Konstantine Serebriany. O script src-hilite-lesspipe.sh será instalado juntamente com o source-highlight. Pode utilizar as seguintes variáveis de ambiente:
export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
export LESS=' -R '
Desta forma, quando utiliza menos para navegar num ficheiro, se for um ficheiro de origem tratado por source-highlight, este será automaticamente realçado.
Xavier-Emmanuel Vincent forneceu recentemente uma versão alternativa do esquema de cores ANSI, esc256.style: alguns terminais podem lidar com 256 cores. A Xavier também forneceu um script que verifica quantas cores o seu terminal pode manusear e, em caso afirmativo, utiliza a variante 256. O script é chamado source-highlight-esc.sh e será instalado juntamente com os outros binários.
Condensado do meu post completo no blogue sobre 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
:
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 realce de sintaxe, usando um lesspipe.sh
poderoso existente para lidar com ele em vez de escrever o seu próprio &007: https://github.com/wofr06/lesspipe
Para expandir uma outra resposta, pode fazê-lo funcionar para a maioria, se não para todos os seus scripts que não têm extensões, alterando o ficheiro .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
Ainda precisa de adicionar as duas variáveis a . bashrc:
export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'
E ainda precisará de tornar .lessfilter executável:
$ chmod 700 ~/.lessfilter
Também queria acrescentar que no debian o pacote python-pygments se chama python-pygments. Eu tive dificuldade em localizá-lo no início porque a evidente erro ortográfico de “pigmentos” como “pygments” não foi uma dica suficiente para mim de que era um pacote que poderia ser prefixado com “python-” pelo gerente do pacote.
Encontrei esta simples e elegante solução. Não tem de instalar nada extra, pois já está lá por defeito na maioria das máquinas. Como o vim
está instalado por defeito na maioria das máquinas, inclui uma macro para correr vim
como less
Algumas das opções para o utilizar são criar um alias:alias vless='vim -u /usr/share/vim/vim74/macros/less.vim'
ou criar um link simbólico:ln -s /usr/share/vim/vim74/macros/less.sh ~/bin/vless
Depois basta correr vless myfile.py
Tenho a maior parte da informação aqui
A solução mais intuitiva e directa para mim foi usar pygmentize
adicionando as linhas abaixo a .bashrc
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
No caso de não poder ligar para pygmentize
, basta instalar como
pip install pygments
ps. O binário executável pygmentize
sentar-se-ia em /usr/local/bin/
ou no seu /home/username/.virtualenv/venvname/bin/
ou algures.
Uma alternativa a menos/mais que funcione com cores fora da caixa é o morcego. Pode instalá-lo com a maioria dos gestores de pacotes que o utilizam como pager, bem como um substituto de gato. https://github.com/sharkdp/bat
Desde que o texto de saída tenha caracteres de controlo de cor, less -R
serve.