it-swarm-ru.tech

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

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

395
Open the way

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

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

145
Dario Seidl

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

less -R

из man less:

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

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

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

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

476
ChristopheD

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

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

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

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

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

130
Puneet

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

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

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

35
Riccardo Galli

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

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

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

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

less -R

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

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

unbuffer <command> | less -R

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

unbuffer pacman -Ss firefox | less -R

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

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

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

pygmentize someSource.cpp | less -R
14
jbbr

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

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

pygmentize file.cpp | less

или же

pygmentize file.cpp | more

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

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

view file.cpp

или, альтернативно, посмотрите ответ Чурнда.

9
Benjamin Bannier

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

  • не нарушает фильтры 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 "[email protected]"; 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
5
Joe Coder

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

Это было предложено Константином Серебряным. Скрипт 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
arsaKasra

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

3
Speeddymon

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

2
Onlyjob

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

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

1
xuhdev

Я нашел это простое элегантное решение. Вам не нужно устанавливать ничего лишнего, так как он уже есть по умолчанию на большинстве машин. Так как 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
Wavesailor

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

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

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

pip install pygments

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

0
David Jung