377

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

15 ответов15

451

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

less -R

от man less

-r или --raw-control-chars

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

-R или --RAW-CONTROL-CHARS

Подобно -r , но только escape-последовательности ANSI "color" выводятся в "сыром" виде. (...)

139

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

Установите 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, но оригинального сообщения больше не существует.

125

Я получил ответ в другом посте: Less and Grep: получение цветных результатов при использовании трубы из grep в less

Когда вы просто запускаете grep --color это подразумевает grep --color=auto который определяет, является ли вывод выводом и, если да, включает цвета. Однако, когда он обнаруживает трубу, он отключает окраску. Следующая команда:

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

Всегда будет включать окраску и отменять автоматическое обнаружение, и вы получите цветовую подсветку меньше.

Предупреждение: не ставьте --color=always в качестве псевдонима, это иногда ломает вещи. Вот почему есть опция --color=auto .

32

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

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

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

13

pygmentize поддерживает параметр -g для автоматического угадывания используемого лексера, что полезно для файлов, считываемых из STDIN без проверки какого-либо типа расширения.

Используя это, вам нужно только установить следующие 2 экспорта в ваш .bashrc без каких-либо дополнительных сценариев:

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

Чтобы сказать меньше, чтобы показать цвета, назовите его с -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
9

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

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

pygmentize file.cpp | less

или же

pygmentize file.cpp | more

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

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

view file.cpp

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

5

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

  • не нарушает 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 ".${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
3

Используйте GNU Source-highlight ; Вы можете установить его с помощью apt если он у вас есть, или установить его из исходного кода. Затем настройте "препроцессор ввода" для меньшего с помощью документации Source-highligh для настройки с помощью less:

Это было предложено Константином Серебряным. Скрипт src-hilite-lesspipe.sh будет установлен вместе с source-highlight. Вы можете использовать следующие переменные среды:

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

Таким образом, когда вы используете меньше для просмотра файла, если это исходный файл, обработанный при выделении источника, он будет автоматически подсвечен.

Ксавье-Эммануэль Винсент недавно представил альтернативную версию цветовой схемы ANSI, esc256.style: некоторые терминалы могут обрабатывать 256 цветов. Ксавье также предоставил скрипт, который проверяет, сколько цветов может обрабатывать ваш терминал, и в этом случае использует вариант 256. Сценарий называется source-highlight-esc.sh и будет установлен вместе с другими двоичными файлами.

3

Чтобы развернуть другой ответ, вы можете заставить его работать для большинства, если не для всех ваших сценариев, которые не имеют расширений, изменив файл .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

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

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

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

$ chmod 700 ~/.lessfilter

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

2

Вы можете рассмотреть возможность использования most утилит, которые являются дружественной по цвету альтернативой для less и more .

1

Сокращенный из моего полного поста в блоге об улучшении меньшего количества опыта: https://www.topbug.net/blog/2016/09/27/make-gnu-less-more-powerful/

Для красочных man-страниц, добавьте следующее в ваш .bashrc или .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

Для подсветки синтаксиса, используйте существующий мощный lesspipe.sh для его обработки вместо написания своего собственного: https://github.com/wofr06/lesspipe

0

Я нашел это простое элегантное решение. Вам не нужно устанавливать ничего лишнего, так как оно уже есть по умолчанию на большинстве машин. Так как vim установлен по умолчанию на большинстве машин, он включает макрос для запуска vim как less

Некоторые из вариантов его использования: создать псевдоним: alias vless='vim -u /usr/share/vim/vim74/macros/less.vim'

или создайте символическую ссылку:ln -s /usr/share/vim/vim74/macros/less.sh ~/bin/vless

Тогда вы просто запускаете vless myfile.py

Я получил большую часть информации здесь

0

Самым интуитивным и простым решением для меня было использование pygmentize
добавив следующие строки в .bashrc

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

В случае, если вы не можете вызвать pygmentize , просто установите как

pip install pygments

пс. Исполняемый двоичный файл pygmentize будет находиться в /usr/local/bin/ или в вашем /home/username/.virtualenv/venvname/bin/ или где-то еще.

-2

Ничто из этого не работало для меня из коробки, и я нашел простой способ сделать эту работу, поэтому я решил поделиться.

Просто используйте tmux, который позволяет вам просматривать и прокручивать большую историю и прекрасно сохраняет цвета.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .