on 01984e1 help sign in
bat/README.md
410 lines 13 kB history raw
1<p align="center">
2 <img src="doc/logo-header.svg" alt="bat - a cat clone with wings"><br>
3 <a href="https://travis-ci.org/sharkdp/bat"><img src="https://travis-ci.org/sharkdp/bat.svg?branch=master" alt="Build Status"></a>
4 <a href="https://ci.appveyor.com/project/sharkdp/bat"><img src="https://ci.appveyor.com/api/projects/status/cptsmtbiwbnr2vhf?svg=true"></a>
5 <img src="https://img.shields.io/crates/l/bat.svg" alt="license">
6 <a href="https://crates.io/crates/bat"><img src="https://img.shields.io/crates/v/bat.svg?colorB=319e8c" alt="Version info"></a><br>
7 A <i>cat(1)</i> clone with syntax highlighting and Git integration.
8</p>
10<p align="center">
11 <a href="#syntax-highlighting">Key Features</a> •
12 <a href="#how-to-use">How To Use</a> •
13 <a href="#installation">Installation</a> •
14 <a href="#customization">Customization</a> •
15 <a href="#project-goals-and-alternatives">Project goals, alternatives</a>
16</p>
18### Syntax highlighting
20`bat` supports syntax highlighting for a large number of programming and markup
21languages:
23![Syntax highlighting example](https://imgur.com/rGsdnDe.png)
25### Git integration
27`bat` communicates with `git` to show modifications with respect to the index
28(see left side bar):
30![Git integration example](https://i.imgur.com/2lSW4RE.png)
32### Automatic paging
34`bat` can pipe its own output to `less` if the output is too large for one screen.
36### File concatenation
38Oh.. you can also use it to concatenate files :wink:. Whenever
39`bat` detects a non-interactive terminal, it will fall back to printing
40the plain file contents.
42## How to use
44Display a single file on the terminal
46```bash
47> bat README.md
48```
50Display multiple files at once
52```bash
53> bat src/*.rs
54```
56Read from stdin, determine the syntax automatically
58```bash
59> curl -s https://sh.rustup.rs | bat
60```
62Read from stdin, specify the language explicitly
64```bash
65> yaml2json .travis.yml | json_pp | bat -l json
66```
69As a replacement for `cat`:
71```bash
72bat > note.md # quickly create a new file
74bat header.md content.md footer.md > document.md
76bat -n main.rs # show line numbers (only)
78bat f - g # output 'f', then stdin, then 'g'.
79```
81## Installation
83### On Ubuntu
84*... and other Debian-based Linux distributions.*
86Download the latest `.deb` package from the [release page](https://github.com/sharkdp/bat/releases)
87and install it via:
88``` bash
89sudo dpkg -i bat_0.8.0_amd64.deb # adapt version number and architecture
90```
92### On Arch Linux
94You can install [the `bat` package](https://www.archlinux.org/packages/community/x86_64/bat/)
95from the official sources:
97```bash
98pacman -S bat
99```
101### On Void Linux
103You can install `bat` via xbps-install:
104```
105xbps-install -S bat
106```
108### On FreeBSD
110You can install a precompiled [`bat` package](https://www.freshports.org/textproc/bat) with pkg:
112```bash
113pkg install bat
114```
116or build it on your own from the FreeBSD ports:
118```bash
119cd /usr/ports/textproc/bat
120make install
121```
123### Via nix
125You can install `bat` using the [nix package manager](https://nixos.org/nix):
127```bash
128nix-env -i bat
129```
131### On macOS
133You can install `bat` with [Homebrew](http://braumeister.org/formula/bat):
135```bash
136brew install bat
137```
139### On Windows
141You can download prebuilt binaries from the [Release page](https://github.com/sharkdp/bat/releases),
142or install it with [scoop](https://scoop.sh/):
144```bash
145scoop install bat
146```
148[See below](#using-bat-on-windows) for notes.
150### Via Docker
152There is a [Docker image](https://hub.docker.com/r/danlynn/bat/) that you can use to run `bat` in a container:
153```bash
154docker pull danlynn/bat
155alias bat='docker run -it --rm -e BAT_THEME -e BAT_STYLE -e BAT_TABS -v "$(pwd):/myapp" danlynn/bat'
156```
158### Via Ansible
160You can install `bat` with [Ansible](https://www.ansible.com/):
162```bash
163# Install role on local machine
164ansible-galaxy install aeimer.install_bat
165```
167```yaml
168---
169# Playbook to install bat
170- host: all
171 roles:
172 - aeimer.install_bat
173```
175- [Ansible Galaxy](https://galaxy.ansible.com/aeimer/install_bat)
176- [GitHub](https://github.com/aeimer/ansible-install-bat)
178This should work with the following distributions:
179- Debian/Ubuntu
180- ARM (eg. Raspberry PI)
181- Arch Linux
182- Void Linux
183- FreeBSD
184- MacOS
186### From binaries
188Check out the [Release page](https://github.com/sharkdp/bat/releases) for
189prebuilt versions of `bat` for many different architectures. Statically-linked
190binaries are available, just look for releases with `musl` in the name on the
191releases page.
193### From source
195If you want to build `bat` from source, you need Rust 1.29 or
196higher. You can then use `cargo` to build everything:
198```bash
199cargo install bat
200```
202You may have to install `cmake` and the `libz` development package
203(`libz-dev` or `libz-devel`) in order for the build to succeed.
205## Customization
207### Highlighting theme
209Use `bat --list-themes` to get a list of all available themes for syntax
210highlighting. To select the `TwoDark` theme, call `bat` with the
211`--theme=TwoDark` option or set the `BAT_THEME` environment variable to
212`TwoDark`. Use `export BAT_THEME="TwoDark"` in your shell's startup file to
213make the change permanent.
215If you want to preview the different themes on a custom file, you can use
216the following command (you need [`fzf`](https://github.com/junegunn/fzf) for this):
217``` bash
218bat --list-themes | fzf --preview="bat --theme={} --color=always /path/to/file"
219```
221`bat` looks good on a dark background by default. However, if your terminal uses a
222light background, some themes will work better for you. For example, the `GitHub`
223theme is made for light backgrounds. You can also make your own theme by following the
224['Adding new themes' section below](https://github.com/sharkdp/bat#adding-new-themes).
226### Output style
228You can use the `--style` option to control the appearance of `bat`s output.
229You can use `--style=numbers,changes`, for example, to show only Git changes
230and line numbers but no grid and no file header. Use the `BAT_STYLE` environment
231variable to make these changes permanent.
233### Adding new syntaxes / language definitions
235`bat` uses the excellent [`syntect`](https://github.com/trishume/syntect/)
236library for syntax highlighting. `syntect` can read any
237[Sublime Text `.sublime-syntax` file](https://www.sublimetext.com/docs/3/syntax.html)
238and theme. To add new syntax definitions, do the following.
240Create a folder with syntax definition files:
242```bash
243BAT_CONFIG_DIR="$(bat cache --config-dir)"
245mkdir -p "$BAT_CONFIG_DIR/syntaxes"
246cd "$BAT_CONFIG_DIR/syntaxes"
248# Put new '.sublime-syntax' language definition files
249# in this folder (or its subdirectories), for example:
250git clone https://github.com/tellnobody1/sublime-purescript-syntax
251```
253Now use the following command to parse these files into a binary cache:
255```bash
256bat cache --init
257```
259Finally, use `bat --list-languages` to check if the new languages are available.
261If you ever want to go back to the default settings, call:
263```bash
264bat cache --clear
265```
267### Adding new themes
269This works very similar to how we add new syntax definitions.
271First, create a folder with the new syntax highlighting themes:
272```bash
273BAT_CONFIG_DIR="$(bat cache --config-dir)"
275mkdir -p "$BAT_CONFIG_DIR/themes"
276cd "$BAT_CONFIG_DIR/themes"
278# Download a theme in '.tmTheme' format, for example:
279git clone https://github.com/greggb/sublime-snazzy
281# Update the binary cache
282bat cache --init
283```
285Finally, use `bat --list-themes` to check if the new themes are available.
287### Using a different pager
289`bat` uses the pager that is specified in the `PAGER` environment variable. If this variable is not
290set, `less` is used by default. If you want to use a different pager, you can either modify the
291`PAGER` variable or set the `BAT_PAGER` environment variable to override what is specified in
292`PAGER`.
294If you want to pass command-line arguments to the pager, you need to create a small shell
295script as a wrapper, for example
297```bash
298#!/bin/bash
300less --tabs 4 -R "$@"
301```
302(put this in a file `~/.bat-pager.sh`, make it executable `chmod +x ~/.bat-pager.sh` and use
303`export BAT_PAGER="$HOME/.bat-pager.sh"` in your shells `rc` file)
305**Note**: By default, if the pager is set to `less`, `bat` will pass the following command line
306options to the pager: `-R`/`--RAW-CONTROL-CHARS`, `-F`/`--quit-if-one-screen` and `-X`/`--no-init`.
307The first (`-R`) is needed to interpret ANSI colors correctly. The second option (`-F`) instructs
308less to exit immediately if the output size is smaller than the vertical size of the terminal.
309This is convenient for small files because you do not have to press `q` to quit the pager. The
310third option (`-X`) is needed to fix a bug with the `--quit-if-one-screen` feature in old versions
311of `less`. Unfortunately, it also breaks mouse-wheel support in `less`. If you want to enable
312mouse-wheel scrolling, you can either pass just `-R` (as in the example above, this will disable
313the quit-if-one-screen feature), or you can use a recent version of `less` and pass `-RF` which
314will hopefully enable both quit-if-one-screen and mouse-wheel scrolling.
316If scrolling still doesn't work for you, you can try to pass the `-S` option in addition.
318## Using `bat` on Windows
320`bat` mostly works out-of-the-box on Windows, but a few features may need extra configuration.
322### Paging
324Windows only includes a very limited pager in the form of `more`. You can download a Windows binary
325for `less` [from its homepage](http://www.greenwoodsoftware.com/less/download.html) or [through
326Chocolatey](https://chocolatey.org/packages/Less). To use it, place the binary in a directory in
327your `PATH` or [define an environment variable](#using-a-different-pager).
329### Colours
331Windows 10 natively supports colours in both `conhost.exe` (Command Prompt) and PowerShell since
332[v1511](https://en.wikipedia.org/wiki/Windows_10_version_history#Version_1511_(November_Update)), as
333well as in newer versions of bash. On earlier versions of Windows, you can use
334[Cmder](http://cmder.net/), which includes [ConEmu](https://conemu.github.io/).
336**Note:** The Git and MSYS versions of `less` do not correctly interpret colours on Windows. If you
337don’t have any other pagers installed, you can disable paging entirely by passing `--paging=never`
338or by setting `BAT_PAGER` to an empty string.
340### Cygwin
342`bat` on Windows does not natively support Cygwin's unix-style paths (`/cygdrive/*`). When passed an absolute cygwin path as an argument, `bat` will encounter the following error: `The system cannot find the path specified. (os error 3)`
344This can be solved by creating a wrapper or adding the following function to your `.bash_profile` file:
346```shell
347bat() {
348 local index
349 local args=("$@")
350 for index in $(seq 0 ${#args[@]}) ; do
351 case "${args[index]}" in
352 -*) continue;;
353 *) [ -e "${args[index]}" ] && args[index]="$(cygpath --windows "${args[index]}")";;
354 esac
355 done
356 command bat "${args[@]}"
358```
360## Troubleshooting
362### Terminals & colors
364`bat` handles terminals *with* and *without* truecolor support. However, the colors in the syntax
365highlighting themes are not optimized for 8-bit colors and it is therefore strongly recommended
366that you use a terminal with 24-bit truecolor support (`terminator`, `konsole`, `iTerm2`, ...).
367See [this article](https://gist.github.com/XVilka/8346728) for more details and a full list of
368terminals with truecolor support.
370Make sure that your truecolor terminal sets the `COLORTERM` variable to either `truecolor` or
371`24bit`. Otherwise, `bat` will not be able to determine whether or not 24-bit escape sequences
372are supported (and fall back to 8-bit colors).
374### Line numbers and grid are hardly visible
376Please try a different theme (see `bat --list-themes` for a list). The `OneHalfDark` and
377`OneHalfLight` themes provide grid and line colors that are brighter.
379## Development
381```bash
382# Recursive clone to retrieve all submodules
383git clone --recursive https://github.com/sharkdp/bat
385# Build (debug version)
386cd bat
387cargo build
389# Run unit tests and integration tests
390cargo test
392# Install (release version)
393cargo install
395# Build a bat binary with modified syntaxes and themes
396bash assets/create.sh
397cargo install -f
398```
400## Project goals and alternatives
402`bat` tries to achieve the following goals:
404- Provide beautiful, advanced syntax highlighting
405- Integrate with Git to show file modifications
406- Be a drop-in replacement for (POSIX) `cat`
407- Offer a user-friendly command-line interface
409There are a lot of alternatives, if you are looking for similar programs. See
410[this document](doc/alternatives.md) for a comparison.