Cú pháp tô sáng / tô màu con mèo


202

Có một phương pháp để tô màu đầu ra của cat, cách greplàm.

Đối với grep, trong hầu hết các bảng điều khiển, nó hiển thị một đầu ra có màu làm nổi bật các từ khóa được tìm kiếm. Mặt khác, bạn có thể buộc nó bằng cách gọi grep --color Có một cách chung để tô màu đầu ra của bất kỳ chương trình nào theo lựa chọn cá nhân của bạn.

Theo những gì tôi hiểu, bản thân chương trình không chịu trách nhiệm về màu sắc. Nó là cái vỏ.

Tôi đang sử dụng shell mặc định trong FreeBSD 5.2.1, có vẻ như nó chưa bao giờ thấy màu kể từ epoch.


Tôi không thể hiểu những gì bạn đang cố nói
Lelouch Lamperouge

Ôi không. Tôi không muốn hiển thị nhị phân. Tôi chỉ muốn hiển thị đầu ra của một nhị phân theo cách tô màu.
Lelouch Lamperouge

6
meh - FTFY (bạn luôn có thể chỉnh sửa câu hỏi của riêng mình)
sehe

Tôi đã chỉnh sửa để tránh nhầm lẫn về thuật ngữ "nhị phân"
Volker Siegel

3
Tôi nghĩ rằng câu trả lời của @buergi phù hợp với câu hỏi và điều này cũng được hỗ trợ bởi số lượng upvote mà nó có. Xem xét thay đổi câu trả lời được chấp nhận.
Ioannis Filippidis

Câu trả lời:


22

catvới đánh dấu cú pháp chỉ đơn giản là ngoài phạm vi. catkhông có nghĩa là cho điều đó. Nếu bạn chỉ muốn có toàn bộ nội dung của một số tệp được tô màu theo một cách nào đó (với cùng màu cho toàn bộ tệp), bạn có thể sử dụng các chuỗi thoát thiết bị đầu cuối để kiểm soát màu.

Đây là một tập lệnh mẫu sẽ chọn màu dựa trên loại tệp (bạn có thể sử dụng một cái gì đó như thế này thay vì gọi cattrực tiếp):

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

Ở trên (trên một thiết bị đầu cuối hỗ trợ các chuỗi thoát đó) sẽ in bất kỳ tệp văn bản nào dưới dạng 'đậm' và sẽ in bất kỳ tệp nhị phân nào thành màu đỏ. Bạn có thể sử dụng stringsthay vì catđể in các tệp nhị phân và bạn có thể tăng cường logic để làm cho nó phù hợp với nhu cầu của bạn.


Tôi đã nghĩ về một cái gì đó như thế này. Nhưng tôi cần một cái gì đó sẽ làm điều đó phổ quát. Không chỉ cat/ grep/any particular program
Lelouch Lamperouge

Sau đó, bạn có thể chỉ cần truyền lệnh được thực thi như một đối số cho tập lệnh và thay thế catlời gọi được mã hóa cứng bằng một số $cmdđược khởi tạo là $ 1 nếu có hai đối số hoặc mặc định nếu chỉ có một đối số. Sau đó, bạn chỉ cần viết : colorful.sh grep file.
Costi Ciudatu

8
"mèo không có nghĩa là cho điều đó." Cat không có nghĩa là để viết các tệp riêng lẻ vào thiết bị xuất chuẩn - đó là để nối. Nhưng điều đó vẫn không có nghĩa là viết các tệp riêng lẻ vào thiết bị xuất chuẩn không hữu ích. Không có nghĩa là làm nổi bật chúng là không hữu ích.
mikemaccana

Tôi đã thử, dưới cygwin pygmentizelà không thể tô màu. Bất cứ lời khuyên?
Truthadjustr

408

Tôi muốn giới thiệu pygmentizetừ gói python python-pygments. Bạn có thể muốn xác định bí danh tiện dụng sau (trừ khi bạn sử dụng ccattừ gói ccrypt).

alias ccat='pygmentize -g'

Cú pháp tô sáng đầu ra của mèo bằng cách sử dụng pyributionize

Và nếu bạn muốn số dòng:

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

22
Một giải pháp khác là sử dụng highlightlệnh linux . alias ccat='highlight -O ansi'
Evan Purkhiser

99
Đây phải là câu trả lời được chấp nhận IMHO. Thêm vào đó, tôi gọi nó là alias dog='pygmentize -g', bởi vì chó mát hơn mèo!
polym

8
Bạn có thể thêm ít -R để có thể cuộn mã:#!/bin/bash \n pygmentize -g $1 | less -R
Fabricio PH

6
Tôi gọi bí danh của tôi nyancat.
zneak

2
pyributionize hoạt động như mong đợi, nhưng không may là dường như khá chậm. : - /
Frerich Raabe

113

Tùy chọn:

pyributionize là tốt. Tôi có một bí danh:

alias c='pygmentize -g'

nhưng nổi bật là một lựa chọn khác có sẵn rộng rãi là

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

Cài đặt:

Bạn có thể phải cài đặt pygmentsbằng cách sử dụng:

sudo pip install pygments
sudo easy_install Pygments #for Mac user

và cho highlightgói dễ dàng có sẵn trên tất cả các bản phân phối

sudo apt-get install highlight
sudo yum install highlight

Trong hành động:

Tôi đang đính kèm các bức ảnh cho cả hai phía dưới để có sự so sánh tốt trong phần tô sáng

Đây là pygmentizehành động: Làm nổi bật hình ảnh trên tệp python

và đây là highlight: Đánh dấu nổi bật trên tập tin python


4
highlightlàm việc tuyệt vời cho nhu cầu của tôi và cài đặt dễ dàng, cảm ơn. Nếu bạn muốn xem các tệp mà không có phần mở rộng (ví dụ: .bash_aliases) thì hãy thêm --syntax=bashvào -O ansiđể buộc nó.
jerclarke

1
# pip cài đặt Pygments # echo "alias catc = 'pyributionize -g'" >> "~ / .bashrc" # close terminal # open terminal # catc test.js --- và hoạt động hoàn hảo :-)
BG Bruno

3
highlightnhanh hơn 34 lần so với chương trình python đó. Sức mạnh của các ngôn ngữ cổ điển giữ vững.
Avindra Goolcharan

2
Đối với highlight, bạn muốn thêm --forcevào bí danh, nếu không, nó sẽ gây ra lỗi cho các định dạng tệp mà nó không hiểu, trong khi catthay thế bạn muốn nó vẫn hiển thị đầu ra mà không làm nổi bật, đó là những gì --force. Tất cả cùng nhau:alias cat="highlight -O ansi --force"
Alexander Klimetschek

1
@Luke đó là lý do tại sao bạn nên thêm -O ansimặc định là xuất html :-)
Thomas

59

Từ cuối tháng 4 năm 2018 trở đi:

Bat - Một con mèo (1) nhân bản với tô sáng cú pháp và tích hợp Git.

Dự án là một bản sao mèo với sự hỗ trợ cho màu sắc và các tùy chỉnh được viết bằng Rust. Nó không chỉ cung cấp cú pháp tô sáng với nhiều chủ đề, mà còn tích hợp Git. Như được mô tả trong tài liệu:

bat cố gắng để đạt được các mục tiêu sau đây :

  • Cung cấp tô sáng cú pháp đẹp, nâng cao
  • Tích hợp với Git để hiển thị sửa đổi tệp
  • Hãy là người thay thế thả cho mèo (POSIX)
  • Cung cấp giao diện dòng lệnh thân thiện với người dùng

Không cần phải nói, nhanh hơn nhiều so với pyjectionize và không bị nghẹt thở khi đối mặt với các tệp lớn.

Mã nguồn và bản phát hành nhị phân + hướng dẫn cài đặt có thể được tìm thấy trong kho Github, cũng như so sánh với các chương trình thay thế .


5
Những gì mọi người quên đề cập đến là batở chế độ tương tác theo mặc định. Đối với nó để hành xử giống như cat, sử dụng nó với -ppđối số. Một bí danh giống như alias cat="bat -pp"là những gì mọi người đang tìm kiếm.
Canella

1
Tôi đã sử dụng pyributionize để tô màu con mèo trước đây, nhưng giải pháp với bat phù hợp hơn nhiều đối với các tệp lớn (nhật ký của vài MB), trong đó hiệu suất py pyize là phụ.
Christian.D

35

vimcat là tập tin đơn (shell script) và hoạt động tốt:

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

Cập nhật lần cuối là từ tháng 12 năm 2013. Gợi ý: bạn có thể buộc nhận dạng loại tệp bằng cách vimcat -c "set ft=<type>".


12
Một điều thực sự thú vị về vimcat (hoặc vimpager) là nó sẽ tôn trọng màu sắc mà bạn đã xác định trong ~/.vimrccú pháp tô sáng cú pháp của bạn sẽ giống nhau khi muốn chỉnh sửa (vim) hoặc in ra (vimcat). Lưu ý rằng một phiên bản cập nhật của vimcat có thể được tìm thấy trong repositiory vimpager .
timss

Câu trả lời của Amaynut cũ hơn và tương tự
olibre

vimpagerkhông sử dụng vim colorscheme của tôi.
WhyNotHugo

2
Trong thử nghiệm không khoa học nhanh của tôi, vimcat(thời gian thực hiện 1 ~ 2 giây) chậm hơn nhiều so với pymentize(~ 200ms), chậm hơn nhiều so với highlight(~ 20ms), chậm hơn nhiều so với cat(~ 2ms). Mặt khác, vimcatxử lý các loại tập tin hơn và chính xác hơn hightlightpygmentize, và nó vẫn là nhanh hơn so với lần đầu tiên vimsau đó :q. Vì vậy, nó kiếm được lựa chọn của tôi cho nhiệm vụ cụ thể này.
Penghe Geng

1
@olibre Câu trả lời này có vẻ cũ hơn câu trả lời từ Amaynut.
Franklin Yu

31

Công cụ bạn đang tìm kiếm có lẽ là supercat (đây là phần giới thiệu nhanh được xuất bản bởi Tạp chí Linux).

Tôi nhận ra rằng câu trả lời này là muộn và nó không đáp ứng đầy đủ các yêu cầu của OP. Vì vậy, tôi thêm nó chỉ để tham khảo (nó có thể hữu ích cho những người khác đang tìm cách tô màu đầu ra tệp văn bản).


1
Điều này dường như không hoạt động dễ dàng, tôi đã cài đặt nó và sử dụng cấu hình ví dụ, nhưng nó không có hiệu ứng màu
rubo77

Đẹp, mọi thứ khác là quá chậm. Điều này là tốt Để được trợ giúp về cấu hình, hãy xem manpages.debian.org/testing/supercat/spc.1.en.html
okovko

Ngoài ra, đối với một số cấu hình cho các ngôn ngữ khác nhau: github.com/tanderson92/supercat/tree/master/spcrc
okovko

20

Có một phiên bản màu của mèo - ccat . Nhận nó từ https://github.com/jingweno/ccat/ .

Cài đặt trên Linux / Windows / macOS

Nó là một tệp thực thi độc lập duy nhất vì vậy để cài đặt nó, bạn có thể giải nén phiên bản nhị phân cho HĐH của mình từ https://github.com/jingweno/ccat/release và sao chép tệp nhị phân ccat chẳng hạn để/usr/local/bin .

Nếu bạn muốn tránh nhị phân hoặc nếu không có nhị phân cho nền tảng của bạn (ví dụ: raspberry pi, v.v.), thì bạn có thể biên dịch luân phiên từ nguồn cho rằng bạn đã làm việc go môi trường phát triển ( apt install golangtrên linux dựa trên debian hoặc brew install golangtrên mac):

go get -u github.com/jingweno/ccat

Các ccatnhị phân sẽ được tạo ra dưới của bạn $GOPATH/bin.

Cài đặt trên Mac thông qua homebrew

brew install ccat

Bí danh để cat

Để thay thế thường xuyên cat bằng ccatadd in ~/.bashrc:

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

ccatđược triển khai trong Go , do đó, nó là một nhị phân nguyên gốc chạy nhanh hơn nhiều so với các giải pháp dựa trên Python, chẳng hạn như pygments , mô-đun phía sau pygmentize; Tôi không thấy bất kỳ sự khác biệt đáng chú ý về tốc độ giữa catccat.


1
Tên repo thích hợp là gì? apt-get ccat trong Ubuntu 16 cung cấp cho tôi một số loại chương trình mã hóa và hơi bị đóng cục một cách vui nhộn khi thiết bị hiện đang cố mã hóa hoặc giải mã toàn bộ thư mục Proc của tôi ...
Katastic Voyage

@KatasticVoyage: xấu của tôi: vì một số lý do tôi đã cho rằng nó nằm trong repos và tôi quên mất làm thế nào tôi nhận được nó trong hộp ubfox của tôi. Xem câu trả lời cập nhật.
ccpizza

2
Hiện tại, có vẻ như brew install ccatlà đủ, không cần brew tapnữa.
Jeff Huijsmans

12

Cách tốt nhất và cách dễ nhất để làm điều đó nếu bạn có vim trong máy là sử dụng chương trình vimcatđi kèm vimpager.

  1. Cài đặt vimpage với git clone git://github.com/rkitover/vimpager cd vimpager sudo make install
  2. Chạy vimcat:

    vimcat index.html


Tôi thích ý tưởng này, nhưng vimcat là một trong những người chậm hơn ở đây. Nó chậm như py pyize. Chậm hơn 15 lần so với highlightvà chậm hơn 3 lần so batvới tập lệnh bash 30 dòng trên máy của tôi.
Ponkadoodle

11

source-highlight

Có lẽ bạn có thể tìm thấy thú vị source-highlight được phát hành theo GNU : một gói khác vớihighlight .

Trích từ apt-cache show source-highlight:

Mô tả-en: chuyển đổi mã nguồn thành tài liệu được tô sáng cú pháp.
Chương trình này, được cung cấp một tệp nguồn, tạo ra một tài liệu với cú pháp tô sáng.
Nó hỗ trợ tô sáng cú pháp cho hơn 100 định dạng tệp ...
Đối với đầu ra, các định dạng sau được hỗ trợ: HTML, XHTML, LaTeX, Texinfo, chuỗi thoát màu ANSI và DocBook

Tôi đã thực hiện một số bí danh (Cat và PCat, xem bên dưới) và đây là đầu ra của chúng

Ví dụ màn hình

Bạn có thể cài đặt trên Debian dựa trên

sudo apt-get install source-highlight

và thêm nó dưới dạng bí danh, ví dụ như trong của bạn .bash_aliasesvới một cái gì đó giống như dòng dưới đây.

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

Hoặc bạn có thể thực hiện một bí danh tương tự (không có -iphần cuối để có khả năng đưa vào )

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

Trong số các tùy chọn có thể đọc từ man source-highlightphần -sgạch chân có thể chọn hoặc bắt buộc , tô sáng bằng dòng lệnh hoặc để lại cho chương trình nhiệm vụ này:

-s , --src-lang = STRING ngôn ngữ nguồn (sử dụng --lang-list để có được danh sách đầy đủ). Nếu không được chỉ định, ngôn ngữ nguồn sẽ được đoán từ phần mở rộng tệp .

--lang-list liệt kê tất cả các ngôn ngữ được hỗ trợ và tệp định nghĩa ngôn ngữ được liên kết


1
Nếu bạn cũng muốn tô màu lessvới source-highlight, ai đó trên GitHub sẽ đưa ra câu trả lời: export LESSOPEN="| source-highlight -f esc -i %s -o STDOUT"export LESS=" -R ". Rất hữu ích khi pygmentizekhông có sẵn và không thể được cài đặt.
Lalylulelo

8

Từ những gì tôi hiểu, bản thân nhị phân không chịu trách nhiệm cho màu sắc. Nó là cái vỏ.

Điều đó không đúng. Terminal chỉ diễn giải các mã màu được xuất ra terminal. Tùy thuộc vào khả năng của nó, nó có thể bỏ qua các mã định dạng / tô màu nhất định.

Từ trang man, có vẻ như mèo không hỗ trợ tô màu đầu ra của nó. Ngay cả khi nó hỗ trợ tô màu như grep thì nó nên tô màu gì trong tệp văn bản? Cú pháp làm nổi bật kiến ​​thức cần thiết về ngôn ngữ cơ bản không thuộc phạm vi của tiện ích đơn giản như mèo.

Bạn có thể thử các trình soạn thảo mạnh hơn như vim, emacs, gedit, v.v. trên nền tảng unix nếu thấy mã được tô sáng là mục tiêu của bạn.


3
catKhông phải là để in file với số dòng, nó không phải là để nén nhiều dòng trống, nó không cho nhìn không in ký tự ASCII, nó cho concatenating tập tin.” - từ UNIX Style, hoặc mèo -v được coi là có hại .
Scott

7

Trên OSX chỉ cần làm brew install ccat.

https://github.com/jingweno/ccat . Giống như mèo nhưng hiển thị nội dung với cú pháp tô sáng. Được xây dựng trong Go.


Đẹp. Có một số hạn chế về ngôn ngữ nhưng nó cảm thấy nhanh hơn rất nhiều so với pygments.
Gustavo Bezerra

ccat cũng có thể được tìm thấy trong kho AUR của Arch Linux. Sử dụng yaourt hoặc pacaur để cài đặt gói.
Marcs


3

Câu hỏi cũ, chỉ trả lời cho hồ sơ để cung cấp giải pháp tôi đã sử dụng. Có lẽ đây là một chút hack (có thể không phải là mục đích ban đầu của tham số), nhưng:

bí danh cgrep = 'grep -C 9000'

mèo gì cũng được | cgrep 'snozzberries'

.. grep -C Nsẽ cung cấp N dòng ngữ cảnh bên trên và bên dưới mục tìm thấy. Nếu nó lớn hơn đầu vào, toàn bộ đầu vào được bao gồm. Trong trường hợp này, chúng tôi chỉ đảm bảo rằng nó lớn hơn bất kỳ đầu ra thiết bị đầu cuối thông thường nào mà chúng tôi muốn xem xét thủ công, đó thường là những gì bạn đang muốn làm nếu làm nổi bật.

EDIT: Tuy nhiên, giải pháp này được đề xuất dưới đây của Beni Cherniavsky-Paskin là vượt trội - nó phù hợp (và nổi bật) hoặc là từ bạn đang tìm kiếm hoặc đầu dòng (không nổi bật). Kết quả cuối cùng là chính xác những gì bạn muốn.

cat whatever | egrep 'snozzberries|$'

Đó là giải pháp mới tốt nhất tôi từng thấy cho vấn đề đó, cảm ơn Beni.


2
Một cách mạnh mẽ hơn để làm nổi bật một mẫu trong khi bao gồm tất cả các dòng làegrep 'snozzberries|$'
Beni Cherniavsky-Paskin


1

Tôi đã viết kịch bản nhỏ để thực hiện việc sử dụng thông tin 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
}

Và sau đó tạo một bí danh cho kịch bản. alias cat=colorize_via_pygmentize. Cũng đừng quên lưu cái này trong ~ / .bashrc .


0

Nếu bạn chỉ muốn một lớp lót để đặt catđầu ra thành một màu nhất định, bạn có thể chắp thêm

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

cho bạn ~/.$(basename $SHELL)rc

Đây là một ý chính với mã màu: https://gist.github.com/chrisopedia/8754917

Tôi thích '\e[1;93m', đó là màu vàng cường độ cao. Nó trông như thế này:nhập mô tả hình ảnh ở đây


0

chỉ cần sử dụng vim và tập tin vimrc này .

lót:

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 cũng có thể là một sự thay thế


0

Đặt trong ~ / .bashrc của bạn

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

sau đó

ccat filename

Whalebrew tạo bí danh cho hình ảnh Docker để bạn có thể chạy chúng như thể chúng là các lệnh gốc. Nó giống như Homebrew, nhưng với hình ảnh Docker.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.