背景

ターミナルでMarkdownファイルを読みたい場面は多いが、catだと装飾なしで読みにくい。

いくつかのツールを試した経緯:

  1. glow単体: レンダリングは美しいが、lessを通すとカラーが消える・テーブルが折り返される問題
  2. bat単体: シンタックスハイライト・行番号・ページャー一体で便利だが、テーブルをレンダリングしない(生テキスト表示)
  3. mdcat: テーブルレンダリング対応だが、日本語(全角文字)の幅計算がズレてテーブルのカラムが揃わない

最終的にglow(Markdown用) + bat(その他ファイル用)をfzfで統合するビューア fv (file viewer) に落ち着いた。 glowの-p(内蔵ページャー)と-w 0(ワードラップ無効)を使うことで、以前の問題を回避できた。

必要なツール

brew install glow bat fzf
  • glow: Markdownレンダリング(テーブル・見出し等を整形表示)
  • bat: シンタックスハイライト + 行番号 + ページャー内蔵のcat代替
  • fzf: ファジーファインダー(インタラクティブなファイル選択)

設定

ヘルパースクリプト

~/.config/fv/ に2つのスクリプトを配置:

find.sh(ファイル一覧取得)

#!/bin/bash
find . -not -path '*/.*' -not -path '*/node_modules/*' -type f | sed 's|^\./||' | sort

open.sh(ファイル種別に応じた表示)

#!/bin/bash
case "$1" in
  *.md|*.markdown|*.mdx) glow -w 0 -p "$1" ;;
  *) bat --style=numbers "$1" ;;
esac
mkdir -p ~/.config/fv
chmod +x ~/.config/fv/find.sh ~/.config/fv/open.sh

エイリアス

~/.zsh_aliasesなどに以下を追加:

fv() {
  if [ $# -ge 1 ]; then
    bash ~/.config/fv/open.sh "$1"
    return
  fi
  bash ~/.config/fv/find.sh |
    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/fv/find.sh)" \
        --bind "enter:execute(bash $HOME/.config/fv/open.sh {})"
}

使い方

# 引数なし: VSCode風ブラウザで起動
fv

# 引数あり: 直接表示
fv README.md
fv config.yml

VSCode風ブラウザの操作

キー 動作
文字入力 ファイル名をファジー検索
/ ファイル選択を移動(右ペインのプレビューが連動)
Enter 選択したファイルを全画面表示(カーソル位置を維持)
q 全画面表示から一覧に戻る
Ctrl+R ファイル一覧をリロード
Ctrl+/ プレビュー位置の切り替え(右⇄下)
Esc fvを終了

ファイル種別ごとの表示

ファイル ビューア 特徴
.md / .markdown / .mdx glow テーブル・見出しをレンダリング
その他 bat シンタックスハイライト + 行番号

glowのオプション

  • -p: 内蔵ページャーを使用(lessを通さないのでカラー問題なし)
  • -w 0: ワードラップ無効(wide表示、テーブルの折り返しを防ぐ)

課題

  • 行番号表示: glowのページャーモード(-p)では行番号を表示できない。-lオプションはTUIモード(-t)限定