背景

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

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

  1. glow単体: レンダリングは美しいが、lessを通すとカラーが消える・テーブルが折り返される問題
  2. bat単体: シンタックスハイライト・行番号・ページャー一体で便利だが、テーブルをレンダリングしない(生テキスト表示)
  3. 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)限定