Синтаксичне виділення / розфарбування кота


202

Чи є спосіб розфарбувати вихідний результат cat, як grepце робиться.

Бо grepв більшості консолей він відображає кольоровий вихід із виділенням шуканих ключових слів. В іншому випадку ви можете змусити це зателефонувати grep --color Чи є загальний спосіб пофарбувати вихід будь-якої програми відповідно до вашого особистого вибору.

З того, що я розумію, сама програма не відповідає за кольори. Це оболонка.

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


Я не можу зрозуміти, що ти намагаєшся сказати
Lelouch Lamperouge

о ні. Я не хочу відображати двійковий файл. Я просто хочу відобразити вихід бінарного в кольоровому порядку.
Lelouch Lamperouge

6
Хутро - FTFY (ви завжди можете редагувати свої власні питання)
sehe

Я відредагував, щоб уникнути плутанини щодо терміна "бінарний"
Волкер Зігель

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"

Вищевказане (на терміналі, який підтримує ці послідовності відходу) надрукує будь-який текстовий файл як "жирний", а будь-який бінарний файл надрукує червоним кольором. Ви можете використовувати stringsзамість того, catщоб друкувати бінарні файли, і ви можете покращити логіку, щоб вона відповідала вашим потребам.


Я думав про щось подібне. Але мені потрібно щось, що зробило б це універсально. Не тільки cat/ grep/any particular program
Lelouch Lamperouge

Тоді ви можете просто передати команду, яка буде виконуватися як аргумент, до сценарію та замінити жорстко закодований catвиклик на якийсь $cmdініціалізується як $ 1, якщо два аргументи або за замовчуванням, якщо є лише один. Тоді ви просто написати: colorful.sh grep file.
Costi Ciudatu

8
"кішка для цього не призначена". Кішка також не призначена для запису окремих файлів в stdout - це для конкатенації. Але це все ще не означає, що писати окремі файли в stdout не корисно. Це не означає, що виділення їх не є корисним.
mikemaccana

Я спробував, під cygwin pygmentizeне вдається розфарбувати. Якісь поради?
truthadjustr

407

Я б рекомендував pygmentizeз пакету python python-pygments. Ви можете визначити наступний зручний псевдонім (якщо ви не користуєтесь ccatпакетом ccrypt).

alias ccat='pygmentize -g'

Синтаксис підкреслив вихід кішки за допомогою пігментізації

І якщо ви хочете номери рядків:

alias ccat='pygmentize -g -O style=colorful,linenos=1'

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щоб примусити їх.
jerclarke

1
# pip install Pygments # echo "alias catc = 'pygmentize -g" ">>" ~ / .bashrc "# закритий термінал # відкритий термінал # catc test.js --- та ідеальні роботи :-) 😊
BG Bruno

3
highlightна 34 рази швидше, ніж програма python. Сила класичних мов залишається сильною.
Авіндра Голчаран

2
Тому що highlightви хочете додати --forceпсевдонім, інакше він видасть помилку для форматів файлів, які він не розуміє, в той час як в якості catзаміни ви хочете, щоб він все одно показував вихід без виділення, що і --forceробить. Всі разом:alias cat="highlight -O ansi --force"
Олександр Климечек

1
@Luke, тому вам слід додати за -O ansiзамовчуванням - це вивести html :-)
Thomas

59

З кінця квітня 2018 року:

Кажан - клон кішки (1) із виділенням синтаксису та інтеграцією Git.

Проект являє собою котячий клон із підтримкою кольорів та налаштувань, написаних у Rust. Він пропонує не тільки підсвічування синтаксису з кількома темами, але й інтеграцію Git. Як описано в документації:

кажан намагається досягти наступних цілей :

  • Забезпечте красиве, вдосконалене підсвічування синтаксису
  • Інтеграція з Git, щоб показати модифікації файлів
  • Будьте заміною для (POSIX) кішки
  • Запропонуйте зручний інтерфейс командного рядка

Це, що говорити, набагато швидше, ніж пігментізувати, і не задихається, стикаючись з великими файлами.

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


5
Що люди забувають згадати, це те, що batза замовчуванням залишається в інтерактивному режимі. Щоб він більше поводився cat, використовуйте це з -ppаргументом. Псевдонім на кшталт alias cat="bat -pp"- це те, що люди шукають.
Canella

1
Раніше я використовував пігментізацію для забарвлення кота, але рішення з bat набагато краще підходить для великих файлів (журнали в кілька МБ), де продуктивність пігментізації є subpar.
Крістіан.Д

34

vimcat однофайл (скрипт оболонки) і добре працює:

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

Останнє оновлення - з грудня 2013 року. Підказка: Ви можете примусити розпізнавання типу файлів за допомогою vimcat -c "set ft=<type>".


12
Одне, що дійсно приємно щодо vimcat (або vimpager), - це те, що він буде дотримуватися кольорової схеми, яку ви визначили у своєму ~/.vimrcсинтаксисі, підсвічування буде однаковою як при редагуванні (vim), так і при друку (vimcat). Зауважте, що оновлену версію vimcat можна знайти в сховищі vimpager .
timss


vimpagerне використовує мою схему кольорів vim.
WhyNotHugo

2
У моєму швидкому ненауковому тесті vimcat(час виконання 1 ~ 2 секунди) набагато повільніше pymentize(~ 200 highlightмс), що набагато повільніше, ніж (~ 20 мс), що набагато повільніше, ніж cat(~ 2 мс). З іншого боку, vimcatручки більше типів файлів і є більш точним , ніж hightlightта pygmentize, і це ще швидше , ніж перший vimтоді :q. Таким чином, це заробляє мій вибір на цьому конкретному завданні.
Penghe Geng

1
@olibre Ця відповідь здається старшою за відповідь від Amaynut.
Франклін Ю

31

Інструмент, який ви шукаєте, ймовірно, є суперкатом (ось короткий вступ, опублікований Linux Journal).

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


1
Здається, це не працює так легко, я встановив його і застосував приклад конфігурації, але це не мало кольорового ефекту
rubo77

Приємно, все інше занадто повільно. Це добре. Про допомогу в налаштуванні дивіться manpages.debian.org/testing/supercat/spc.1.en.html
okovko

Додатково для деяких конфігурацій для різних мов: github.com/tanderson92/supercat/tree/master/spcrc
okovko

20

Існує кольорова версія для котів - котів . Отримайте його з https://github.com/jingweno/ccat/ .

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

Це єдиний автономний виконуваний файл, щоб встановити його, ви можете розпакувати двійкову версію для вашої ОС з https://github.com/jingweno/ccat/release та скопіювати, наприклад, бінарний код ccat/usr/local/bin .

Якщо ви хочете уникнути бінарних файлів або якщо у вашій платформі немає бінарних файлів (наприклад, малиновий пі тощо), ви можете по черзі компілювати з джерела, враховуючи, що у вас є робоче goсередовище розробки ( apt install golangна Linux-серверах brew install golangна основі debian або на mac):

go get -u github.com/jingweno/ccat

ccatДвійкова буде створений під вашим $GOPATH/bin.

Встановлення на Mac через домашню програму

brew install ccat

Псевдонім до cat

Щоб замінити звичайний catна ccatadd ~/.bashrc:

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

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


1
Яке правильне ім’я репо? apt-get ccat в Ubuntu 16 дає мені якусь програму шифрування і дещо весело замуровує мій термінал, оскільки він наразі намагається зашифрувати чи розшифрувати весь мій каталог
протоколу

@KatasticVoyage: мій поганий: чомусь я припустив, що він знаходиться в репості, і я забув, як я потрапив у свою скриньку ubuntu. Дивіться оновлену відповідь.
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


Мені подобається ідея, але тут vimcat серед повільних. Це приблизно так само повільно, як пігментація. На 15 разів повільніше highlightі в 3 рази повільніше, ніж batдля 30-рядкового скрипту на моїй машині.
Ponkadoodle

11

source-highlight

Можливо, можна знайти цікаве source-highlight випущене в GNU : пакет, відмінний від highlight.

Витяг з apt-cache show source-highlight:

Description-en: перетворити вихідний код у виділений синтаксисом документ.
Ця програма, отримана з вихідного файлу, створює документ із виділенням синтаксису.
Він підтримує підсвічування синтаксису для понад 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-список перелічить усі підтримувані мови та пов'язаний з ними файл визначення мови


1
Якщо ви також хочете розфарбувати lessз source-highlight, хто - то на GitHub дає відповідь: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"і export LESS=" -R ". Дуже корисно, коли pygmentizeвін недоступний і не може бути встановлений.
Лалілулело,

8

З того, що я розумію, сам бінар не відповідає за кольори. Це оболонка.

Це не правильно. Термінал просто інтерпретує кольорові коди, які виводяться на термінал. Залежно від своїх можливостей, він може ігнорувати певні коди форматування / забарвлення.

Зі сторінки людини, схоже, кішка підтримує забарвлення свого виводу. Навіть якби він підтримував фарбування як grep, що воно повинно бути кольоровим у текстовому файлі? Виділення синтаксису вимагає знання основної мови, що не входить до сфери простої корисності, як cat.

Ви можете спробувати більш потужні редактори, такі як vim, emacs, gedit тощо на платформі Unix, якщо бачення виділеного коду - ваша мета.


3
" catНе для друку файлів з номерами рядків, це не для стиснення декількох порожніх рядків, це не для перегляду символів ASCII, які не друкуються, це для об'єднання файлів". - від стилю UNIX або кота -v Вважається шкідливим .
Скотт

7

На OSX просто зробити brew install ccat.

https://github.com/jingweno/ccat . Як кішка, але відображає вміст із виділенням синтаксису. Вбудований у Go.


Приємно. Має деякі мовні обмеження, але він відчуває себе набагато швидше, ніж фрагменти.
Густаво Безерра

ccat можна також знайти в сховищі AUR Arch Linux. Для встановлення пакета використовуйте yaourt або pacaur.
Маркс


3

Старе запитання, просто відповідаючи на запис, щоб забезпечити рішення, яке я в кінцевому підсумку використав. Можливо, це трохи хакітно (можливо, це не початковий намір параметра), але:

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

кішка що б | не cgrep 'snozzberry'

.. grep -C Nнадасть N рядків контексту вище та нижче знайденого елемента. Якщо він більший за вхід, весь вхід включений. У цьому випадку ми просто переконуємось, що він більший за будь-який типовий термінальний вихід, який ми хочемо подивитися вручну, що, як правило, те, що ви хочете зробити, якщо виділити.

EDIT: Однак це рішення, запропоноване нижче Бені Чернявський-Паскін, є вищим - воно відповідає (і підкреслює) або слово, яке ви шукаєте, або початок рядка (не виділяється). Чистий результат - саме те, що ви хочете.

cat whatever | egrep 'snozzberries|$'

Це нове найкраще рішення, яке я бачив для цієї проблеми, дякую Бені.


2
Більш надійний спосіб виділити візерунок, включаючи всі рядки,egrep 'snozzberries|$'
Бені Чернявський-Паскін

3

У цьому питанні /superuser/602294/is-there-colorizer-utility-that-can-take-command-output-and-colorize-it-accordin grcat / grcінструмент було рекомендовано як альтернативуsupercat .

Людина grc та of grcat; це частина пакету grc ( джерела ):

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

grcat - читати зі стандартного вводу, розфарбовувати його та записувати на стандартний вихід


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', що жовтий високої інтенсивності. Це виглядає приблизно так:введіть тут опис зображення


0

просто використовуйте vim і цей файл vimrc .

oneliner:

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 також може бути альтернативою.


0

Помістіть у своєму ~ / .bashrc

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

тоді

ccat filename

Whalebrew створює псевдоніми для зображень Docker, щоб ви могли запускати їх так, ніби вони були рідними командами. Це як Homebrew, але з зображеннями Докера.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.