| author | created | modified | draft | tags | title | |||
|---|---|---|---|---|---|---|---|---|
プレハブ小屋 <2386769+showa-yojyo@users.noreply.github.com> |
2026-02-10 |
2026-03-05 |
true |
|
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/_batbat の主要な機能は cat(1) と同じく、一つまたは複数のファイルの内容を端末画面やファイルに出力する。入力源が複数の場合、その内容を連結して出力するのも同様だ。
オプションなしで bat を走らせるときの既定動作は次のとおり:
- 構文強調表示
- ファイル名と行番号を表示
- Git リポジトリー内容ならば差分記号を表示
- 内容が多い場合はページャーを起動
入力がファイルから与えられる場合、記述されているプログラミング or マークアップ言語を自身で判定し、構文強調を行う。
入力が標準入力から与えられる場合、一行目に言語を特定できる情報があればそれを採用して構文強調を行う。そうでない場合は、コマンドラインオプションで明示的に指示するのだ。
- オプション
-l/--languageで構文を指示可能。 - オプション
-L/--list-languagesでbatが取り扱える言語一覧を出力する。この表の二列目の文字列で指定しろ。
- パイプから入力を受け取る。これが最も普通の標準入力からの読み取り方式だろう。
- 引数に
-を指定することで、標準入力から内容を読み取らせる。 - オプション
--file-nameを利用して標準入力を-で指示する。
Git リポジトリー管理対象ファイルを出力すると、行表示柱に差分を記号 +, ~. - を使って示す。
- オプション
-d/--diffで、上記差分記号が生じる行のみを出力する。 - オプション
--diff-context <N>で差分箇所前後<N>行を出力に含ませる。
オプション -A/--show-all で cat(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-themes は bat が取り扱うテーマ一覧を出力する。このコマンド自体はオプション --theme を無視するようだ。
オプション --theme <theme> でテーマを指定する。
- テーマを利用するならば毎回同じものを指定するだろうから、後述するアプリケーション構成として指定するのが普通だろう。
--theme ansiがいちばんショボい?
Bash 対話モード設定ファイルで次のような別名を定義する:
alias cat='bat -pp'行番号表示をやはりオンにしたいなど、オプションを変更したい状況がよくある。その都度コマンドラインで別名を上書き定義して問題ない。
export PAGER='bat --pager=always --style=plain'ただし、これを行いたい動機となる構文強調機能が働かない。構文を判定させる術がない。
パイプラインで find (1) の出力を bat への入力とし、適宜書式を指定すると扱いやすくなることがある。例:
find . -name '*.md' -print0 | xargs -0 bat -r:10 --style=header,numbers,rule -Sちなみに、bat の著者は find (1) のモダンバージョンとして fd というものを開発、公表している。
環境変数 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 にはわからないので、構文強調が自動的にできないことだ。
Manpage に対する構文強調表示機能 (-l man) があるので、man (1) がページャーとして参照する環境変数
MANPAGER で bat コマンドを指定すると端末画面での視認性が上がる:
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_PAGINGBAT_PAGERBAT_STYLEBAT_THEMEBAT_THEME_LIGHTBAT_THEME_DARK
次の二つは対応構成ファイル項目が実質的には存在しない:
BAT_CONFIG_PATHBAT_CONFIG_DIR
利用のコツを以下にまとめておく:
- インストールは可能ならば Homebrew を使え
- 構成ファイルに常用オプションを記載しておけ
git diffではなくbatdiffを思い出せprogram --helpではなくbathelp programを思い出せ- テーマ機能を深追いする必要はない
batをcat(1) の仲間というよりも、less(1) の仲間だと思え