Получайте цвета меньше или больше

176023
flow

Когда я читаю файл в Linux с помощью команды lessили more, как я могу получить содержимое в цветах?

361
Это кажется связанным: http://superuser.com/questions/36022/less-and-grep-color - это помогает? Jonik 14 лет назад 5

14 ответов на вопрос

428
ChristopheD

Попробуйте следующее:

less -R 

от man less:

-r или же --raw-control-chars

Вызывает отображение «сырых» управляющих символов. (...)

-R или же --RAW-CONTROL-CHARS

Как -r, но только «цветные» escape-последовательности ANSI выводятся в «сыром» виде. (...)

это не работает, есть некоторый файл conf для "less", как для vim .vimrc? flow 14 лет назад 0
Это полезно, когда сам файл содержит управляющие коды, которые нужно будет отобразить. Nitrodist 12 лет назад 14
Интересно, что тест файла `less` содержит управляющие символы:` script` `ls --color`` exit` `less -R typedscript` LiuYan 刘研 11 лет назад 0
Раньше я знал о less -r, но при поиске в файле с помощью «/» появлялись неправильные строки. -R, кажется, делает лучшую работу. Спасибо за чаевые. Amos Shapira 11 лет назад 1
Следует отметить, что большинство программ используют системный вызов isatty (2), чтобы проверить, является ли их стандартный вывод терминалом, и обычно отключают цветной вывод, если это не так. Для любого канала меньше, `isatty` вернет 0. Чтобы проверить, работает ли это, попробуйте` echo -e '\ x1b [32; 1mtest \ x1b [m' | менее -r` mic_e 11 лет назад 49
Использование строчной буквы '-r' для меня означает, что символы ^ M из файлов Windows не отображаются. Мне это нравится, потому что я не беспокоюсь об окончании строк, и это делает остальную часть вывода более понятной. J.Churchill 11 лет назад 0
Этот ответ не превосходит в самом деле что-то тестировать. Michael Wolf 10 лет назад 9
Очень полезно в сочетании с `unbuffer` Claudiu 9 лет назад 0
Вы также можете набрать `-R`, когда вы уже открыли` less`, чтобы добиться этого. Scz 8 лет назад 14
ИМХО это на самом деле должен быть принятый ответ, это гораздо проще Willian Mitsuda 7 лет назад 1
Как сказал Нитродист, это полезно, только если присутствуют управляющие коды для окраски. Поэтому, если вы хотите, чтобы вывод git diff был меньше, вы должны использовать git diff --color | меньше -R Rohit Walavalkar 6 лет назад 0
134
Dario Seidl

Вы можете использовать силу пигментирования с меньшими затратами - автоматически! (Не нужно трубить вручную.)

Установите pygmentsс вашим менеджером пакетов или pip (возможно, называется python-pygments) или получите его здесь http://pygments.org/download/ .

Написать файл ~/.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 

В вашем .bashrcдобавлении

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

Кроме того, вам нужно сделать ~/.lessfilterисполняемый файл, запустив

chmod u+x ~/.lessfilter 

Проверено на Debian.

Вы поняли идею. Это, конечно, может быть улучшено и дальше, принимая больше расширений или анализируя shebang для других интерпретаторов, чем bash. Посмотрите некоторые другие ответы для этого.

Идея пришла из старого сообщения в блоге создателей Pygments, но оригинального сообщения больше не существует.

Если вы хотите раскрасить файлы исходного кода, вам также нужно сделать исполняемый файл ~ / .lessfilter запуском `chmod u + x ~ / .lessfilter`. Вам также нужно установить pygmentize (http://pygments.org/download/). Sergiy Belozorov 11 лет назад 5
Может ли кто-нибудь подтвердить, что это работает, поскольку это не имеет никакого эффекта для меня, когда я выполняю команду типа `ls -l | less` puk 10 лет назад 0
Любая идея, как связать это с lessopen.sh Владимира Линека? это настраивается с помощью этой формы: LESSOPEN = "lessopen.sh% s" Gregory 10 лет назад 0
@puk вы можете сделать что-то вроде `ls --color = всегда -l | меньше -R` Очевидно, что это много, чтобы напечатать, но вы могли бы псевдоним это что-то вроде `ll`. Это если вы не хотите использовать какие-либо дополнительные библиотеки. PhilT 10 лет назад 6
Флаг -g при pygmentize решит проблему «Ошибка: нет лексера для имени файла» для типов файлов, которые не включены, как описано здесь http://askubuntu.com/a/392017/115392 Pan Chrono 10 лет назад 0
добавил комментарий @ SergiyByelozyorov в ответ. andrybak 9 лет назад 2
На всякий случай, если кому-то интересно, я написал пару скриптов, которые служат очень похожим целям ([pygmentize-addons] (https://github.com/brbsix/pygmentize-addons)). Это обертки вокруг `pygmentize`, используемые для просмотра выделенного синтаксиса кода для файлов или сценариев в PATH через stdout,` less` или изображение PNG. Я использую его все время для изучения исходного кода файлов и установленных скриптов. Six 9 лет назад 0
не забудьте `sudo aptitude установить python-pygments` arod 9 лет назад 0
Есть ли простой способ получить более насыщенные цвета по умолчанию (php) для просмотра в консоли? arod 9 лет назад 0
Мое редактирование было отклонено, поэтому я, скорее всего, опубликую его как комментарий: не проверяйте коды выхода команд косвенно. Вы можете использовать `if grep -q" # \! / Bin / bash "" $ 1 "` (`-q` подавляет стандартный вывод). Вы можете перенаправить стандартную ошибку с помощью `2> / dev / null`. Tom Fenech 9 лет назад 1
@ TomFenech хороший момент, я отредактировал ответ соответственно. Dario Seidl 5 лет назад 0
118
Puneet

I got the answer in another post: Less and Grep: Getting colored results when using a pipe from grep to less

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.

Warning: Don't put --color=always as an alias, it break things sometimes. That's why there is an --color=auto option.

Здорово спасибо За исключением того, что мне нужно использовать `-R` в качестве опции для` less`. naught101 12 лет назад 4
Я полагаю, что `grep -R` для определения рекурсивного поиска. `less -R` необходим для того, чтобы` less` правильно выплевывал цвета. `grep --color = всегда [grep cmds] | у меня менее -R` работает на OS X 10.7.3! Steven Lu 12 лет назад 9
@ naught101 @ Steven Lu Отредактировано, хотя кажется, что некоторым людям, возможно, не нужно использовать `less -R` (в любом случае, по словам автора исходного поста). jtpereyda 11 лет назад 0
Есть ли способ сообщить команде grep только о трубе меньше -R, а затем просто раскрасить? Таким образом, нам не нужно ставить --color = всегда и меньше -R все время. A-letubby 9 лет назад 2
Это, безусловно, самый простой рабочий ответ. Спасибо! Danny Staple 9 лет назад 1
Это также работает, когда вам нужно передать `git diff` в` less`. Делаем так: `git diff | less` не покажет вам никаких цветов. Вы должны сделать это вместо этого: `git diff --colors = всегда | less` или `git diff --colors = всегда some_file | less`. (Я использую Cygwin на Windows 10, кстати.) CSCH 6 лет назад 0
29
Riccardo Galli

Используйте viewвместо less. Он открывает файл vimв режиме только для чтения.

Это практически цветной less: пейджер, с помощью которого можно искать /(и даже больше). Единственным недостатком является то, что вы не можете выйти, qно вам нужно:q

Кроме того, вы получаете ту же окраску, что и vim(поскольку вы на самом деле используете vim).

Как насчет производительности больших файлов? Подсветка синтаксиса Vim, как известно, медленна для больших файлов. pihentagy 10 лет назад 0
Я не знаю, каково ваше значение для «большого», но открытие файла ~ 10000 строк происходит мгновенно, включая поиск внутри. Riccardo Galli 10 лет назад 0
Я проголосовал (я не знал о `view`), но другим недостатком является то, что j / k / up / down не прокручивается мгновенно, так как есть курсор. Tyler Collier 9 лет назад 1
Обратите внимание, что вам может понадобиться добавить `view -` при конвейере user45909 9 лет назад 5
`vim` - это редактор, который загружает весь файл в память, тогда как` less` - это пейджер, загружающий файл лишь частично в память. Вы узнаете разницу с огромными файлами. sjas 8 лет назад 3
@RiccardoGalli - классная идея, но я бы согласился с проблемой производительности, это не мгновенно. При просмотре огромных логов или файлов grep, особенно по линии (SSH), `less` быстрее, так как он не выводит весь вывод построчно через" вставки "в` vim`. Кроме того, вы можете искать с помощью "less` используя" / ". Кроме того, он имеет «хвостовой» режим с использованием shift-F, что удобно. dhaupin 8 лет назад 0
`gmic -h | view` начинает выполнять команды `vim`. Это не безопасно. `gmic -h | view -` не красит на Ubuntu 18.10, так что понижаем. anatoly techtonik 6 лет назад 0
12
Tuxdude

pygmentize supports the -g option to automatically guess the lexer to be used which is useful for files read from STDIN without checking any extension type.

Using that, you only need to set the following 2 exports in your .bashrc without any additional scripts:

export LESS='-R' export LESSOPEN='|pygmentize -g %s' 
Краткий и эффективный. Я предпочитаю определять псевдоним, потому что иногда чем меньше, тем лучше. Итак: alias lesc = 'LESS = "- R" LESSOPEN = "| pygmentize -g% s" less " Tiago 10 лет назад 4
9
Benjamin Bannier

Вы не сказали, что должен означать этот цвет, например, какими должны быть цвета для текстового файла?

Если вам нужна подсветка синтаксиса для исходного кода, вам нужна подсветка исходного кода. Я иногда использую пигментирование, как это

pygmentize file.cpp | less 

или же

pygmentize file.cpp | more 

Есть другие маркеры вокруг.

Это довольно быстро. Если вы не возражаете против запуска, vimесть режим только для чтения, который может подсвечивать синтаксис, если он у вас есть vim.

view file.cpp 

или в качестве альтернативы см. ответ Чурнда.

8
jbbr

Чтобы сказать меньше, чтобы показать цвета, назовите его с -R:

less -R 

К сожалению, некоторые программы обнаруживают, что их стандартный вывод не является терминалом, и отключают цвета - например, pacman (менеджер пакетов Arch Linux).

В этих случаях можно использовать unbuffer:

unbuffer <command> | less -R 

Пример использования pacman

unbuffer pacman -Ss firefox | less -R 

Команда unbufferобычно является частью пакета expect-dev(Debian / Ubuntu) или expect(Arch Linux).

Чтобы ответить на вопрос для полноты:

Как уже отвечали другие, pygmentizeотлично подходит для раскрашивания исходного кода. Не требует unbuffer. Самый простой звонок:

pygmentize someSource.cpp | less -R 
4
Joe Coder

Это еще один ответ на основе фрагментов, с несколькими существенными улучшениями:

  • не ломается lesspipeили не lessfileфильтрует
  • работает с несколькими входами в less
  • правильно анализирует тип сценария из заголовка shebang
  • работает для всех 434 типов файлов, которые могут быть изменены с помощью Pygments
  • цветовая схема параметризована как переменная окружения

Установите Pygments и Gawk

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

Установить переменные среды

Проверьте, включено lesspipeили lessfileуже включено:

echo $LESSOPEN 

Если вы не видите ни одной программы, на которую есть ссылки, убедитесь, что lesspipeона установлена ​​(большинство дистрибутивов поставляются с ней).

Добавьте следующее к ~/.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' 

Если вы не хотите lesspipe, замените evalзаявление на:

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

Создайте ~/.lessfilter

Добавьте следующий код и сделайте файл исполняемым: 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 ".$" || 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) else }') 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 
Единственным недостатком этого подхода является то, что Pygments - это программа на Python, и поэтому при первом использовании во время сеанса оболочки возникает задержка «холодного запуска». Последующие вызовы выполняются намного быстрее. Joe Coder 6 лет назад 0
Ницца! Действительно всеобъемлющий. Dario Seidl 5 лет назад 0
3
Speeddymon

Чтобы развернуть другой ответ, вы можете заставить его работать для большинства, если не для всех ваших сценариев, которые не имеют расширений, изменив файл .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" " '') scriptExecStatus=$? if [ "$scriptExecStatus" -eq "0" ]; then lexer=$(echo $scriptExec |awk -F/ '') pygmentize -f 256 -l $lexer "$1" else exit 1 fi esac  exit 0 

Вам все равно нужно добавить две переменные в .bashrc:

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

И вам все равно нужно сделать исполняемый файл .lessfilter:

$ chmod 700 ~/.lessfilter 

Также я хотел добавить, что под debian пакет pygments называется python-pygments. Сначала у меня возникли проблемы с его поиском, потому что очевидное неправильное написание «пигментов» как «пигментов» не было достаточным намеком на то, что это был пакет, в котором менеджер пакетов мог поставить префикс «python-».

2 комментария: 1) Спасибо за улучшение. 2) фразы типа «проголосовал за лучший ответ» не очень хороши; это может измениться (на самом деле, если это лучше, чем этот ответ, _таг_ пост может стать главным ответом, и в этот момент он будет просто сбивать с толку. Может быть, просто сказать «расширить на другой ответ» или «ответ капитана комикса»? cpast 11 лет назад 2
3
arsaKasra

Use the GNU Source-highlight; you can install it with apt if you have it, or otherwise install it from source. Then set up an "input preprocessor" for less, with help from the Source-highligh' documentations for setting up with less:

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.

Похожие вопросы