Octo.nvimとgh-dashたまにdiffview.nvimを使ってNeovim上でコードレビューする
はじめに
コードレビューを行うとき、ブラウザで GitHub を開き差分を見つつ、エディターで周辺コードを見るというやり方で行っていました。自分は Neovim を使っているのですが、VSCode を使っている人はほとんどの人が差分の確認からレビューコメントまで VSCode で完結させているらしいということにある時気づきました。ブラウザとエディタを交互に見るスタイルに特に不満はなかったのですが、コードレビューをエディタ内で完結できる手段を持っておくに越したことはないと思い、 Neovim でコードレビューを行う方法を探してみることにしました。
Octo.nvim というプラグインの存在は知っていて、多くの機能があるため使いこなすのが難しそうに感じていましたが、重い腰を上げて Octo.nvim を使ってみることにしました。 また、試行錯誤を重ねているうちに gh-dash と diffview.nvim というプラグインも見つけました。Octo.nvim だけでなくこれらのプラグインも合わせることである程度快適にコードレビューを行うことができるようになったので、その方法を紹介します。
この記事で扱うプラグイン
Octo.nvimとは
Octo.nvim は Github の CLI ツールであるgh
を使って、Neovim 上で GitHub の操作を行うことができるプラグインです。Neovim の UI を使ってインタラクティブに PR の作成やレビューを行うことができます。gh
コマンドで可能なことは大体できるのかなと想像していますが、README にあるコマンド一覧を参照すると、どのような操作ができるかがわかると思います。
gh-dashとは
gh-dash は Github 上の dashboard(PRやissueの一覧)を表示することができるプラグインです。公式が提供しているCLIツールである gh の extension として公開されています。
diffview.nvimとは
diffview.nvim は差分を見るための Neovim プラグインです。1つの tabpage を使って、指定した diff に含まれるすべてのファイルの差分を見ることができます。Octo.nvim のレビュー画面と似た機能を提供しています。「まさにこのツールの使い所だ!」という場面にまだ遭遇できておらず模索中ですが、差分をサクッと見たいときに便利だと思います。
レビューの流れ
ここからは実際に私が行なっているレビューの流れに沿って各プラグインを紹介したいと思います。
gh-dashでアサインされているPRを見る
まずは gh-dash を使って、自分がレビューワーに指定されているPRを見ます。gh-dash の設定に以下のようなキーマップを定義し、diff の確認やレビューをスムーズに開始できるようにしています。
keybindings:
prs:
- key: d
command: |-
tmux new-window -c {{.RepoPath}} '
tmux rename-window {{.RepoName}}#{{.PrNumber}} &&
gh pr checkout {{.PrNumber}} &&
nvim -c ":DiffviewOpen origin/$(gh pr status --json baseRefName -q '.currentBranch.baseRefName')...{{.HeadRefName}}"
'
- key: C
command: |-
tmux new-window -c {{.RepoPath}} '
tmux rename-window {{.RepoName}}#{{.PrNumber}} &&
gh pr checkout {{.PrNumber}} &&
nvim -c ":Octo pr edit {{.PrNumber}}"
'
d
に diffview.nvim を使った diff の確認、C
には Octo.nvim で該当の PR を開くためのコマンドを割り当てています。どちらも tmux new-window
を呼び出して新しい tmux ウィンドウを開き、その中で gh pr checkout
で PR をチェックアウトし、diffview.nvim や Octo.nvim を開いた状態の Neovim を開いています。tmux new-window
の引数に一連のコマンドを渡すことで、diff の確認やレビューを終えて Neovim を閉じると tmux のウィンドウも閉じるようになるため、スムーズに gh-dash の画面に戻ることができます。
1. diffview.nvim を使って差分を見る
diff の確認をする場合はgh pr checkout
で該当の PR にチェックアウトし、BASE と HEAD を指定して diffview.nvim を開いています。gh-dash では HEAD は {{.HeadRefName}}
という変数を展開することで取得できますが、BASE は取得できないため、別途 gh コマンドで取得しています。diffview.nvim を開くと、PR の差分が表示されます。ファイルツリーと差分の領域に分かれています。
2. Octo.nvim を使ってレビューする
コードレビューをする場合はgh pr checkout
で該当の PR にチェックアウトし、:Octo review edit ${PR_NUMBER}
を開いた状態の Neovim を開いています。該当の画面では PR の情報が表示されます。PR の Description やすでに作成されているコメントはここで確認できます。コメントに対する返信やリアクションもここで行うことができます。
PR の概要やコメントの確認を終えてレビューを開始する際には :Octo review start
を実行します。コマンドを実行すると差分の確認画面に切り替わり、レビューコメントの追加ができます。:Octo review commit
を実行することで、コミットごとの差分を確認することもできます。:Octo review start
を実行した時点でレビューが Pending の状態になります。バッファを閉じるとレビューを中断することができます。中断したレビューは:Octo review resume
を実行することで再開することができます。
レビューが一通り終わったら、:Octo review submit
でレビューを提出します。このコマンドを実行するとメッセージを記入するための Floating window が表示されるので記入します。Approve, Request changes, Comment を出し分けることもできます。
Octo.nvim では PR のマージも行うことができます。PR の詳細画面で:Octo pr merge [method]
を実行することでマージを行うことができます。この際 squash や rebase などのマージ方法を指定することができます。レビュワーがマージする運用の場合はマージまで Neovim 上で完結させることができます。
この記事では紹介していませんが Octo.nvim は他にも多くの機能があります。気になった方はぜひ README を参照してみてください。大体の操作がコマンドで提供されており、Ex コマンドの補完の設定もしているので操作には困らないのですが、ほぼすべての操作に対してデフォルトでキーマップが割り当てられているため効率化を図りたいと思います。legendary.nvim などと組み合わせて、操作補助とチートシートを兼ねたものを作成してみようと思いました。(VSCodeでいうコマンドパレットのようなイメージです。)
おわりに
gh-dash と Octo.nvim(と diffview.nvim)を使うことで、Neovim だけでコードレビューを行う環境を整えることができました。ブラウザとエディタを行き来する手間が省けるため、コードレビューの効率を上げていきたいですね。まだ探り探りの状態ですが、これからもっと使いこなしていきたいと思います。