
bat -- 一只会飞的猫
今天开始新建了一个叫 commandlinefu 的子目录(或者叫分类), 专门分享命令行相关的东西。
5秒钟版本
这次要跟大家分享的是一个叫bat
https://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高亮主题,或者稍做转换就可以拿来用。

一些配色展示:

在它支持的配色里面(没有老灯最喜欢的Gruvbox),老灯比较喜欢TwoDark
这个配色. 比较方便的是,bat支持使用环境变量来配置一些东西,比如老灯在~/.zshrc
中是这样配置的:
export BAT_STYLE=plain
export BAT_THEME="TwoDark"
使用 plain
主要是避免bat在每列前面输出tab,因为默认是这样的:


用bat高亮显示curl下载的shell脚本内容:
curl -fsSL https://deno.land/x/install/install.sh | bat

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

3. 显示非打印字符

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"
?如果遇到显示问题,比如像这样配色显示有问题,且多出了很多1m
, 0m
之类的乱码:

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

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