เมื่ออ่านไฟล์ที่มี `น้อยกว่า 'หรือมากกว่านั้น' ฉันจะได้รับเนื้อหาเป็นสีได้อย่างไร


415

เมื่อฉันอ่านไฟล์ใน Linux ด้วยคำสั่งlessหรือmoreฉันจะรับเนื้อหาเป็นสีได้อย่างไร


5
สิ่งนี้ดูเหมือนจะเกี่ยวข้อง: superuser.com/questions/36022/less-and-grep-color - มันช่วยได้ไหม
Jonik

7
ชื่อของคำถามนี้ทำให้เข้าใจผิดมาก มีหลายคนที่ลงจอดบนหน้านี้คาดหวังว่าจะได้รับการแก้ไขปัญหาการระบายสีที่คุณจะได้รับเมื่อทำการไพพ์คำสั่งที่มีเอาต์พุตเป็นlessสี: สีจะหายไป (คำตอบว่าปัญหา“ท่อ” ที่เกี่ยวข้องกับการless -R, unbufferฯลฯ ) แต่คำถามที่เกิดขึ้นจริงหมายถึงการเปิดไฟล์ ! - ความคลุมเครือนั้นอยู่ที่หัวข้อของคำถามเป็นหลัก แต่ถึงอย่างนั้น IMHO คำถามก็ยังกว้างเกินไป:” อ่านไฟล์“ สามารถอ้างถึงไฟล์ใดก็ได้ (อาจเป็นข้อความธรรมดา) (ดี“ได้รับเนื้อหาในสี” อาจจะหมายถึงการเน้นไวยากรณ์.)
myrdd

ฉันต้องแก้ไขตัวเองเพียง 3 (หรือ 4) จาก 14 คำตอบที่หายไปจากคำถามจริงของ OP: คำตอบของChristopheD , PuneetและOnlyjob ; และอาจจะjbbr ถึงกระนั้นคำตอบสองข้อนั้นเป็นส่วนหนึ่งของคำตอบที่ได้รับการโหวตสูงสุดสามข้อ
myrdd

@myrdd "การเน้นไวยากรณ์" เป็นคำที่เกี่ยวข้องแล้ว ... (มันถามเกี่ยวกับการแสดงสีไม่เพิ่มสี?) less -Rจะทำงานกับไฟล์ได้เช่นกันls --color=always > /tmp/file && less -R /tmp/file
Gert van den Berg

1
@myrdd มันอาจจะเหมาะสมที่สุดสำหรับคำถามที่จะถูกปิดเป็น "ไม่ชัดเจนสิ่งที่ถูกถาม" เนื่องจากคำถามที่ถามใด ๆ ของทั้งสองมีแนวโน้มที่จะได้รับการทำเครื่องหมายว่าซ้ำกันของนี้ ... (และคำตอบสำหรับทั้งสองสามารถ downvoted ขึ้นอยู่กับวิธีที่ผู้มีสิทธิเลือกตั้งตีความมัน ... ) (กรณีการใช้งานของฉันเป็นไฟล์บันทึกที่ (น่ารำคาญ) มีรหัสยกเว้นสีอยู่)
Gert van den Berg

คำตอบ:


149

คุณสามารถใช้พลังของการเติมเชื้อเพลิงให้น้อยลงได้โดยอัตโนมัติ! (ไม่ต้องไปป์ด้วยมือ)

ติดตั้ง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

ทดสอบบนเดเบียน

คุณได้รับความคิด สามารถปรับปรุงให้ดีขึ้นได้แน่นอนโดยยอมรับนามสกุลเพิ่มเติมหรือแยกวิเคราะห์ shebang สำหรับล่ามคนอื่นมากกว่าทุบตี ดูคำตอบอื่น ๆ ของสิ่งนั้น

ความคิดมาจากการโพสต์บล็อกเก่าจากผู้สร้างของ Pygmentsแต่โพสต์เดิมไม่มีอยู่อีกต่อไป


6
หากคุณต้องการที่จะมีสีของไฟล์ที่มารหัสคุณยังต้องทำให้ ~ ปฏิบัติการ / .lessfilter chmod u+x ~/.lessfilterโดยการเรียกใช้ นอกจากนี้คุณยังต้องติดตั้งpyrideize ( pygments.org/download ) ด้วย
Sergiy Belozorov

ทุกคนสามารถยืนยันได้ว่าการทำงานนี้จะไม่มีผลกับฉันเมื่อฉันรันคำสั่งเช่นls -l | less
puk

7
@puk ls --color=always -l | less -Rคุณสามารถทำสิ่งที่ชอบ เห็นได้ชัดว่ามีหลายประเภท แต่คุณสามารถใช้นามแฝงเป็นบางอย่างllได้ นั่นคือถ้าคุณไม่ต้องการใช้ไลบรารีพิเศษใด ๆ
PhilT

2
เพิ่มความคิดเห็นของ @ SergiyByelozyorov ลงในคำตอบแล้ว
andrybak

2
การแก้ไขของฉันถูกปฏิเสธดังนั้นฉันเดาว่าฉันจะโพสต์เป็นความคิดเห็นแทน: อย่าทดสอบรหัสออกของคำสั่งทางอ้อม คุณสามารถใช้if grep -q "#\!/bin/bash" "$1"(ไม่ใช้-qเอาต์พุตมาตรฐาน) 2>/dev/nullคุณอาจต้องการที่จะเปลี่ยนเส้นทางข้อผิดพลาดมาตรฐานด้วย
Tom Fenech

503

ลองทำสิ่งต่อไปนี้:

less -R

จากman less:

-r หรือ --raw-control-chars

ทำให้อักขระควบคุม "raw" ถูกแสดง ( ... )

-R หรือ --RAW-CONTROL-CHARS

กด-rไลค์ แต่ ANSI "color" escape sequences เท่านั้นที่เอาต์พุตในรูปแบบ "raw" ( ... )


17
สิ่งนี้มีประโยชน์เมื่อไฟล์ตัวเองมีรหัสการหลบหนีที่จะต้องแสดง
Nitrodist

1
ฉันเคยรู้เกี่ยวกับ -r น้อยกว่า แต่การค้นหาในไฟล์โดยใช้ "/" ทำให้เกิดบรรทัดที่ไม่ถูกต้อง ดูเหมือนว่าจะทำงานได้ดีขึ้น ขอบคุณสำหรับทิป.
Amos Shapira

54
ควรสังเกตว่าโปรแกรมส่วนใหญ่ใช้isatty(2)syscall เพื่อตรวจสอบว่าเอาต์พุตมาตรฐานของพวกเขาเป็นเทอร์มินัลหรือไม่และมักจะปิดใช้งานเอาท์พุท colorized หากไม่ได้ สำหรับไปป์ใด ๆ ที่น้อยกว่าisattyจะส่งคืน 0 หากต้องการตรวจสอบว่าใช้งานได้หรือไม่ลองecho -e '\x1b[32;1mtest\x1b[m' | less -r
mic_e

11
คำตอบนี้ไม่ได้เป็นเลิศในการทดสอบสิ่งที่จริง
Michael Wolf

18
คุณยังสามารถพิมพ์-Rเมื่อคุณเปิดlessเพื่อรับสิ่งนี้ได้แล้ว
Scz

138

ฉันได้รับคำตอบในโพสต์อื่น: Less and Grep: รับผลสีเมื่อใช้ไพพ์จาก grep ถึง less

เมื่อคุณเรียกใช้grep --colorมันก็หมายความgrep --color=autoว่าตรวจพบว่าการส่งออกเป็นขั้วและถ้าเปิดใช้งานสี อย่างไรก็ตามเมื่อตรวจพบท่อจะปิดการใช้งานการระบายสี คำสั่งต่อไปนี้:

grep --color=always "search string" * | less -R

จะเปิดใช้งานการระบายสีและแทนที่การตรวจจับอัตโนมัติเสมอและคุณจะได้รับการเน้นสีน้อยกว่า

คำเตือน: อย่าใส่--color=alwaysชื่อแทนมันอาจทำให้บางสิ่งบางอย่างเสียหาย นั่นเป็นเหตุผลที่มี--color=autoตัวเลือก


6
ขอบคุณมาก ยกเว้นว่าฉันต้องใช้-Rเป็นตัวเลือกlessเช่นกัน
naught101

10
ฉันเชื่อว่าgrep -Rใช้ระบุการค้นหาแบบเรียกซ้ำ less -Rจำเป็นสำหรับlessการพ่นสีออกมาอย่างถูกต้อง grep --color=always [grep cmds] | less -Rใช้ได้กับฉันใน OS X 10.7.3!
Steven Lu

@ naught101 @Steven Lu แก้ไขแล้ว แต่ดูเหมือนว่าบางคนอาจไม่จำเป็นต้องใช้less -R(ตามที่ผู้เขียนโพสต์ต้นฉบับอยู่แล้ว)
jtpereyda

2
มีอยู่หรือไม่ที่จะให้ grep รู้เพียงแค่ใช้คำสั่ง -R น้อยลงแล้วค่อยทำการระบายสี? ดังนั้นเราไม่จำเป็นต้องใส่ --color = เสมอและน้อยกว่า -R ตลอดเวลา
A-letubby

1
นี่คือคำตอบที่ง่ายที่สุดในการทำงาน ขอบคุณ!
Danny Staple

37

ใช้แทนview lessมันจะเปิดไฟล์ด้วยvimในโหมดอ่านอย่างเดียว

มันเป็นสีจริงless: เพจเจอร์ที่คุณสามารถค้นหาด้วย/(และอื่น ๆ ) ข้อเสียเปรียบเพียงอย่างเดียวคือคุณไม่สามารถออกได้ด้วยqแต่คุณต้องการ:q

นอกจากนี้คุณยังได้รับสีเดียวกับvim(เนื่องจากคุณใช้จริงvim)


ประสิทธิภาพของไฟล์ขนาดใหญ่เป็นอย่างไร? การเน้นไวยากรณ์ของกลุ่มคือรู้ว่าจะช้าในไฟล์ขนาดใหญ่
pihentagy

ฉันไม่ทราบว่าสิ่งที่มีค่าสำหรับ 'ใหญ่' ของคุณ แต่การเปิดไฟล์ ~ 10,000 บรรทัดเป็นสิ่งที่เกิดขึ้นทันที
Riccardo Galli

1
ฉัน upvoted (ฉันไม่รู้view) แต่ข้อเสียอื่นคือ j / k / up / down ไม่เลื่อนทันทีเนื่องจากมีเคอร์เซอร์
Tyler Collier

7
โปรดทราบว่าคุณอาจต้องเพิ่มview -เมื่อทำการ
ไพพ์

6
vimเป็นตัวแก้ไขซึ่งโหลดไฟล์ทั้งหมดลงในหน่วยความจำในขณะที่lessเป็นเพจเจอร์โหลดไฟล์ลงในหน่วยความจำเพียงบางส่วนเท่านั้น คุณจะทราบถึงความแตกต่างของไฟล์ขนาดใหญ่
sjas

16

หากต้องการบอกให้น้อยลงเพื่อแสดงสีให้เรียกด้วย -R:

less -R

น่าเสียดายที่บางโปรแกรมตรวจพบว่า stdout ไม่ใช่เทอร์มินัลและปิดการใช้งานสี - เช่น pacman (Arch Linux package manager)

ในกรณีเหล่านั้นเป็นไปได้ที่จะใช้unbuffer:

unbuffer <command> | less -R

ตัวอย่างการใช้ pacman

unbuffer pacman -Ss firefox | less -R

unbufferคำสั่งมักจะเป็นส่วนหนึ่งของแพคเกจexpect(Arch Linux, Debian / Ubuntu) หรือexpect-dev(รุ่นมรดกของ Debian / Ubuntu)

ในการตอบคำถามเพื่อความสมบูรณ์:

อย่างที่คนอื่น ๆ ตอบแล้วpygmentizeมันยอดเยี่ยมสำหรับ colorizing source code unbufferมันไม่จำเป็นต้อง การโทรที่ง่ายที่สุด:

pygmentize someSource.cpp | less -R

2
ที่จะใช้unbufferบน Ubuntusudo apt install expect
Wisbucky

คำตอบนี้ต้องการ upvotes เพิ่มเติม
Thomas Dignan

ฉันพยายามที่จะไพพ์เอาท์พุท dmesg เพื่อตรวจสอบข้อผิดพลาดในการบู๊ต แต่สีใช้งานไม่ได้นอกจากว่าฉันใช้ unbuffer ซึ่งทำให้ฉันสับสน: unbuffer dmesg | less -Rทำตามที่คาดไว้
pbhj

15

pygmentizeรองรับ-gตัวเลือกในการเดา lexer ที่จะใช้โดยอัตโนมัติซึ่งมีประโยชน์สำหรับไฟล์ที่อ่านจากSTDINโดยไม่ตรวจสอบประเภทส่วนขยายใด ๆ

คุณจะต้องตั้งค่าการส่งออก 2 รายการต่อไปนี้.bashrcโดยไม่ต้องมีสคริปต์เพิ่มเติม:

export LESS='-R'
export LESSOPEN='|pygmentize -g %s'

4
กระชับและมีประสิทธิภาพ ฉันชอบกำหนดนามแฝงเพราะบางครั้งก็น้อยดีกว่า ดังนั้น: alias lesc = 'LESS = "- R" LESSOPEN = "| pyrideize -g% s" less'
Tiago

9

คุณไม่ได้บอกว่าสีนี้ควรมีความหมายเช่นสีอะไรควรเป็นไฟล์ข้อความ?

หากสิ่งที่คุณต้องการคือการเน้นไวยากรณ์สำหรับซอร์สโค้ดคุณต้องใช้เครื่องมือเน้นข้อความของซอร์สโค้ด บางครั้งฉันก็ใช้การกลั่นแบบนี้

pygmentize file.cpp | less

หรือ

pygmentize file.cpp | more

มีปากกาเน้นข้อความอื่น ๆ อยู่รอบ ๆ

อันนี้ค่อนข้างเร็ว หากคุณไม่ทราบยิงขึ้นมีโหมดอ่านอย่างเดียวที่สามารถให้คุณเน้นไวยากรณ์ถ้าคุณมีมันอยู่ในvimvim

view file.cpp

หรืออีกวิธีหนึ่งดูคำตอบของ churnd


5

นี่เป็นอีกคำตอบที่ใช้pygmentsพร้อมการปรับปรุงที่สำคัญหลายประการ:

  • ไม่ทำลายlesspipeหรือlessfileกรอง
  • ทำงานร่วมกับหลายอินพุต less
  • แยกประเภทสคริปต์อย่างถูกต้องจากส่วนหัว shebang
  • ทำงานได้กับไฟล์ 434 ประเภททุกประเภท lexable โดย Pygments
  • ชุดรูปแบบสีถูกแปรสภาพเป็นตัวแปรสภาพแวดล้อม

ติดตั้ง Pygments และ Gawk

sudo apt-get install python-pygments python3-pygments gawk

ตั้งค่าตัวแปรสภาพแวดล้อม

ตรวจสอบว่าได้เปิดใช้งานlesspipeหรือไม่lessfile:

echo $LESSOPEN

หากคุณไม่เห็นโปรแกรมใดอ้างอิงไว้ที่นั่นให้แน่ใจว่าlesspipeติดตั้งแล้ว (distros ส่วนใหญ่จะมาพร้อมกับมัน)

เพิ่มรายการต่อไปนี้ใน~/.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

ข้อเสียเปรียบอย่างหนึ่งเกี่ยวกับวิธีนี้คือ Pygments เป็นโปรแกรม Python และการใช้งานครั้งแรกในระหว่างเซสชันเชลล์จะมีการหน่วงเวลา "การเริ่มเย็น" การเรียกใช้ครั้งต่อไปนั้นเร็วกว่ามาก
โจ Coder

ดี! ครอบคลุมจริงๆ
Dario Seidl

4

ใช้GNU มาไฮไลท์ ; คุณสามารถติดตั้งได้aptหากคุณมีหรือติดตั้งจากแหล่งอื่น จากนั้นตั้งค่า "ตัวประมวลผลอินพุตล่วงหน้า" ให้น้อยลงด้วยความช่วยเหลือจากเอกสารประกอบของ Source-highligh สำหรับการตั้งค่าโดยใช้น้อย :

สิ่งนี้ถูกแนะนำโดย Konstantine Serebriany สคริปต์ src-hilite-lesspipe.sh จะถูกติดตั้งพร้อมกับแหล่งข้อมูลที่เน้น คุณสามารถใช้ตัวแปรสภาพแวดล้อมต่อไปนี้:

 export LESSOPEN="| /path/to/src-hilite-lesspipe.sh %s"
 export LESS=' -R '

วิธีนี้เมื่อคุณใช้น้อยกว่าในการเรียกดูไฟล์ถ้ามันเป็นไฟล์ที่มาจัดการโดยเน้นที่มาก็จะถูกเน้นโดยอัตโนมัติ

Xavier-Emmanuel Vincent เมื่อเร็ว ๆ นี้ได้จัดทำโครงร่างสี ANSI รุ่นทางเลือกรุ่น esc256.style: เทอร์มินัลบางรุ่นสามารถรองรับ 256 สี ซาเวียร์จัดทำสคริปต์ซึ่งตรวจสอบว่าเทอร์มินัลของคุณสามารถจัดการกับสีได้กี่สีและในกรณีนี้ใช้ตัวแปร 256 ชุด สคริปต์นี้เรียกว่า source-highlight-esc.sh และจะถูกติดตั้งพร้อมกับไบนารีอื่น ๆ


3

หากต้องการขยายคำตอบอื่น ๆ คุณสามารถทำให้มันใช้งานได้มากที่สุดหากไม่ใช่สคริปต์ทั้งหมดที่ไม่มีส่วนขยายโดยการเปลี่ยนไฟล์ .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'

และคุณจะต้องทำให้ไฟล์. unfilter สามารถทำงานได้:

$ chmod 700 ~/.lessfilter

นอกจากนี้ฉันต้องการเพิ่มว่าภายใต้ debian แพ็คเกจ pygments เรียกว่า python-pygments ฉันมีปัญหาในการหาตำแหน่งในตอนแรกเพราะการสะกดผิดที่ชัดเจนของ "พิกเมนต์" ในฐานะ "pygments" ไม่เพียงพอสำหรับฉันว่ามันเป็นแพคเกจที่อาจจะนำหน้าด้วย "python-" โดยผู้จัดการแพคเกจ


2
2 ความเห็น: 1) ขอบคุณสำหรับการปรับปรุง 2) วลีเช่น "โหวตคำตอบที่ดีที่สุด" ไม่ค่อยดีนัก ที่อาจเปลี่ยนแปลง (ในความเป็นจริงถ้านี่ดีกว่าคำตอบที่โพสต์นี้อาจกลายเป็นคำตอบด้านบนที่จุดมันจะสับสนอาจแค่พูดว่า "เพื่อขยายคำตอบอื่น" หรือ "คำตอบของ Captaincomic"
cpast

2

คุณสามารถพิจารณาการใช้mostยูทิลิตี้ซึ่งเป็นทางเลือกสีที่เหมาะสำหรับการและlessmore


คุณสามารถแสดงตัวอย่างหนึ่งให้เราดูได้ไหม ฉันลองที่นี่และผลลัพธ์เป็นขาวดำ
danilo

ข้อมูลที่คุณป้อนควรมีสี ครั้งแรกที่ผลิตตัวอย่าง colorised (เช่นccze -A </var/log/dpkg.log, ls -1 --color /var/log) แล้วท่อมัน:most ls -1 --color /var/log | most
เฉพาะ

ใช่ฉันใช้: git status | less --color,git status | most --color
danilo

ฉันใช้เครื่องมือส่วนใหญ่มากขึ้นน้อยลงและเครื่องมือทั้งหมดแสดงภาพขาวดำ
danilo

ตรวจสอบให้แน่ใจว่าคำสั่งของคุณสร้างสีก่อนทำการไพพ์ไปยังlessหรืออื่น ๆ ตรวจสอบให้แน่ใจว่าเทอร์มินัลอีมูเลเตอร์ของคุณสามารถส่งออกสีได้ ตรวจสอบTERMตัวแปรสภาพแวดล้อม อ่านเพิ่มเติมในunix.stackexchange.com/questions/148/...เมื่อใช้เป็นไปได้ที่ทันสมัยกระจาย GNU + เช่น Linux Debian ใช้เครื่องมือค้นหา (เช่นduckduckgo.com startpage.com ) เพื่อค้นหาคำตอบ โปรดจำไว้ว่าความคิดเห็นไม่ได้มีไว้สำหรับการสนทนา
เฉพาะ

2

ย่อจากโพสต์บล็อกแบบเต็มของฉันเกี่ยวกับการปรับปรุงประสบการณ์ที่น้อยลง: https://www.topbug.net/blog/2016/09/27/make-gnu-less-more-more-powerful/

สำหรับ manpages ที่มีสีสันให้เพิ่มสิ่งต่อไปนี้ในของคุณ.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


1

ฉันพบวิธีแก้ปัญหาที่สง่างามแบบนี้ คุณไม่ต้องติดตั้งอะไรเพิ่มเติมเพราะมันมีอยู่แล้วตามค่าเริ่มต้นในเครื่องส่วนใหญ่ ตามที่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

ฉันได้รับข้อมูลส่วนใหญ่ที่นี่


1
ฉันมีalias lesser='/usr/share/vim/vim80/macros/less.sh'ใน~/bash_aliases(ใน Ubuntu 18.04) สามารถใช้ทางลัดเช่น f ไปข้างหน้า, b ย้อนหลัง, d ครึ่งลง, ครึ่งหนึ่งของคุณ, q เลิก, ฯลฯ ...
Daniel

0

วิธีที่ง่ายและตรงไปตรงมาที่สุดสำหรับฉันคือการใช้pygmentize
โดยเพิ่มบรรทัดด้านล่างเพื่อ. bashrc

export LESS='-R'
export LESSOPEN='|pygmentize -g %s'

ในกรณีที่คุณไม่สามารถโทรได้pygmentizeเพียงติดตั้งเช่น

pip install pygments

PS pygmentizeไบนารีปฏิบัติการจะนั่งอยู่ใน/usr/local/bin/หรือของคุณ/home/username/.virtualenv/venvname/bin/หรือที่อื่น


-2

สิ่งเหล่านี้ไม่ได้ผลสำหรับฉันและฉันคิดวิธีง่ายๆในการทำงานนี้ดังนั้นฉันคิดว่าฉันจะแบ่งปัน

เพียงใช้ tmux ที่ช่วยให้คุณเข้าถึงและเลื่อนดูประวัติที่ใหญ่ขึ้นและรักษาสีได้อย่างสมบูรณ์แบบ


1
tmux ไม่อนุญาตให้มีเทอร์มินัลหลายตัวจากหน้าจอเดียวมันเปลี่ยนสีที่แสดงน้อยกว่าได้อย่างไร?
Xen2050

@ Xen2050 ฉันคิดว่ามันเป็นวิธีแก้ปัญหาที่เรียบร้อยแม้ว่าคำตอบนี้จะไม่อธิบายวิธีเข้าสู่โหมดเลื่อน (Ctrl-b + [)
siikamiika

-2

ตราบเท่าที่ข้อความที่ส่งออกมีตัวควบคุมสีless -Rจะทำ


นี่คือสิ่งที่คำตอบอื่น (จาก 9 ปีที่แล้ว) กล่าวว่า คำตอบที่ซ้ำคำตอบอื่น ๆ จะไม่มีประโยชน์
Kamil Maciorowski

ยุติธรรม แต่คำตอบนั้นไม่ชัดเจนว่าใช้ได้กับไฟล์ที่สร้างด้วยอักขระควบคุมสีเท่านั้น
Leonardo Raele
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.