Когда я читаю файл в Linux с командой less
или more
, как я могу получить содержимое в цветах?
15 ответов
Попробуйте следующее:
less -R
от man less
-r
или--raw-control-chars
Вызывает отображение "сырых" управляющих символов. (...)
-R
или--RAW-CONTROL-CHARS
Подобно
-r
, но только escape-последовательности ANSI "color" выводятся в "сыром" виде. (...)
Вы можете использовать силу пигментирования с меньшими затратами - автоматически! (Не нужно трубить вручную.)
Установите 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, но оригинального сообщения больше не существует.
Я получил ответ в другом посте: Less and Grep: получение цветных результатов при использовании трубы из grep в less
Когда вы просто запускаете
grep --color
это подразумеваетgrep --color=auto
который определяет, является ли вывод выводом и, если да, включает цвета. Однако, когда он обнаруживает трубу, он отключает окраску. Следующая команда:grep --color=always "search string" * | less -R
Всегда будет включать окраску и отменять автоматическое обнаружение, и вы получите цветовую подсветку меньше.
Предупреждение: не ставьте --color=always
в качестве псевдонима, это иногда ломает вещи. Вот почему есть опция --color=auto
.
Используйте view
вместо less
. Он открывает файл с vim
в режиме только для чтения.
Это практически less
цвета: пейджер, где вы можете искать с помощью / (и более). Единственным недостатком является то, что вы не можете выйти с q, но вам нужно :q
Кроме того, вы получаете ту же окраску, что и vim
(поскольку вы на самом деле используете vim
).
pygmentize
поддерживает параметр -g
для автоматического угадывания используемого лексера, что полезно для файлов, считываемых из STDIN
без проверки какого-либо типа расширения.
Используя это, вам нужно только установить следующие 2 экспорта в ваш .bashrc
без каких-либо дополнительных сценариев:
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
Чтобы сказать меньше, чтобы показать цвета, назовите его с -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
Вы не сказали, что должен означать этот цвет, например, какими должны быть цвета для текстового файла?
Если вам нужна подсветка синтаксиса для исходного кода, вам нужна подсветка исходного кода. Я иногда использую пигментирование как это
pygmentize file.cpp | less
или же
pygmentize file.cpp | more
Есть другие маркеры вокруг.
Это довольно быстро. Если вы не против запустить vim
есть режим только для чтения, который может подсвечивать синтаксис, если он есть в vim
.
view file.cpp
или в качестве альтернативы см. ответ Чурнда.
Это еще один ответ на основе фрагментов , с несколькими существенными улучшениями:
- не нарушает
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
Используйте 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 и будет установлен вместе с другими двоичными файлами.
Чтобы развернуть другой ответ, вы можете заставить его работать для большинства, если не для всех ваших сценариев, которые не имеют расширений, изменив файл .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-».
Вы можете рассмотреть возможность использования most
утилит, которые являются дружественной по цвету альтернативой для less
и more
.
Сокращенный из моего полного поста в блоге об улучшении меньшего количества опыта: 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
Я нашел это простое элегантное решение. Вам не нужно устанавливать ничего лишнего, так как оно уже есть по умолчанию на большинстве машин. Так как 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
Я получил большую часть информации здесь
Самым интуитивным и простым решением для меня было использование pygmentize
добавив следующие строки в .bashrc
export LESS='-R'
export LESSOPEN='|pygmentize -g %s'
В случае, если вы не можете вызвать pygmentize
, просто установите как
pip install pygments
пс. Исполняемый двоичный файл pygmentize
будет находиться в /usr/local/bin/
или в вашем /home/username/.virtualenv/venvname/bin/
или где-то еще.
Ничто из этого не работало для меня из коробки, и я нашел простой способ сделать эту работу, поэтому я решил поделиться.
Просто используйте tmux, который позволяет вам просматривать и прокручивать большую историю и прекрасно сохраняет цвета.