Sözdizimi vurgulama / renklendirme kedi


205

Çıktının renklendirilmesi için bir yöntem var mı cat, yolu grepmu.

İçin grep, en konsolları o anahtar kelimeler aranır vurgulayarak bir renkli çıktıyı görüntüler. Aksi takdirde, grep --color herhangi bir programın çıktısını kişisel seçiminize göre renklendirmenin genel bir yolu var mı diyerek bunu zorlayabilirsiniz .

Anladığım kadarıyla, programın kendisi renklerden sorumlu değildir. Kabuk bu.

Dönemden beri hiç renk görmemiş gibi görünen FreeBSD 5.2.1'deki varsayılan kabuğu kullanıyorum.


Ne demeye çalıştığını anlayamıyorum
Lelouch Lamperouge

Oh hayır. İkili göstermek istemiyorum. Ben sadece bir ikili çıktı renkli bir şekilde görüntülemek istiyorum.
Lelouch Lamperouge

6
meh - FTFY (her zaman kendi sorularınızı düzenleyebilirsiniz)
sehe

Ben "ikili" terimi ile ilgili karışıklığı önlemek için düzenlenmiş
Volker Siegel

3
Bence @buergi'nin cevabı soru ile eşleşiyor ve bu da sahip olduğu upvotes sayısı ile destekleniyor. Kabul edilen cevabı değiştirmeyi düşünün.
Ioannis Filippidis

Yanıtlar:


22

catsözdizimi vurgulama ile sadece kapsam dışı. catbunun için tasarlanmamıştır. Bir dosyanın tüm içeriğinin bir şekilde renklendirilmesini istiyorsanız (tüm dosya için aynı renkle), rengi kontrol etmek için terminal kaçış dizilerini kullanabilirsiniz.

İşte dosya türüne göre rengi seçecek örnek bir komut dosyası ( catdoğrudan çağırmak yerine böyle bir şey kullanabilirsiniz ):

#!/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"

Yukarıdakiler (bu çıkış dizilerini destekleyen bir terminalde) herhangi bir metin dosyasını 'kalın' olarak yazdırır ve herhangi bir ikili dosyayı kırmızı olarak yazdırır. İkili dosyaları yazdırmak stringsyerine kullanabilirsiniz catve mantığı, ihtiyaçlarınıza uygun hale getirmek için geliştirebilirsiniz.


Böyle bir şey düşünüyordum. Ama bunu evrensel olarak yapacak bir şeye ihtiyacım var. Sadece cat/ grep/any particular program
Lelouch Lamperouge

Ardından, komut dosyasına bağımsız değişken olarak yürütülecek komutu iletebilir ve sabit kodlu catçağrıyı $cmd, iki bağımsız değişken varsa $ 1 olarak başlatılmış veya yalnızca bir tane varsa varsayılan olarak değiştirebilirsiniz. Sonra sadece yazmak: colorful.sh grep file.
Costi Ciudatu

8
"kedi bunun için tasarlanmamıştır." Cat, ayrı dosyaları stdout'a yazmak için değil, birleştirme içindir. Ancak bu yine de tek tek dosyaları stdout'a yazmanın kullanışlı olmadığı anlamına gelmez. Hayır, bu onları vurgulamanın yararlı olmadığı anlamına gelmez.
mikemaccana

Cygwin altında denedim pygmentize renklendiremiyorum. Herhangi bir ipucu?
truthadjustr

413

pygmentizePython paketinden tavsiye ederim python-pygments. Aşağıdaki kullanışlı diğer adı tanımlamak isteyebilirsiniz ( ccatccrypt paketinden kullanmadığınız sürece ).

alias ccat='pygmentize -g'

Sözdizimi vurgulanan kedi çıktısı

Ve satır numaraları istiyorsanız:

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

22
Başka bir çözüm linux highlightkomutunu kullanmaktır . alias ccat='highlight -O ansi'
Evan Purkhiser

99
Bu kabul edilen cevap IMHO olmalıdır. Buna ek olarak, onu taklit ettim alias dog='pygmentize -g', çünkü köpekler kedilerden daha serin!
Polym

8
Kodu kaydırılabilir yapmak için daha az -R ekleyebilirsiniz:#!/bin/bash \n pygmentize -g $1 | less -R
Fabricio PH

6
Takma adımı aradım nyancat.
zneak

2
pygmentize beklendiği gibi çalışır, ancak ne yazık ki oldukça yavaş görünüyor. : - /
Frerich Raabe

113

Seçenekler:

pygmentize iyidir. Bir takma adım var:

alias c='pygmentize -g'

ancak öne çıkan bir diğer seçenek de

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

Kurulum:

Şunu pygmentskullanarak yüklemeniz gerekebilir :

sudo pip install pygments
sudo easy_install Pygments #for Mac user

ve highlighttüm dağıtımlarda kolayca bulunabilen paket için

sudo apt-get install highlight
sudo yum install highlight

Eylemde:

Vurgulamalarda iyi bir karşılaştırma için aşağıda her ikisi için de fotoğraf ekliyorum

Burada pygmentize eylemde: Python dosyasında vurgulamayı büyütme

ve bu highlight: Python dosyasında vurgulama


4
highlightbenim ihtiyaçları için harika çalıştı ve kolayca monte, teşekkürler. Uzantıları olmayan dosyalara (ör. .Bash_aliases) bakmak istiyorsanız, eklemek --syntax=bashiçin ek olarak ekleyin -O ansi.
jerclarke

1
# pip install Pygments # echo "takma ad catc = 'pygmentize -g'" >> "~ / .bashrc" # kapalı terminal # açık terminal # catc test.js --- ve mükemmel işler :-) 😊
BG Bruno

3
highlightbu python programından 34 kat daha hızlıdır. Klasik dillerin gücü güçlüdür.
Avindra Goolcharan

2
Çünkü highlight, --forcediğer adı eklemek istersiniz , aksi takdirde anlamadığı dosya formatları için bir hata atar, bunun catyerine yedek olarak çıktıyı hala vurgulamadan göstermesini istersiniz, bu da ne --forceolur. Hep birlikte:alias cat="highlight -O ansi --force"
Alexander Klimetschek

1
@ Luke bu yüzden eklemeniz gerekir -O ansivarsayılan html çıktı :-)
Thomas

59

Nisan 2018 sonundan itibaren:

Bat - Sözdizimi vurgulamalı ve Git entegrasyonlu bir kedi (1) klonu.

Proje, Rust ile yazılmış renk ve özelleştirmeleri destekleyen bir kedi klonudur. Sadece birden fazla tema ile sözdizimi vurgulama değil, aynı zamanda Git entegrasyonu da sunar. Belgelerde açıklandığı gibi:

bat aşağıdaki hedeflere ulaşmaya çalışır :

  • Güzel, gelişmiş sözdizimi vurgulama sağlar
  • Dosya değişikliklerini göstermek için Git ile entegre edin
  • (POSIX) kedi için yedek parça olun
  • Kullanıcı dostu bir komut satırı arayüzü sunun

Söylemeye gerek yok, pygmentize etmekten çok daha hızlı ve büyük dosyalarla karşılaştığında boğulmuyor.

Kaynak kodu ve ikili sürümler + kurulum talimatları Github deposunda bulunabilir ve alternatif programlarla karşılaştırılabilir .


5
İnsanların bahsetmeyi unuttukları şey, batvarsayılan olarak etkileşimli modda kalmasıdır. Daha çok davranması için cat, onu -ppargüman ile kullanın . Gibi bir takma ad alias cat="bat -pp", insanların aradıkları şeydir.
Canella

1
Daha önce kediyi renklendirmek için pygmentize kullanıyordum, ancak yarasa ile çözüm, pygmentize performansının subpar olduğu büyük dosyalar (birkaç MB'lik günlükler) için çok daha uygundur.
Christian.D

35

vimcat tek dosyalıdır (kabuk betiği) ve iyi çalışır:

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

Son güncelleme Aralık 2013'tendir. İpucu: tarafından dosya türünü tanımayı zorlayabilirsiniz vimcat -c "set ft=<type>".


12
Vimcat (veya vimpager) hakkında gerçekten güzel olan bir şey, ~/.vimrcsözdizimi vurgulamanızda tanımladığınız renk şemasına saygı göstereceğidir, hem düzenlemek (vim) veya yazdırmak (vimcat) isterken aynı olacaktır. Vimcat'in güncellenmiş bir versiyonunun vimpager deposunda bulunabileceğini unutmayın .
timss

Amaynut'un cevabı daha eski ve benzer
olibre

vimpagerbenim vim colourscheme kullanmıyorum.
WhyNotHugo

2
Hızlı bilimsel olmayan testimde, vimcat(1 ~ 2 saniyelik yürütme süresi) pymentize(~ 200ms) 'den çok daha yavaştır, highlight(~ 20ms)' den çok daha yavaştır cat(~ 2ms). Öte yandan, vimcatdaha fazla dosya türlerini işleme ve daha doğru hightlightve pygmentizeve ilk hızlıdır hala vimo :q. Bu yüzden bu özel görev için benim seçimim kazanıyor.
Penghe Geng

1
@olibre Bu cevap Amaynut'tan daha eski gibi görünüyor.
Franklin Yu

31

Aradığınız araç muhtemelen supercat ( hızlı bir giriş) Linux Journal tarafından yayınlanan ).

Bu cevabın geç olduğunu ve OP gerekliliklerini tam olarak karşılamadığını fark ediyorum. Bu yüzden sadece referans için ekliyorum (metin dosyası çıktısının nasıl renklendirileceğini arayan diğer insanlar için yararlı olabilir).


1
Bu o kadar kolay çalışmıyor gibi görünüyor, onu kurdum ve örnek yapılandırmayı kullandım, ancak renk etkisi
olmadı

Güzel, her şey çok yavaş. Bu iyi. Yapılandırma ile ilgili yardım için, bkz manpages.debian.org/testing/supercat/spc.1.en.html
okovko

Ek olarak, çeşitli diller için bazı yapılandırmalar için: github.com/tanderson92/supercat/tree/master/spcrc
okovko

20

Cat- ccat'in renklendirilmiş bir versiyonu var . Https://github.com/jingweno/ccat/ adresinden alın .

Linux / Windows / macOS üzerinde kurulum

Tek başına çalıştırılabilir tek bir yürütülebilir dosyadır , bu nedenle yüklemek için işletim sisteminizin ikili sürümünü https://github.com/jingweno/ccat/releases adresinden açabilir ve örneğin ccat ikili dosyasını kopyalayabilirsiniz ./usr/local/bin .

İkililerden kaçınmak istiyorsanız veya platformunuz için ikili yoksa (örn. Ahududu pi, vb.), O zaman bir çalışma gogeliştirme ortamına sahip olduğunuzdan ( apt install golangdebian tabanlı linux'larda veya mac'ta brew install golang) alternatif olarak kaynaktan derleyebilirsiniz :

go get -u github.com/jingweno/ccat

ccatBinarysini altında oluşturulacaktır $GOPATH/bin.

Homebrew ile Mac'e yükleme

brew install ccat

Takma ad cat

Düzenli öğesini eklenti catile değiştirmek için :ccat~/.bashrc

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

ccatuygulanan Go , bu nedenle çok daha hızlı gibi Python tabanlı çözümlere göre daha çalışır bir ikil olan pygments , modül arkasında pygmentize; Ben arasında herhangi bir fark hız farkını görmedik catve ccat.


1
Uygun repo adı nedir? Ubuntu 16'daki apt-get ccat bana bir çeşit şifreleme programı veriyor ve şu anda tüm proc dizinimi şifrelemeye veya şifresini çözmeye çalıştığından terminalimi biraz
komikleştirdi

@KatasticVoyage: benim kötü: bir nedenden dolayı depolarda olduğunu varsaydım ve ubuntu kutumda nasıl bulduğumu unuttum. Güncellenmiş cevaba bakınız.
ccpizza

2
Şu anda, brew install ccatyeterli gibi görünüyor , artık gerek brew tapyok.
Jeff Huijsmans

12

Makinenizde vim varsa bunu yapmanın en iyi yolu ve bunu yapmanın en kolay yolu vimcat, vimpagerprogramla birlikte gelen kullanmaktır .

  1. İle vimpage kur git clone git://github.com/rkitover/vimpager cd vimpager sudo make install
  2. Vimcat'i çalıştırın:

    vimcat index.html


Fikri seviyorum, ama vimcat burada daha yavaş olanlar arasında. Pigmentize etmek kadar yavaştır. Makinemdeki 30 satırlık bash komut dosyasından 15 highlightkat daha yavaş ve 3 kat daha yavaş bat.
Ponkadoodle

11

source-highlight

Belki source-highlight GNU altında ilginç bir şey bulmak mümkündür : farklı bir paket highlight.

Alıntı apt-cache show source-highlight:

Description-tr: Kaynak kodunu vurgulanan belgenin sözdizimine dönüştürür.
Bir kaynak dosyası verilen bu program, sözdizimi vurgulamalı bir belge oluşturur.
100'den fazla dosya biçimi için sözdizimi vurgulamayı destekler ...
Çıktı için aşağıdaki biçimler desteklenir: HTML, XHTML, LaTeX, Texinfo, ANSI renk kaçış dizileri ve DocBook

Bazı takma adlar yaptım (Cat ve PCat, aşağıya bakın) ve bu onların çıktısı

Ekran Örneği

Debian'a aşağıdakileri temel alarak yükleyebilirsiniz:

sudo apt-get install source-highlight

ve .bash_aliasesaşağıdaki satır gibi bir şeyle takma ad olarak ekleyin .

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

Veya benzer bir takma ad yapabilirsiniz ( -isonunda borulama olanağına sahip olmak için )

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

Komut satırıyla vurgulamayı seçmek veya zorlamak veya bu görevi programa bırakmak mümkün man source-highlightolan -salt çizgilerden okumak mümkün olan seçenekler arasında :

-s , --src-lang = STRING kaynak dili (tam listeyi almak için --lang-list komutunu kullanın). Belirtilmezse, kaynak dil dosya uzantısından tahmin edilir .

--lang-list desteklenen tüm dilleri ve ilgili dil tanımı dosyalarını listeler


1
Ayrıca Colorize istiyorsanız lessile source-highlight, birisi GitHub cevap verir: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"ve export LESS=" -R ". pygmentizeMevcut olmadığında ve kurulamadığında çok kullanışlıdır .
Lalylulelo

8

Anladığım kadarıyla, ikiliğin kendisi renklerden sorumlu değildir. Kabuk bu.

Bu doğru değil. Terminal sadece terminale çıkan renk kodlarını yorumlar. Kabiliyetine bağlı olarak, belirli biçimlendirme / renklendirme kodlarını yoksayabilir.

Adam sayfasından kedi çıktısını renklendirmeyi desteklemiyor gibi görünüyor. Grep gibi renklendirmeyi desteklese bile metin dosyasında ne renk olmalı? Sözdizimi, kedi gibi basit bir fayda kapsamında olmayan temel dil bilgisini vurgulamaktadır.

Vurgulanan kodun hedefiniz olduğunu düşünüyorsanız, unix platformunda vim, emacs, gedit vb. Gibi daha güçlü editörleri deneyebilirsiniz.


3
catSatır numaralı dosyaları yazdırmak için değil, birden fazla boş satırı sıkıştırmak için değil, yazdırılmayan ASCII karakterlerine bakmak için değil, dosyaları birleştirmek için.” - UNIX Stilinden veya kedi -v Zararlı olarak kabul edilir .
Scott

7

OSX'te basitçe yapın brew install ccat.

https://github.com/jingweno/ccat . Kedi gibi ama sözdizimi vurgulamalı içerik görüntüler. Dahili Go.


Güzel. Bazı dil sınırlamaları vardır, ancak pıhtılardan çok daha hızlı hisseder.
Gustavo Bezerra

ccat ayrıca Arch Linux'un AUR deposunda da bulunabilir. Paketi kurmak için yaourt veya pacaur kullanın.
Marcs


3

Eski soru, ben sadece cevap kullanarak kullanarak çözüm sağlamak için sonuçlandı. Belki de bu biraz hacky (muhtemelen parametrenin orijinal amacı değil), ancak:

takma ad cgrep = 'grep -C 9000'

ne olursa olsun kedi | cgrep 'snozzberries'

.. grep -C Nbulunan öğenin üstünde ve altında N bağlam satırı sağlar. Girişten daha büyükse, tüm giriş dahil edilir. Bu durumda, manuel olarak bakmak isteyeceğimiz herhangi bir tipik terminal çıkışından daha büyük olduğundan emin oluruz, bu genellikle vurgulama yaparken yapmak istediğiniz şeydir.

EDIT: Ancak, aşağıda Beni Cherniavsky-Paskin tarafından önerilen bu çözüm üstündür - ya aradığınız kelime ya da satırın başlangıcı (vurgulanabilir değil) ile eşleşir (ve vurgular). Net sonuç tam olarak istediğiniz şeydir.

cat whatever | egrep 'snozzberries|$'

Bu sorun için gördüğüm en iyi çözüm, teşekkürler Beni.


2
Tüm hatları dahil ederken bir deseni vurgulamanın daha sağlam bir yoluegrep 'snozzberries|$'
Beni Cherniavsky-Paskin


1

Renklendirme yapmak için küçük bir senaryo yazdım 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
}

Ve sonra komut dosyası için bir takma ad oluşturun. alias cat=colorize_via_pygmentize. Ayrıca ~ / .bashrc içine kaydetmeyi unutmayın .


0

Tek bir astarın catçıktıyı belirli bir renge ayarlamasını istiyorsanız,

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

senin için ~/.$(basename $SHELL)rc

İşte renk kodları olan bir öz: https://gist.github.com/chrisopedia/8754917

Seviyorum '\e[1;93m', yüksek yoğunluklu sarı. Şöyle görünüyor:resim açıklamasını buraya girin


0

sadece vim ve bu vimrc dosyasını kullanın .

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 alternatif olabilir.


0

~ / .Bashrc'nize yerleştirin

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

sonra

ccat filename

Whalebrew , Docker görüntüleri için takma adlar oluşturur, böylece bunları yerel komutlarmış gibi çalıştırabilirsiniz. Homebrew gibi, ama Docker görüntüleri var.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.