今天开始新建了一个叫 commandlinefu 的子目录(或者叫分类), 专门分享命令行相关的东西。

5秒钟版本

这次要跟大家分享的是一个叫bathttps://github.com/sharkdp/bat的命令工具。

这个工具主要采用 Rust编写, 它可以说是Linux里cat的克隆和增强版。

安装方法 https://github.com/sharkdp/bat#installation

#Fedora
sudo dnf install bat

# Windows
# Windows没有 choco的可以直接去 https://github.com/sharkdp/bat/releases 下载 bat-*-x86_64-pc-windows-msvc.zip
choco install bat

# Mac
brew install bat

如果你不想看文章内容,只看这里就是,添加以下配置到.zshrc(或.bashrc):

#bat https://github.com/sharkdp/bat
export BAT_STYLE=plain
export BAT_THEME="TwoDark"
export MANPAGER="sh -c 'col -bx | bat -l man -p'"
export MANROFFOPT="-c"

好了,到此,本文的5秒钟版本就已经结束了。

关于名称

bat(中文可以译为“蝙蝠”),因为它功能跟cat类似,但是在cat的基本上有增强功能,所以就取名bat吧(b在c前面), 而cat可以翻译成猫的意思。 作者原文是“A cat(1) clone with wings. ”, 即带翅膀的克隆猫。 需要注意的是,cat的本意取不是取自猫,而是单词concatenate的缩写,而concatenate一般是“连接”的意思。

比如很多年前电脑书上流传的隐藏zip文件到图片里面, 这算是一种文件连接的操作:

cat mypic.jpg files.zip > amazing.jpg

主要亮点

1. 语法高亮

作为程序员,大部分时候其实cat的文件都源码和配置文件, 这个时候bat用处可大了。 其高亮功能主要是使用了 syntect这个crate, 值得庆幸的是,syntect并没有自己发明轮子, 而是复用了 Sublime Text的语法高亮定义. 好处显而易见, 可以兼容现有的ST高亮主题,或者稍做转换就可以拿来用。

如果你想查看下bat支持哪些主题,也很简单,直接执行bat --list-themes 即可,自带高亮效果显示,如下图: bat-list-themes-cmd-2020-05-14-23-48-52.png

一些配色展示:

bat-syntax-hi-3-2020-05-14-23-45-37.png

在它支持的配色里面(没有老灯最喜欢的Gruvbox),老灯比较喜欢TwoDark这个配色. 比较方便的是,bat支持使用环境变量来配置一些东西,比如老灯在~/.zshrc中是这样配置的:

export BAT_STYLE=plain
export BAT_THEME="TwoDark"

使用 plain 主要是避免bat在每列前面输出tab,因为默认是这样的:

bat-default-style-2020-05-15-00-12-53.png

老灯比较喜欢plain,简洁一些: bat-style-plain-2020-05-15-00-13-23.png

用bat高亮显示curl下载的shell脚本内容:

curl -fsSL https://deno.land/x/install/install.sh | bat

2. Git集成

如果你需要查看git修改内容,则 BAT_STYLE 配置至少要包含 changes:

bat-style-changes-2020-05-15-00-15-38.png

3. 显示非打印字符

bat-show-non-printable-2020-05-15-00-18-35.png

4. 自动paging

这个分页我觉得还是不翻译好,所以就用了paging 如果是cat, 它会直接输出文件的所有输出,这个对于脚本来说无疑是必要的功能。 但是如果是人在终端查看一些东西呢?我们其实一次只能看一屏。所以,bat它会自动分页。 当计算到内容大于一屏时,它就会通过管道调用less来显示了.

如果要自定义pager, 可以这样:

export BAT_PAGER="less -RFX"

5. 跟其它工具集成

当然,bat 也能像 cat 一样连接文件。

Oh.. you can also use it to concatenate files wink. Whenever bat detects a non-interactive terminal (i.e. when you pipe into another process or into a file), bat will act as a drop-in replacement for cat and fall back to printing the plain file contents.

这里要说一下, 官方说可以用作Git的diff工具,这里老灯倾向于推荐 diffr而不是使用这个cat的替代品。 毕竟术业有专攻。

man

bat可以作为man的pager,然后将man高亮显示:

export MANPAGER="sh -c 'col -bx | bat -l man -p'"
export MANROFFOPT="-c"

为什么要设置了MANROFFOPT="-c"?如果遇到显示问题,比如像这样配色显示有问题,且多出了很多1m0m之类的乱码:

bat-as-man-pager-problem-2020-05-15-01-02-21.png

加上MANROFFOPT="-c"就没问题了:

bat-as-man-pager-2020-05-15-01-00-39.png

这个man有了bat之后,真是炫。

其它的集成,老灯表示用处不是很大,感兴趣的可以自行去官网查看https://github.com/sharkdp/bat#integration-with-other-tools