سؤال احصل على ألوان أقل أو أكثر


عندما قرأت ملفًا في Linux باستخدام الأمر less أو more، كيف يمكنني الحصول على المحتوى بالألوان؟


356
2018-03-09 10:44


الأصل


يبدو هذا مرتبطًا: superuser.com/questions/36022/less-and-grep-color - هل يساعد؟ - Jonik


الأجوبة:


يمكنك الاستفادة من قوة pygmentize مع أقل - تلقائيا! (لا حاجة إلى الأنابيب باليد.)

التثبت pygments مع مدير الحزم الخاص بك أو نقطة (ربما دعا 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"
        ;;
    *)
        grep "#\!/bin/bash" "$1" > /dev/null
        if [ "$?" -eq "0" ]; 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

تم اختباره على دبيان.

جاءت الفكرة من وظيفة مدونة قديمة من صناع Pygments، لكن المشاركة الأصلية لم تعد موجودة.


133
2017-09-20 03:29



إذا كنت ترغب في تلوين ملفات التعليمات البرمجية المصدر ، فستحتاج أيضًا إلى تنفيذ ~ / .lessfilter قابل للتنفيذ عن طريق التشغيل chmod u+x ~/.lessfilter. أنت أيضا بحاجة إلى pygmentize (pygments.org/download) المثبتة. - Sergiy Byelozyorov
هل يمكن لأحد أن يؤكد أن هذا يعمل لأنه ليس له أي تأثير بالنسبة لي عند تنفيذ أمر مثل ls -l | less - puk
أي فكرة عن كيفية سلسلة هذا مع فلاديمير Linek lessopen.sh؟ يتم الإعداد باستخدام هذا النموذج: LESSOPEN = "lessopen.sh٪ s" - Gregory
puk يمكنك القيام بشيء مثل ls --color=always -l | less -R. من الواضح أن الكثير للكتابة ولكن يمكنك اسم مستعار إلى شيء من هذا القبيل ll. هذا إذا كنت لا ترغب في استخدام أي مكتبات إضافية. - PhilT
وأضاف تعليق @ SergiyByelozyorov في الجواب. - andrybak


حاول القيام بما يلي:

less -R

من عند man less:

-r أو --raw-control-chars

يؤدي إلى عرض أحرف التحكم "raw". (...)

-R أو --RAW-CONTROL-CHARS

مثل -rولكن يتم إخراج تسلسلات الهروب ANSI "لون" فقط في النموذج "raw". (...)


422
2018-03-09 10:48



يكون هذا مفيدًا عندما يحتوي الملف نفسه على رموز الهروب التي ستحتاج إلى عرضها. - Nitrodist
اعتدت على معرفة أقل - ولكن البحث في الملف باستخدام "/" أبقى ترقيبا للخطوط الخطأ. -R يبدو للقيام بعمل أفضل. شكرا على الاكرامية. - Amos Shapira
تجدر الإشارة إلى أن معظم البرامج تستخدم isatty(2) syscall للتحقق ما إذا كان الإخراج القياسي الخاص بهم هو محطة طرفية ، وعادةً ما يتم تعطيل الإخراج الملون إذا لم يكن كذلك. لأي أنبوب إلى أقل ، isatty سيعود 0. للتحقق ما إذا كان هذا يعمل ، حاول echo -e '\x1b[32;1mtest\x1b[m' | less -r - mic_e
هذه الإجابة لا تتفوق في الواقع يفعل اختبار شيء. - Michael Wolf
يمكنك أيضا اكتب -R عندما فتحت بالفعل less لتحقيق هذا. - Scz


حصلت على الجواب في وظيفة أخرى: أقل و Grep: الحصول على نتائج ملونة عند استخدام أنبوب من grep إلى أقل

عندما تركض ببساطة grep --color هذا   يدل grep --color=auto التي   يكشف ما إذا كان الناتج هو   محطة وإذا كان الأمر كذلك تمكن الألوان.   ومع ذلك ، عندما يكشف عن الأنابيب   يعطل التلوين. ما يلي   أمر:

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

سوف تمكن دائما التلوين و   تجاوز الكشف التلقائي ، و   سوف تحصل على لون الضوء في   أقل.

تحذير: لا تضع --color=always كاسم مستعار ، فإنه يكسر الأشياء في بعض الأحيان. هذا هو السبب في وجود --color=auto اختيار.


118
2018-04-27 04:19



جميل شكرا. إلا أنني بحاجة إلى استخدامها -R كخيار ل less، كذلك. - naught101
أعتقد 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
هل هناك على أي حال لترك grep نعرف فقط أقل الأنابيب -R الأمر وبعد ذلك لا تفعل التلوين؟ لذا ، ليس علينا أن نضع -color = دائماً وأقل -R طوال الوقت. - A-letubby
هذا هو أبسط إجابة العمل. شكر! - Danny Staple


استعمال view بدلا من less. يفتح الملف مع vim في وضع readonly.

انها عمليا ملونة less: نداء حيث يمكنك البحث معه / (و اكثر). العيب الوحيد هو أنه لا يمكنك الخروج معها ف لكنك تحتاج :q

أيضا ، يمكنك الحصول على نفس التلوين vim (لأنك في الواقع تستخدم vim).


29
2017-09-24 09:50



ماذا عن أداء الملفات الكبيرة؟ من الواضح أن تمييز Vim syntax يتباطأ في الملفات الضخمة. - pihentagy
لا أعرف ما هي قيمة "كبيرة" ، ولكن فتح ملف خطوط 10000 ~ فوري ، البحث داخل المضمنة. - Riccardo Galli
I upvoted (لم أكن أعلم view) ولكن الجانب السلبي الآخر هو أن j / k / up / down لا يتم التمرير على الفور ، حيث يوجد مؤشر. - Tyler Collier
لاحظ أنك قد تحتاج إلى إضافة view - عندما الأنابيب - user45909
vim هو محرر يحمّل الملف كاملاً إلى الذاكرة ، في حين أن less هو النداء ، وتحميل الملف جزئيا فقط في الذاكرة. سوف تعرف الفرق مع الملفات الضخمة. - sjas


pygmentize يدعم -g الخيار لتخمين lexer ليتم استخدامه تلقائياً وهو مفيد للملفات التي تمت قراءتها من STDIN دون التحقق من أي نوع التمديد.

باستخدام ذلك ، تحتاج فقط إلى تعيين الصادرات 2 التالية في الخاص بك .bashrc بدون أي نصوص إضافية:

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

12
2018-03-12 07:17



موجز وفعال. أنا أفضل تحديد اسم مستعار ، لأن أقل في بعض الأحيان هو أفضل. لذلك: alias lesc = 'LESS = "- R" LESSOPEN = "| pygmentize -g٪ s" less " - Tiago


لم تقل ما يجب أن يعنيه هذا اللون ، على سبيل المثال ، ماذا يجب أن تكون الألوان لملف نصي؟

إذا كان ما تريده هو تمييز بناء الجملة للحصول على التعليمات البرمجية المصدر ، فأنت تحتاج إلى تمييز رمز مصدر. أنا أستخدم في بعض الأحيان pygmentize مثله

pygmentize file.cpp | less

أو

pygmentize file.cpp | more

هناك غيرها من المعالم حولها.

هذا سريع جدا. إذا كنت لا تمانع في إطلاق النار vim هناك وضع للقراءة فقط يمكن أن يمنحك إلقاء الضوء على الجملة إذا كان لديك vim.

view file.cpp

أو بدلا من ذلك انظر إجابة churnd.


9
2018-03-09 13:30





لإخبار أقل لإظهار الألوان ، يمكنك الاتصال بـ -R:

less -R

لسوء الحظ ، تكتشف بعض البرامج أن stdout ليست محطة طرفية وتعطّل الألوان - على سبيل المثال pacman (مدير حزمة Linux).

في هذه الحالات من الممكن استخدامها unbuffer:

unbuffer <command> | less -R

مثال باستخدام pacman

unbuffer pacman -Ss firefox | less -R

ال unbuffer الأمر هو عادة جزء من expect-dev (دبيان / أوبونتو) أو expectحزمة (Arch Linux).

للإجابة على السؤال عن الاكتمال:

كما اجاب آخرون بالفعل ، pygmentize رائع لتلوين شفرة المصدر. لا يتطلب unbuffer. أسهل اتصال:

pygmentize someSource.cpp | less -R

8
2017-10-08 10:37





استخدم ال غنو مصدر الضوء. يمكنك تثبيته مع apt إذا كان لديك ، أو تثبيته من المصدر. ثم إعداد "preprocessor مدخلات" للحصول على أقل ، مع تعليمات من "Source-highligh 'وثائق لـ الإعداد مع أقل:

هذا ما اقترحه قسطنطين سيريبرياني. سيتم تثبيت البرنامج النصي src-hilite-lesspipe.sh مع مصدر الضوء. يمكنك استخدام متغيرات البيئة التالية:

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

بهذه الطريقة ، عندما تستخدم أقل لتصفح ملف ، إذا كان ملفًا مصدرًا يتم التعامل معه من خلال تمييز المصدر ، فسيتم تمييزه تلقائيًا.

قدم Xavier-Emmanuel Vincent مؤخرًا نسخة بديلة من نظام ألوان ANSI ، esc256.style: يمكن لبعض المطاريف التعامل مع 256 لونًا. قدم Xavier أيضًا نصًا يتحقق من عدد الألوان التي يمكن لجهازك التعامل معها ، وفي الحالة ، يستخدم المتغير 256. يسمى البرنامج النصي source-highlight-esc.sh وسيتم تثبيته مع الثنائيات الأخرى.


3
2018-05-25 19:52





للتوسع في إجابة أخرى ، يمكنك جعلها تعمل مع معظم النصوص البرمجية التي لا تحتوي على ملحقات ، إن لم يكن كلها ، عن طريق تغيير ملف .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'

وستظل بحاجة إلى تنفيذ .lessfilter القابل للتنفيذ:

$ chmod 700 ~/.lessfilter

كما أردت إضافة أنه في إطار debian ، تُسمى حزمة pygments pygments. لقد واجهت صعوبة في تحديد موقعه في البداية لأن الخطأ الإملائي الواضح في "الصبغات" ك "pygments" لم يكن كافيًا بالنسبة لي أنه كان عبارة عن حزمة قد تكون مسبوقة بـ "python-" بواسطة مدير الحزم.


3
2018-02-27 22:45



2 تعليق: 1) شكرا للتحسين. 2) عبارات مثل "أفضل إجابة صوت" ليست كبيرة ؛ قد تتغير (في الواقع ، إذا كان هذا أفضل من هذا الجواب ، هذه قد يصبح الرد الأعلى ، وعند هذه النقطة سيكون الأمر محيرًا. ربما تقول فقط "للتوسع في إجابة أخرى" أو "إجابة القبطان"؟ - cpast


هذا هو آخر pygmentsالإجابة ، مع العديد من التحسينات الرئيسية:

  • لا يكسر lesspipe أو lessfile مرشحات
  • يعمل مع مدخلات متعددة ل less
  • بشكل صحيح يوزع نوع البرنامج النصي من رأس shebang
  • يعمل لجميع أنواع الملفات 434 lexable بواسطة Pygments
  • نظام الألوان هو معلمات كمتغير بيئة

تثبيت Pygments و Gawk

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

ضبط متغيرات البيئة

تحقق ما إذا كان lesspipe أو lessfile تم تمكينه بالفعل:

echo $LESSOPEN

إذا لم تشاهد أي من البرنامجين المشار إليهما هناك ، فتأكد من ذلك lesspipe مثبت (معظم التوزيعات تأتي معها).

أضف ما يلي ~/.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

3
2018-05-29 09:21



العيب الوحيد حول هذا النهج هو أن Pygments هو برنامج Python ، وهكذا عند الاستخدام الأول خلال جلسة shell ، هناك تأخير "البدء البارد". الدعوات اللاحقة هي أسرع بكثير. - Joe Coder