Kiedy czytam plik z komendą &007 lub &007, jak mogę uzyskać zawartość w kolorach?
Kiedy czytam plik w Linuksie z komendą less
lub more
, jak mogę uzyskać zawartość w kolorach?
Kiedy czytam plik w Linuksie z komendą less
lub more
, jak mogę uzyskać zawartość w kolorach?
Spróbuj:
less -R
od man less
:
-r
lub--raw-control-chars
Powoduje wyświetlanie “surowych” znaków kontrolnych. (…)
-R
lub--RAW-CONTROL-CHARS
Like
-r
, but only ANSI “color” escape sequences are output in “raw” form. (…)
(aktualizacja w 2020 r.)
Szybszym sposobem byłoby użycie less -R
ref. https://superuser.com/a/117842/34893
Możesz wykorzystać moc pygmentacji z mniejszą ilością - automatycznie! (Nie ma potrzeby ręcznego pipe'a.)
Zainstaluj pygments
za pomocą swojego menedżera pakietów lub pip'a (możliwe, że nazywa się python-pygments
) lub uzyskaj go tutaj http://pygments.org/download/ .
Napisz plik ~/.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
W swoim .bashrc
dodaj
export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'
Musisz także uczynić ~/.lessfilter
wykonywalnym przez uruchomienie
chmod u+x ~/.lessfilter
Przetestowany na Debianie.
Wpadasz na ten pomysł. Oczywiście można go jeszcze bardziej ulepszyć, akceptując więcej rozszerzeń lub parsowanie shebang dla innych interpretatorów niż bash. Zobacz kilka innych odpowiedzi na to pytanie.
Pomysł pochodzi ze starego wpisu na blogu twórców Pigmentów , ale oryginalny wpis już nie istnieje.
Dostałem odpowiedź w innym poście: [ Less i Grep. ] Uzyskanie kolorowych wyników przy użyciu rurki od grepu do less ](https://superuser.com/questions/36022/less-and-grep-color)
Kiedy po prostu uruchomisz
grep --color
, oznacza to, żegrep --color=auto
wykrywa czy wyjście jest terminalem, a jeśli tak to włącza kolory. Jednakże, gdy wykryje rurkę, wyłącza ona kolorowanie. Następująca komenda:grep --color=always "search string" * | less -R
Zawsze włączy kolorowanie i zastąpi automatyczne wykrywanie, a podświetlenie kolorów otrzymasz w mniej.
Ostrzeżenie: Nie umieszczaj --color=always
jako aliasu, czasem coś zepsuje. Dlatego właśnie istnieje opcja --color=auto
.
Użyj view
zamiast less
. Otwiera on plik z vim
w trybie tylko do odczytu.
Jest to praktycznie kolorowy less
: pager, na którym można szukać za pomocą / (i więcej). Jedyną wadą jest to, że nie możesz wyjść za pomocą q, ale potrzebujesz :q
Ponadto, otrzymujesz to samo zabarwienie co vim
(ponieważ w rzeczywistości używasz vim
).
Aby mniej powiedzieć, aby pokazać kolory, zadzwoń do -R:
less -R
Niestety niektóre programy wykrywają, że ich stdout nie jest terminalem i wyłączają kolory - np. pacman (menedżer pakietów Arch Linux).
W tych przypadkach możliwe jest użycie unbuffer
:
unbuffer <command> | less -R
Przykład użycia pakera
unbuffer pacman -Ss firefox | less -R
Polecenie unbuffer
jest zazwyczaj częścią pakietu expect
(Arch Linux, Debian/Ubuntu) lub expect-dev
(starsze wersje Debiana/Ubuntu).
Aby odpowiedzieć na pytanie o kompletność:
Jak inni już odpowiedzieli, pygmentize
jest świetny do kolorowania kodu źródłowego. Nie wymaga unbuffer
. Najłatwiejsze połączenie:
pygmentize someSource.cpp | less -R
pygmentize
obsługuje opcję -g
umożliwiającą automatyczne odgadnięcie leksera, który jest użyteczny dla plików odczytywanych z STDIN
bez sprawdzania typu rozszerzenia.
Używając tego, wystarczy ustawić w .bashrc
tylko następujące 2 eksportu bez żadnych dodatkowych skryptów:
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
Nie powiedziałeś, co ten kolor powinien oznaczać, np. jakie powinny być kolory dla pliku tekstowego?
Jeśli chcesz kolorowanie składni dla kodu źródłowego, potrzebujesz kolorowania kodu źródłowego. Czasami używam pygmentize jak ten
pygmentize file.cpp | less
lub
pygmentize file.cpp | more
Wokół są inne kolorowanki.
To jest dość szybkie. If you don’t mind fireing up vim
there is a read-only mode that can give you syntax highlighting if you have it in vim
.
view file.cpp
or alternatively see churnd’s answer.
Jest to kolejna odpowiedź oparta na pygmentach , z kilkoma znaczącymi usprawnieniami:
lesspipe
lub lessfile
filtrów less
sudo apt-get install python-pygments python3-pygments gawk
Sprawdź czy lesspipe
lub lessfile
jest już włączone:
echo $LESSOPEN
If you don’t see either program referenced there, ensure that lesspipe
is installed (most distros come with it).
Add the following to ~/.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'
If you don’t want lesspipe
, replace the eval
statement with:
export LESSOPEN='|~/.lessfilter %s'
~/.lessfilter
Add the following code and make the file executable: 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
Użyj GNU Source-highlight ; możesz zainstalować go z apt
, jeśli go masz, lub w inny sposób zainstalować go ze źródła. Następnie ustaw “preprocesor wejścia” dla less, z pomocą dokumentacji Source-highligh dla ustawienie z less :
To zostało zasugerowane przez Konstantine'a Serebriany. Skrypt src-hilite-lesspipe.sh zostanie zainstalowany razem z source-highligh'em. Możesz użyć następujących zmiennych środowiskowych:
export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
export LESS=' -R '
W ten sposób, gdy używasz less do przeglądania pliku, jeśli jest to plik źródłowy obsługiwany przez source-highlight, zostanie on automatycznie podświetlony.
Xavier-Emmanuel Vincent ostatnio dostarczył alternatywną wersję schematu kolorów ANSI, esc256.style: niektóre terminale mogą obsługiwać 256 kolorów. Xavier dostarczył również skrypt, który sprawdza, ile kolorów może obsłużyć twój terminal, a w przypadku, gdy używa wariantu 256. Skrypt jest nazywany source-highlight-esc.sh i będzie instalowany razem z innymi binariami.
z mojego pełnego wpisu na blogu o poprawieniu mniejszego doświadczenia: https://www.topbug.net/blog/2016/09/27/make-gnu-less-more-powerful/ _
Dla kolorowych stron, dodaj do .bashrc
lub .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
Dla podświetlania składni, używając istniejącego potężnego lesspipe.sh
aby obsłużyć go zamiast pisać własne: https://github.com/wofr06/lesspipe
Aby rozwinąć inną odpowiedź, możesz sprawić, że będzie ona działała dla większości, jeśli nie dla wszystkich twoich skryptów, które nie mają rozszerzeń, zmieniając plik .lessfilter na około:
#!/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
Nadal będziesz musiał dodać te dwie zmienne do . bashrc:
export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'
I nadal będziesz musiał uczynić .lessfilter wykonywalnym:
$ chmod 700 ~/.lessfilter
Również chciałem dodać, że pod debianem pakiet pygments nazywa się python-pygments. Na początku miałam trudności z jego zlokalizowaniem, ponieważ oczywista błędna pisownia “pigmentów” jako “pygmentów” nie była dla mnie wystarczającą wskazówką, że jest to pakiet, który może być poprzedzony “python-” przez menedżera pakietów.
Znalazłem to proste, eleganckie rozwiązanie. Nie musisz instalować niczego dodatkowego, ponieważ jest to już domyślnie zainstalowane na większości maszyn. Ponieważ vim
jest domyślnie zainstalowany na większości maszyn, zawiera makro do uruchomienia vim
jak less
Niektóre z opcji, aby go użyć to stworzenie aliasu:alias vless='vim -u /usr/share/vim/vim74/macros/less.vim'
lub stworzenie symbolicznego linku:ln -s /usr/share/vim/vim74/macros/less.sh ~/bin/vless
Następnie wystarczy uruchomić vless myfile.py
Mam większość informacji tutaj
Najbardziej intuicyjnym i prostym rozwiązaniem było dla mnie użycie pygmentize
poprzez dodanie poniższych linii do .bashrc
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
W przypadku, gdy nie mogłeś zadzwonić do pygmentize
, po prostu zainstaluj jak
pip install pygments
ps. pygmentize
wykonywalny binarny będzie siedział w /usr/local/bin/
lub w Twoim /home/username/.virtualenv/venvname/bin/
lub gdzieś.
Alternatywą dla mniej/więcej, która działa z kolorami z pudełka, jest nietoperz. Możesz go zainstalować z większością menedżerów pakietów, używaj go jako pagera, jak również jako zamiennika kota. https://github.com/sharkdp/bat
Tak długo jak tekst wyjściowy ma znaki kontroli koloru, less -R
to zrobi.