CLIでファイルをリッチに閲覧する設定(glow + bat + fzf)
背景
ターミナルでMarkdownファイルを読みたい場面は多いが、catだと装飾なしで読みにくい。
いくつかのツールを試した経緯:
- glow単体: レンダリングは美しいが、
lessを通すとカラーが消える・テーブルが折り返される問題 - bat単体: シンタックスハイライト・行番号・ページャー一体で便利だが、テーブルをレンダリングしない(生テキスト表示)
- mdcat: テーブルレンダリング対応だが、日本語(全角文字)の幅計算がズレてテーブルのカラムが揃わない
最終的にglow(Markdown用) + bat(その他ファイル用)をfzfで統合するビューアに落ち着いた。
glowの-p(内蔵ページャー)と-w 0(ワードラップ無効)を使うことで、以前の問題を回避できた。
必要なツール
brew install glow bat fzf
- glow: Markdownレンダリング(テーブル・見出し等を整形表示)
- bat: シンタックスハイライト + 行番号 + ページャー内蔵の
cat代替 - fzf: ファジーファインダー(インタラクティブなファイル選択)
設定
ファイル検索スクリプト
~/.config/mdv/find.sh を作成(fzfのreloadで使うため外部スクリプト化):
#!/bin/bash
find . -not -path '*/.*' -not -path '*/node_modules/*' -type f | sed 's|^\./||' | sort
chmod +x ~/.config/mdv/find.sh
エイリアス
~/.zsh_aliasesなどに以下を追加:
mdv() {
if [ $# -ge 1 ]; then
case "$1" in
*.md|*.markdown|*.mdx) glow -w 0 -p "$1" ;;
*) bat --style=numbers "$1" ;;
esac
return
fi
local file _mdv_find=~/.config/mdv/find.sh
while true; do
file=$(bash "$_mdv_find" |
fzf --layout=reverse \
--preview 'case {} in *.md|*.markdown|*.mdx) glow -w 0 {};; *) bat --color=always --style=numbers {};; esac' \
--preview-window 'right:65%:wrap' \
--header 'Enter: 全画面表示 / Ctrl+R: リロード / Esc: 終了' \
--bind 'ctrl-/:change-preview-window(down:50%|right:65%)' \
--bind "ctrl-r:reload(bash $HOME/.config/mdv/find.sh)")
[ -z "$file" ] && break
case "$file" in
*.md|*.markdown|*.mdx) glow -w 0 -p "$file" ;;
*) bat --style=numbers "$file" ;;
esac
done
}
使い方
# 引数なし: VSCode風ブラウザで起動
mdv
# 引数あり: 直接表示
mdv README.md
mdv config.yml
VSCode風ブラウザの操作
| キー | 動作 |
|---|---|
| 文字入力 | ファイル名をファジー検索 |
↑ / ↓ |
ファイル選択を移動(右ペインのプレビューが連動) |
Enter |
選択したファイルを全画面表示 |
q |
全画面表示から一覧に戻る |
Ctrl+R |
ファイル一覧をリロード |
Ctrl+/ |
プレビュー位置の切り替え(右⇄下) |
Esc |
mdvを終了 |
ファイル種別ごとの表示
| ファイル | ビューア | 特徴 |
|---|---|---|
.md / .markdown / .mdx |
glow | テーブル・見出しをレンダリング |
| その他 | bat | シンタックスハイライト + 行番号 |
glowのオプション
-p: 内蔵ページャーを使用(lessを通さないのでカラー問題なし)-w 0: ワードラップ無効(wide表示、テーブルの折り返しを防ぐ)
課題
- 行番号表示: glowのページャーモード(
-p)では行番号を表示できない。-lオプションはTUIモード(-t)限定