当使用“less”或“more”读取文件时,如何获取彩色内容?

当使用“less”或“more”读取文件时,如何获取彩色内容?

less当我在 Linux 中使用命令或读取文件时more,如何获取彩色的内容?

答案1

如果您只是想less解释颜色代码,请使用less -R参考。


您可以自动利用 pygmentize 的强大功能!(无需手动进行管道操作。)

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(或.zshrc或同等)中添加

export LESS='-R'
export LESSOPEN='|~/.lessfilter %s'

另外,你需要~/.lessfilter通过运行

chmod u+x ~/.lessfilter

编辑:如果你lesspipe的系统上有,你可能想要使用它在使用 less 查看档案时自动解压它们,例如less log.gz。lesspipe 还支持自定义.lessfilter文件,因此上面说的一切都是一样的,你只需要运行

eval "$(lesspipe)" 

在您的 rc 文件中,而不是设置LESSOPEN变量。运行echo "$(lesspipe)"以查看它的作用。您的.lessfilter代码仍将有效。请参阅man lesspipe


在 Debian 上测试。

您明白了。当然,这可以进一步改进,接受更多扩展、多个文件,或者为除 bash 之外的其他解释器解析 shebang。请参阅其他一些答案。

这个想法来自于一篇旧博客文章Pygments 制造商,但原帖子已不存在。


顺便说一句,你也可以使用这种技术来显示目录列表less

答案2

请尝试以下操作:

less -R

man less

-r或者--raw-control-chars

导致显示“原始”控制字符。(...)

-R或者--RAW-CONTROL-CHARS

类似-r,但只有 ANSI“颜色”转义序列以“原始”形式输出。(...)

答案3

我在另一篇文章中找到了答案:Less 和 Grep:使用从 grep 到 less 的管道获取彩色结果

当您简单地运行grep --color它时grep --color=auto,它会检测输出是否是终端,如果是,则启用颜色。但是,当它检测到管道时,它会禁用着色。以下命令:

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

将始终启用着色并覆盖自动检测,您将在更少的时间内获得颜色突出显示。

警告:不要将--color=always其用作别名,否则有时会造成破坏。这就是为什么有一个--color=auto选项。

答案4

要让 less 显示颜色,请使用 -R 调用:

less -R

不幸的是,一些程序检测到它们的标准输出不是终端并禁用颜色 - 例如 pacman(Arch Linux 包管理器)。

在这些情况下可以使用unbuffer

unbuffer <command> | less -R

使用 pacman 的示例

unbuffer pacman -Ss firefox | less -R

unbuffer命令通常是软件包expect(Arch Linux、Debian/Ubuntu)或expect-dev(Debian/Ubuntu 的旧版本)的一部分。

为了完整地回答这个问题:

正如其他人已经回答的那样,pygmentize非常适合为源代码着色。它不需要unbuffer。最简单的调用:

pygmentize someSource.cpp | less -R

相关内容