Skip to content

Instantly share code, notes, and snippets.

@showa-yojyo
Last active March 5, 2026 07:00
Show Gist options
  • Select an option

  • Save showa-yojyo/39b69d831eeb9526fa4c186ef3fd4860 to your computer and use it in GitHub Desktop.

Select an option

Save showa-yojyo/39b69d831eeb9526fa4c186ef3fd4860 to your computer and use it in GitHub Desktop.
My notes on using bat, a modern pager.
author created modified draft tags title
プレハブ小屋 <2386769+showa-yojyo@users.noreply.github.com>
2026-02-10
2026-03-05
true
CLI
bat
batcat
bat 利用ノート

bat 利用ノート

はじめに

このファイルは《構文強調表示と Git 統合を備えた cat (1) のクローン》である bat に関する情報を私なりにまとめたものだ。

この CLI ツールを WSL (Ubuntu) で利用する前提で記す。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 24.04.3 LTS
Release:        24.04
Codename:       noble

評価に用いた bat のバージョン情報は次節に記す。

パッケージ管理

Homebrew が使用可能な環境である場合は apt (8) よりも積極的に採用しろ。理由を二つ挙げる:

  • パッケージの更新ペースが apt (8) よりも良好であることが予期される
  • 名前を batcat ではなく bat で参照可能

インストールコマンドなどを次に示す:

brew install bat

インストール直後はこのようになる:

$ brew list bat
/home/linuxbrew/.linuxbrew/Cellar/bat/0.26.1/.crates.toml
/home/linuxbrew/.linuxbrew/Cellar/bat/0.26.1/.crates2.json
/home/linuxbrew/.linuxbrew/Cellar/bat/0.26.1/bin/bat
/home/linuxbrew/.linuxbrew/Cellar/bat/0.26.1/etc/bash_completion.d/bat
/home/linuxbrew/.linuxbrew/Cellar/bat/0.26.1/sbom.spdx.json
/home/linuxbrew/.linuxbrew/Cellar/bat/0.26.1/share/fish/vendor_completions.d/bat.fish
/home/linuxbrew/.linuxbrew/Cellar/bat/0.26.1/share/man/man1/bat.1
/home/linuxbrew/.linuxbrew/Cellar/bat/0.26.1/share/zsh/site-functions/_bat

基本

bat の主要な機能は cat(1) と同じく、一つまたは複数のファイルの内容を端末画面やファイルに出力する。入力源が複数の場合、その内容を連結して出力するのも同様だ。

オプションなしで bat を走らせるときの既定動作は次のとおり:

  • 構文強調表示
  • ファイル名と行番号を表示
  • Git リポジトリー内容ならば差分記号を表示
  • 内容が多い場合はページャーを起動

言語を特定する方法

入力がファイルから与えられる場合、記述されているプログラミング or マークアップ言語を自身で判定し、構文強調を行う。

入力が標準入力から与えられる場合、一行目に言語を特定できる情報があればそれを採用して構文強調を行う。そうでない場合は、コマンドラインオプションで明示的に指示するのだ。

  • オプション -l/--language で構文を指示可能。
  • オプション -L/--list-languagesbat が取り扱える言語一覧を出力する。この表の二列目の文字列で指定しろ。

標準入力を処理する

  • パイプから入力を受け取る。これが最も普通の標準入力からの読み取り方式だろう。
  • 引数に - を指定することで、標準入力から内容を読み取らせる。
  • オプション --file-name を利用して標準入力を - で指示する。

差分箇所を示す

Git リポジトリー管理対象ファイルを出力すると、行表示柱に差分を記号 +, ~. - を使って示す。

  • オプション -d/--diff で、上記差分記号が生じる行のみを出力する。
  • オプション --diff-context <N> で差分箇所前後 <N> 行を出力に含ませる。

非印字文字を強調する

オプション -A/--show-allcat(1) におけるオプション -v/--show-nonprinting 相当の出力を行える。日本語文字が読めなくなるから利用しないが。

ページ分け

bat は出力が一画面に収まらない場合、その出力を less(1) にパイプするのが既定動作だ。

  • オプション --paging never でページに分けて小出しする動作をオフにする。
  • オプション重ねがけ -pp もページ処理が省かれる。

オプション --paging <when> でページ分けをする条件をある程度制御できる。

  • --paging auto はページ分けの有無を bat に判断を任せる。
  • --paging never / -P でページ分けを常時オフにする。
  • --paging always でページ分けを常時オンにする。

オプション --pager <command> でページ分けを任せるコマンドを指示することが可能だ。

スタイル

オプション --style で部品単位での出力構成を行える。値は部品名をカンマ区切りで指示するか、定義済みスタイル名称を指定する。

定義済みスタイルには次のものがある:

内容
default bat 推奨スタイル
auto 出力がパイプされぬ限りは default と等しい
plain オプション全オフ
full オプション全オン

部品名には次のようなものがある:

内容
header / header-filename ファイル名
header-size ファイル容量
grid 柱と天井を仕切る罫線
numbers 行番号
changes Git 差分記号
snip 行範囲のための区切り線
rule 複数ファイル間の水平罫線

例:行番号は出したいが罫線(やその他も)不要という場合は --style numbers だけを指定する(このための専用短縮名もある)。

なるべく単純に出力する

オプション重ねがけ -pp が最も出力が単純になる。

オプション -p/--plain/--style=plain でファイル名と行表示をオフにする

行範囲指定

オプション -r / --line-range <N:M> で各入力ごとに指定行範囲のみを出力する。

ここで、M は絶対番号でも + 符号付き相対番号でもかまわない。

このオプションは head (1) と tail (1) を組み合わせる必要がある状況でたいへん便利だ。次の二つのコマンドの意味が等しい:

head -n 110 file.txt | tail -n +100
bat -r100:110 file.txt

画面幅に関する調整

オプション --tabs <T> は出力に含まれるタブ文字を空白文字 <T> 個で置き換える。

オプション --wrap <mode> は出力の改行方式を指示する。

  • auto: bat に任せる
  • character: ???
  • never: 画面幅に収まらない長さの行に対して、改行しない。

オプション --terminal-width <width> は画面幅を明示することで bat に行の長さを自動決定させない。

  • 値に符号 + / - をつけると、その値は実際の画面幅からの差を指示することになる。

短縮オプション名

別名 本体
-f --decorations=always --color=always
-P --pager=never
-p --style=plain
-pp --style=plain --pager=never
-n --style=numbers
-S --wrap=never

発展的

ファイル名パターンから構文を決定させる

オプション --map-syntax を使うと、内容ではなくファイル名から構文を決定することが可能になる。このオプションは次の形式の引数を取る:

pattern:syntax

ここで、

  • pattern はファイル名に対して照合されるパターン文字列
  • syntax には bat が対応可能な言語名

とする。例:

--map-syntax=bash_*:bash

テーマ

コマンド bat --list-themesbat が取り扱うテーマ一覧を出力する。このコマンド自体はオプション --theme を無視するようだ。

オプション --theme <theme> でテーマを指定する。

  • テーマを利用するならば毎回同じものを指定するだろうから、後述するアプリケーション構成として指定するのが普通だろう。
  • --theme ansi がいちばんショボい?

cat (1) を bat で上書きする

Bash 対話モード設定ファイルで次のような別名を定義する:

alias cat='bat -pp'

行番号表示をやはりオンにしたいなど、オプションを変更したい状況がよくある。その都度コマンドラインで別名を上書き定義して問題ない。

環境変数 PAGERbat に設定する

export PAGER='bat --pager=always --style=plain'

ただし、これを行いたい動機となる構文強調機能が働かない。構文を判定させる術がない。

find (1) と連携する

パイプラインで find (1) の出力を bat への入力とし、適宜書式を指定すると扱いやすくなることがある。例:

find . -name '*.md' -print0 | xargs -0 bat -r:10 --style=header,numbers,rule -S

ちなみに、bat の著者は find (1) のモダンバージョンとして fd というものを開発、公表している。

git (1) の各種出力を構文強調する

環境変数 GIT_PAGER に関しては上述の PAGER と同様の制約がある。

個別のコマンドに関しては実行時に構文が判明しているので、設定のしようがある。

[pager]
    diff = bat -d -ldiff -p
    log = bat -p -l'Git Log'
    show = bat

オプション --diff--diff-context に Git 操作の出力をパイプすることが有効だ。

batdiff() {
    git diff --name-only --relative --diff-filter=d -z | xargs -0 bat --diff
}

この方式の欠点は、ファイルの構文が Git にはわからないので、構文強調が自動的にできないことだ。

man (1) の出力を構文強調する

Manpage に対する構文強調表示機能 (-l man) があるので、man (1) がページャーとして参照する環境変数 MANPAGERbat コマンドを指定すると端末画面での視認性が上がる:

export MANPAGER='bat --strip-ansi=auto --style=plain -language=man'

注意:オプション --strip-ansi を実装したバージョンの bat をインストールしておけ。

ヘルプメッセージを構文強調する

CLI コマンドオプション --help で出力される独特の書式のテキストを構文強調するオプション -l help があるので、なんとか上手く活用したい。

Bash を使っているので次が限界:

# usage: bathelp program
bathelp() {
    "$@" --help 2>&1 | bat --style=plain -language=help
}

構成

コマンドライン以外の手段で bat の動作を制御、調整する方法を記す。

構成ファイル

構成ファイルを用意することで bat の動作を調整することが可能だ。この構成ファイ ルの場所は既定では次のコマンドの出力で示されるパスだ:

bat --config-file

このファイルを作成する場合、手動よりもコマンドを実行するほうが早い:

bat --generate-config-file
$EDITOR $(bat --config-file)

構成ファイルの書式仕様を理解するには、bat が生成したテンプレを見るのが早い。コマンドラインオプションを羅列するだけで良さそうだ。

環境変数

コマンドラインオプション一種と対応する環境変数には次のようなものがある:

  • BAT_PAGING
  • BAT_PAGER
  • BAT_STYLE
  • BAT_THEME
  • BAT_THEME_LIGHT
  • BAT_THEME_DARK

次の二つは対応構成ファイル項目が実質的には存在しない:

  • BAT_CONFIG_PATH
  • BAT_CONFIG_DIR

資料

おわりに

利用のコツを以下にまとめておく:

  • インストールは可能ならば Homebrew を使え
  • 構成ファイルに常用オプションを記載しておけ
  • git diff ではなく batdiff を思い出せ
  • program --help ではなく bathelp program を思い出せ
  • テーマ機能を深追いする必要はない
  • batcat (1) の仲間というよりも、less (1) の仲間だと思え
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment