Подсветка синтаксиса / раскраска кота

202

Есть ли способ раскрасить вывод cat, способ grepделает.

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

Из того, что я понимаю, сама программа не отвечает за цвета. Это оболочка.

Я использую оболочку по умолчанию во FreeBSD 5.2.1, которая выглядит так, как будто никогда не видела цветов с эпохи.

Лелуш Лампероуг
источник
Я не могу понять, что ты пытаешься сказать
Лелуш Лампероуг
о нет. Я не хочу отображать двоичный файл. Я просто хочу отобразить вывод двоичного файла в раскрашенном виде.
Лелуш Лампероуг
6
meh - FTFY (вы всегда можете редактировать свои собственные вопросы)
сехе
Я отредактировал, чтобы избежать путаницы в отношении термина «бинарный»
Volker Siegel
3
Я думаю, что ответ @buergi совпадает с вопросом, и это также подтверждается количеством голосов, которые он имеет. Подумайте об изменении принятого ответа.
Иоаннис Филиппидис

Ответы:

22

catс подсветкой синтаксиса просто выходит за рамки. catне предназначен для этого. Если вы просто хотите, чтобы все содержимое какого-либо файла было каким-то образом окрашено (с одинаковым цветом для всего файла), вы можете использовать управляющие последовательности терминала для управления цветом.

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

#!/bin/bash
fileType="$(file "$1" | grep -o 'text')"
if [ "$fileType" == 'text' ]; then
    echo -en "\033[1m"
else
    echo -en "\033[31m"
fi
cat $1
echo -en "\033[0m"

Выше (на терминале, который поддерживает эти escape-последовательности), любой текстовый файл будет напечатан как «жирный», а любой двоичный файл - красным. Вы можете использовать stringsвместо catпечати бинарные файлы и улучшать логику, чтобы она соответствовала вашим потребностям.

Кости Сьюдату
источник
Я думал о чем-то вроде этого. Но мне нужно что-то, что сделало бы это универсально. Не только cat/ grep/any particular program
Лелуш Лэмперуж
Затем вы можете просто передать команду для выполнения в качестве аргумента скрипту и заменить жестко запрограммированный catвызов на некоторый, $cmdкоторый инициализируется как $ 1, если есть два аргумента, или значение по умолчанию, если есть только один. Тогда вы просто написать: colorful.sh grep file.
Costi Ciudatu
8
«Кошка не предназначена для этого». Cat не предназначен для записи отдельных файлов в stdout - он предназначен для объединения. Но это все равно не означает, что запись отдельных файлов в stdout бесполезна. Не значит ли это, что выделение их не полезно.
mikemaccana
Я пробовал, под cygwin pygmentizeне умеет красить. Какие-нибудь советы?
Правдаadjustr
411

Я бы порекомендовал pygmentizeиз пакета Python python-pygments. Вы можете определить следующий удобный псевдоним (если вы не используете ccatиз пакета ccrypt).

alias ccat='pygmentize -g'

Синтаксис выделенного вывода кошки, используя пигментирование

И если вы хотите номера строк:

alias ccat='pygmentize -g -O style=colorful,linenos=1'
buergi
источник
22
Другое решение - использовать команду linux highlight. alias ccat='highlight -O ansi'
Эван Пурхизер
99
Это должен быть принятый ответ ИМХО. Добавляя к этому, я назвал это какalias dog='pygmentize -g' , потому что собаки круче кошек!
Полим
8
Вы можете добавить меньше -R, чтобы сделать код прокручиваемым:#!/bin/bash \n pygmentize -g $1 | less -R
Fabricio PH
6
Я назвал мой псевдоним nyancat .
zneak
2
Пигментирование работает, как и ожидалось, но, к сожалению, кажется довольно медленным. : - /
Фрерих Раабе
113

Параметры:

Пигментирование это хорошо. У меня есть псевдоним:

alias c='pygmentize -g'

но выделить еще одну широко доступную альтернативу

alias cats='highlight -O ansi --force'

Монтаж:

Возможно, вам придется установить pygmentsс помощью:

sudo pip install pygments
sudo easy_install Pygments #for Mac user

и для highlightпакета, который легко доступен во всех дистрибутивах

sudo apt-get install highlight
sudo yum install highlight

В действии:

Я прилагаю снимки для обоих внизу для хорошего сравнения подсветки

Вот pygmentize в действии: Подсветка пигментирования в файле Python

и это highlight: Выделите выделение в файле Python

Шубхам Чаудхари
источник
4
highlightотлично работал для моих нужд и легко устанавливается, спасибо. Если вы хотите посмотреть на файлы без расширений (например, .bash_aliases), добавьте --syntax=bashв дополнение к ним, -O ansiчтобы форсировать это.
Джеркларк
1
# pip install Pygments # echo "alias catc = 'pygmentize -g'" >> "~ / .bashrc" # закрыть терминал # открыть терминал # catc test.js --- и отлично работает :-) 😊
Б.Г. Бруно,
3
highlightв 34 раза быстрее, чем эта программа на Python. Сила классических языков остается сильной.
Авиндра Гулчаран
2
Для highlight, вы хотите добавить --forceк псевдониму, в противном случае он выдаст сообщение об ошибке для форматов файлов , которые он не понимает, в то время , как catзамена вы хотите , чтобы она по- прежнему показывает выход без выделения, что и --forceделает. Все вместе:alias cat="highlight -O ansi --force"
Александр Климетчек
1
@ Люк, поэтому вы должны добавить по -O ansiумолчанию вывод html :-)
Томас
59

С конца апреля 2018 года:

Bat - Cat (1) клон с подсветкой синтаксиса и интеграцией Git.

Проект представляет собой клон кошки с поддержкой цветов и настроек, написанных на Rust. Он предлагает не только подсветку синтаксиса несколькими темами, но и интеграцию с Git. Как описано в документации:

Летучая мышь пытается достичь следующих целей :

  • Обеспечить красивую, расширенную подсветку синтаксиса
  • Интеграция с Git, чтобы показать изменения файла
  • Быть заменой (POSIX) кошки
  • Предложите удобный интерфейс командной строки

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

Исходный код и бинарные выпуски + инструкции по установке можно найти в репозитории Github, а также для сравнения с альтернативными программами .

dangom
источник
5
Люди забывают упомянуть, что batпо умолчанию он находится в интерактивном режиме. Чтобы он вел себя более похоже cat, используйте его с -ppаргументом. Псевдоним, как alias cat="bat -pp"это, вероятно, то, что люди ищут.
Канелла
1
Ранее я использовал pygmentize для раскрашивания cat, но решение с bat намного лучше подходит для больших файлов (журналы по несколько МБ), где производительность pygmentize ниже.
Christian.D
35

vimcat является однофайловым (shell-скрипт) и работает хорошо:

http://www.vim.org/scripts/script.php?script_id=4325

Последнее обновление - декабрь 2013 г. Подсказка: вы можете принудительно распознать тип файла vimcat -c "set ft=<type>".

Soergener
источник
12
Одна вещь, которая действительно хороша в vimcat (или vimpager), это то, что она будет учитывать цветовую схему, которую вы определили в вашей ~/.vimrcподсветке, поэтому синтаксическая подсветка будет одинаковой как при редактировании (vim), так и при распечатке (vimcat). Обратите внимание, что обновленную версию vimcat можно найти в репозитории vimpager .
Timss
Ответ Amaynut старше и похожее
olibre
vimpagerне использует мою vim colorscheme.
WhyNotHugo
2
В моем быстром ненаучном тесте vimcat(время выполнения 1 ~ 2 секунды) намного медленнее, чем pymentize(~ 200 мс), что намного медленнее, чем highlight(~ 20 мс), что намного медленнее, чем (~ 2 мс cat). С другой стороны, vimcatручки больше типов файлов и является более точным , чем hightlightи pygmentize, и это еще быстрее , чем первый vimтогда :q. Таким образом, это заслуживает моего выбора для этой конкретной задачи.
Пенге Гэн
1
@olibre Этот ответ кажется старше, чем ответ от Amaynut.
Франклин Ю
31

Вероятно, вам нужен инструмент supercat (вот краткое введение, опубликованное Linux Journal).

Я понимаю, что этот ответ запоздал и что он не полностью отвечает требованиям ОП. Поэтому я добавляю это только для справки (это может быть полезно для других людей, ищущих, как раскрасить вывод текстового файла).

mfriedman
источник
1
Кажется, это не так легко работает, я установил его и использовал пример конфигурации, но это не имело цветового эффекта
rubo77
Хорошо, все остальное слишком медленно. Это хорошо. Для получения справки по настройке см. Manpages.debian.org/testing/supercat/spc.1.en.html
okovko
Дополнительно для некоторых конфигов для разных языков: github.com/tanderson92/supercat/tree/master/spcrc
okovko
20

Есть раскрашенная версия cat - ccat . Получить его с https://github.com/jingweno/ccat/ .

Установка на Linux / Windows / macOS

Это отдельный исполняемый файл, поэтому для его установки вы можете распаковать бинарную версию для своей ОС с https://github.com/jingweno/ccat/releases и скопировать бинарный файл ccat, например, в/usr/local/bin .

Если вы хотите избежать двоичных файлов или если для вашей платформы нет двоичных файлов (например, raspberry pi и т. Д.), То вы можете поочередно компилировать из исходного кода, если у вас есть рабочая goсреда разработки ( apt install golangна основе Linux brew install golangна основе Debian или на Mac):

go get -u github.com/jingweno/ccat

ccatДвоичная будет создан под вашим $GOPATH/bin.

Установка на Mac с помощью homebrew

brew install ccat

Псевдоним для cat

Заменить обычный catна ccatдобавить в ~/.bashrc:

alias cat="ccat $*"
alias cat0="/bin/cat $*" # for cases when you need plain `cat`

ccatреализован в Go , поэтому это собственный двоичный файл, который работает намного быстрее, чем решения на основе Python, такие как pygments , модуль позади pygmentize; Я не видел заметной разницы в скорости между catи ccat.

ccpizza
источник
1
Какое правильное имя репо? apt-get ccat в Ubuntu 16 дает мне какую-то программу шифрования и несколько забавно блокирует мой терминал, поскольку в настоящее время он пытается зашифровать или расшифровать весь мой каталог процедур ...
Katastic Voyage
@KatasticVoyage: мой плохой: по какой-то причине я предположил, что это было в репозиториях, и я забыл, как я получил это в моем Ubuntu Box. Смотрите обновленный ответ.
ccpizza
2
В настоящее время кажется, что этого brew install ccatдостаточно, больше нет необходимости brew tap.
Джефф
12

Лучший и самый простой способ сделать это, если у вас есть vim на вашей машине - это использовать программу, vimcatкоторая поставляется вместе с vimpagerпрограммой.

  1. Установите Vimpage с git clone git://github.com/rkitover/vimpager cd vimpager sudo make install
  2. Запустите vimcat:

    vimcat index.html

Amaynut
источник
Мне нравится эта идея, но vimcat - один из самых медленных. Это примерно так же медленно, как пигментировать. В 15 раз медленнее highlightи в 3 раза медленнее, чем batдля 30-строчного сценария bash на моей машине.
Ponkadoodle
11

source-highlight

Возможно, можно найти интересный source-highlight релиз под GNU : пакет, отличный от highlight.

Выдержка из apt-cache show source-highlight:

Description-ru: преобразовать исходный код в выделенный синтаксис документа.
Эта программа, учитывая исходный файл, создает документ с подсветкой синтаксиса.
Он поддерживает подсветку синтаксиса для более чем 100 форматов файлов ...
Для вывода поддерживаются следующие форматы: HTML, XHTML, LaTeX, Texinfo, цветовые экранирующие последовательности ANSI и DocBook

Я сделал несколько псевдонимов (Cat и PCat, см. Ниже), и это их вывод

Пример экрана

Вы можете установить на Debian на основе

sudo apt-get install source-highlight

и добавьте его как псевдоним, например, в вашей .bash_aliasesс чем-то вроде строки ниже.

alias Cat='source-highlight --out-format=esc -o STDOUT -i'  
Cat myfile.c # or myfile.xml ...

Или вы можете сделать аналогичный псевдоним (без -iв конце, чтобы иметь возможность передать )

alias PCat='source-highlight --out-format=esc -o STDOUT '
tail myfile.sh | PCat     # Note the absence of the `-i`

Среди вариантов , что можно прочитать из man source-highlightсамых -sподчеркивания , что можно выбрать, или силы , выделение с помощью командной строки или оставить программу этой службы:

-s , --src-lang = STRING исходный язык (используйте --lang-list, чтобы получить полный список). Если не указан, исходный язык будет угадан по расширению файла .

--lang-list список всех поддерживаемых языков и связанных файлов определения языка

Hastur
источник
1
Если вы также хотите раскрасить lessс source-highlight, кто - то на GitHub дает ответ: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"и export LESS=" -R ". Очень полезно, когда pygmentizeнедоступно и не может быть установлено.
Лалилулело
8

Из того, что я понимаю, сам двоичный файл не отвечает за цвета. Это оболочка.

Это не правильно. Терминал просто интерпретирует цветовые коды, которые выводятся на терминал. В зависимости от его возможностей он может игнорировать определенные коды форматирования / раскраски.

С man-страницы кажется, что cat не поддерживает раскраску своего вывода. Даже если бы он поддерживал раскраску, например, grep, какой должен быть цвет в текстовом файле? Подсветка синтаксиса требует знания базового языка, который не входит в простую утилиту, такую ​​как cat.

Вы можете попробовать более мощные редакторы, такие как vim, emacs, gedit и т. Д. На платформе Unix, если ваша цель - увидеть выделенный код.

Ashwinee K Jha
источник
3
« catНе для печати файлов с номерами строк, это не для сжатия нескольких пустых строк, это не для просмотра непечатаемых символов ASCII, это для объединения файлов». - от UNIX Style или cat -v считается вредным .
Скотт
7

На OSX просто делай brew install ccat.

https://github.com/jingweno/ccat . Как кошка, но отображает содержимое с подсветкой синтаксиса. Встроенный в Go.

Joost
источник
Ницца. Имеет некоторые языковые ограничения, но чувствует себя намного быстрее, чем фрагменты.
Густаво Безерра
ccat также можно найти в AUR-репозитории Arch Linux. Используйте yaourt или pacaur для установки пакета.
Marcs
3

Старый вопрос, просто отвечаю за запись, чтобы обеспечить решение, которое я в итоге использовал. Возможно, это немного странно (возможно, не оригинальное назначение параметра), но:

псевдоним cgrep = 'grep -C 9000'

кот что угодно | cgrep 'snozzberries'

.. grep -C Nпредоставит N строк контекста выше и ниже найденного элемента. Если он больше, чем вход, весь вход включается. В этом случае мы просто убедимся, что он больше, чем любой типичный вывод терминала, на который мы хотим посмотреть вручную, что, как правило, нужно делать при выделении.

РЕДАКТИРОВАТЬ: Тем не менее, это решение, предложенное ниже Бени Чернявский-Паскин, является превосходным - оно соответствует (и выделяет) либо слово, которое вы ищете, или начало строки (не выделяется цветом). Чистый результат - именно то, что вы хотите.

cat whatever | egrep 'snozzberries|$'

Это новое лучшее решение, которое я видел для этой проблемы, спасибо Бени.

Мистер Б
источник
2
Более надежный способ выделить шаблон при включении всех линийegrep 'snozzberries|$'
Бени Чернявский-Паскин
3

В этом вопросе был рекомендован /superuser/602294/is-there-colorizer-utility-that-can-take-command-output-and-colorize-it-accordin grcat / grctool в качестве альтернативы supercat.

Человек из GRC и из grcat; это часть пакета grc ( источники ):

grc - интерфейс для универсального колоризатора grcat (1)

grcat - читать из стандартного ввода, раскрашивать его и записывать в стандартный вывод

osgx
источник
1

Я написал небольшой скрипт для выполнения колоризации с использованием pygmentize.

colorize_via_pygmentize() {
    if [ ! -x "$(which pygmentize)" ]; then
        echo "package \'Pygments\' is not installed!"
        return -1
    fi

    if [ $# -eq 0 ]; then
        pygmentize -g $@
    fi

    for FNAME in $@
    do
        filename=$(basename "$FNAME")
        lexer=`pygmentize -N \"$filename\"`
        if [ "Z$lexer" != "Ztext" ]; then
            pygmentize -l $lexer "$FNAME"
        else
            pygmentize -g "$FNAME"
        fi
    done
}

А затем сделайте псевдоним для сценария. alias cat=colorize_via_pygmentize, Также не забудьте сохранить это в ~ / .bashrc .

Рохит Сегал
источник
0

Если вы просто хотите, чтобы один вкладыш устанавливал catвывод на заданный цвет, вы можете добавить

alias cat="echo -en 'code' | cat - "

на ваш ~/.$(basename $SHELL)rc

Вот суть с цветовыми кодами: https://gist.github.com/chrisopedia/8754917

Мне нравится '\e[1;93m', это высокая интенсивность желтого цвета. Это выглядит так:введите описание изображения здесь

okovko
источник
0

просто используйте vim и этот файл vimrc .

один лайнер:

vim -c '1' -c 'set cmdheight=1' -c 'set readonly' -c 'set nomodifiable' -c 'syntax enable' -c 'set guioptions=aiMr' -c 'nmap q :q!<CR>' -c 'nmap <Up> <C-Y>' -c 'nmap <Down> <C-E>' -c 'nmap ^V <C-F><C-G>' "$@" 

nano -v также может быть альтернативой.

eadmaster
источник
0

Поместите в ваш ~ / .bashrc

function ccat() { docker run -it -v "$(pwd)":/workdir -w /workdir whalebrew/pygmentize $1; }

затем

ccat filename

Whalebrew создает псевдонимы для образов Docker, чтобы вы могли запускать их, как если бы они были родными командами. Это как Homebrew, но с изображениями Docker.

javajon
источник