はじめに

GitHub Copilot CLI の /research コマンドはほんと便利。

/researchpptx スキルを組み合わせると、うまくいけば 1 Premium request でかなり情報がまとまったパワポを作れます。 /research は調査した内容を Markdown 形式のレポートとして出力して、pptx スキルはこのレポートを使ってパワポにします。 パワポ生成は一例で、/research はこのレポートに価値があります。 GitHub Copilot CLI の機能でレポートをエディタで開いたり、Gist やファイルに保存したりは可能です。

Researching with GitHub Copilot CLI - GitHub Docs

The /research slash command turns Copilot into your research assistant, gathering in-depth information and insights on a topic.
icon
docs.github.com

話は変わって、ターミナルで GitHub Copilot CLI を使い始めてから VS Code を使う頻度が下がって、ターミナルがメインの生活になってきました。 VS Code を使っていたときは Markdown ビューアとしても使っていたので、代わりにターミナルでも使える Markdown を見る方法を考えていたところ k1LoW/mo というツールを知りました。

GitHub - k1LoW/mo: mo is a Markdown viewer that opens .md files in a browser.

mo is a Markdown viewer that opens .md files in a browser. - k1LoW/mo
icon
github.com

mo はブラウザ用の Markdown ビューアですが、普段使っている cmux というターミナルでは内蔵ブラウザがあって、そこに mo を使った Markdown ビューアを表示できます。 cmux 上で mo <file>.md とするだけで cmux の画面が分割されて Markdown ビューアが表示されます。 めっちゃ便利。

ただ、GitHub Copilot CLI の /research のレポートは ~/.copilot/session-state/<session-id>/research/<file>.md に保存されるので、いちいちファイルを指定して mo コマンドを実行するのは面倒。

加えて、cmux で mo コマンドを実行するだけでは内蔵ブラウザが左右に分割されて表示されてしまいます。 普段から cmux を左右に 2 分割して使っているので、個人的には上下に分割されて下側に表示してほしい。

課題

課題をまとめるとこんな感じ。

  • /research のレポートを mo で表示するときに探すのが面倒
  • mo の Markdown ビューアを表示するときに cmux のペインは左右分割ではなく上下分割してほしい

解決策

cmux は cmux というコマンドも提供してくれていて、cmux new-pane コマンドを使って画面を分割できます。 デフォルトでは左右に分割されますが、cmux new-pane --direction down とすると画面を上下に分割して下側に新しいペインを作ってくれます。

さらに --type browser オプションを指定することで分割したペインで内蔵ブラウザを開けます。 これをうまく使えば分割方向の問題は解決できそう。

一方、mo も --target オプションで Markdown ファイルをグルーピングしたり、--watch オプションで特定ディレクトリを監視して新規 Markdown ファイルをビューアに追加したりできます。

レポートが出力される ~/.copilot/session-state/<session-id>/research/<file>.md を監視するだけで新しいレポートも追加できますが、「読みたいときにビューアを開く、終わったら閉じる」をシュッとしたくて、そのためには少し工夫が必要でした。

結局、GitHub Copilot に手伝ってもらって作った関数で目的は達成できました。

function openresearch() {
  local cache="${HOME}/.cache/cmux-research-surface"
  local file="${1}"

  if [[ -z "$file" ]]; then
    local -a files
    files=(~/.copilot/session-state/*/research/*.md(N.om))
    (( ${#files} )) || { echo "No research report found." >&2; return 1; }
    file=$(print -l "${files[@]}" | fzf --height=40% --layout=reverse --border \
      --delimiter=/ --with-nth=-1 --preview 'head -20 {}' --prompt 'research> ')
  fi
  [[ -z "$file" ]] && return 0

  local url=$(mo --no-open "$file" --json | jq -r '.files[0].url')
  [[ -z "$url" || "$url" == "null" ]] && { echo "Failed to get URL from mo." >&2; return 1; }

  [[ -f "$cache" ]] && cmux browser "$(<$cache)" goto "$url" 2>/dev/null && return 0

  mkdir -p "${cache:h}"
  local s=$(cmux new-pane --type browser --direction down --url "$url" | grep -oE -m1 'surface:[0-9]+')
  [[ -n "$s" ]] && print -r -- "$s" > "$cache"
}

openresearch コマンドを実行したら fzf でレポート一覧が表示されるので、見たいものを選択すると cmux の下側に mo の Markdown ビューアが表示されます。

今のところこの使い方がしっくりきてます。

まとめ

  • Markdown ビューアの k1LoW/mo は便利
  • cmux は cmux コマンドで画面分割方法を指定できる
  • GitHub Copilot CLI の /research レポートは cmux と mo を組み合わせたらシュッと見れる