背景
mo は Markdown ファイルをブラウザでプレビューできる CLI ツールです。ライブリロード、Mermaid、KaTeX、シンタックスハイライトなど多機能で、ドキュメント作業や LLM との連携ワークフローによく使っています。
一方、記事執筆時点ではターミナル環境として cmux を使っています。cmux は AI コーディングエージェント向けに設計された macOS 用ターミナルで、組み込みブラウザをペインとして配置できます。CLI(cmux browser)でブラウザを制御できるのが特徴です。
mo を起動すると、デフォルトではシステムブラウザ(Safari や Chrome)が開きます。でも cmux を使っているなら、ターミナルの隣に並んだ組み込みブラウザで開きたい。
そこで moo / moc という zsh 関数を作りました。
コード
moo:mo を cmux ブラウザで開く
function moo() {
local port=6275
mo --no-open "$@"
local url="http://localhost:${port}"
local workspace=$(cmux identify --no-caller 2>/dev/null | grep -o 'workspace:[0-9]*')
[[ -z "$workspace" ]] && { echo "Error: not in a cmux workspace" >&2; return 1; }
local surface=$(cmux tree --workspace "$workspace" 2>/dev/null | grep '\[browser\]' | grep -o 'surface:[0-9]*' | head -1)
if [[ -n "$surface" ]]; then
cmux browser "$surface" goto "$url"
else
cmux browser open "$url" --workspace "$workspace"
fi
}
mo --no-open でシステムブラウザを開かせず、代わりに cmux browser で組み込みブラウザに URL を開きます。すでにブラウザペインが開いていれば新しく開かず、cmux browser goto で URL を切り替えます。
moc:cmux ブラウザを閉じる
function moc() {
local workspace=$(cmux identify --no-caller 2>/dev/null | grep -o 'workspace:[0-9]*')
[[ -z "$workspace" ]] && { echo "Error: not in a cmux workspace" >&2; return 1; }
local surface=$(cmux tree --workspace "$workspace" 2>/dev/null | grep '\[browser\]' | grep -o 'surface:[0-9]*' | head -1)
[[ -z "$surface" ]] && { echo "No browser surface found in $workspace" >&2; return 1; }
cmux close-surface --surface "$surface" --workspace "$workspace"
}
cmux tree でブラウザペインの surface ID を取得し、cmux close-surface で閉じます。mo を終了したあとにブラウザだけ残るのが気になったので作りました。
使い方
# Markdown ファイルを cmux ブラウザで開く
moo README.md
# ブラウザを閉じる
moc
cmux のワークスペース内で実行すると、隣にブラウザペインが開いて mo のプレビューが表示されます。ターミナルから目を離さずに Markdown を確認できて便利です。