🔍

ReviewItにインスパイアされてNeovimプラグイン「ReviewThem.nvim」を作った

に公開

こんにちは、@key60228です。

CursorやDevinに加え、Claude CodeやGemini CLIの登場によって、実装コストよりもレビューコストがますます高まっていっているのを感じる今日この頃です。

最近は専らClaude Codeをgit worktreeを使って並列で走らせているため差分が大きくなりがちで、コードレビューの辛みが増してきています。

Cursorを使っていた頃[1]はGitLensのSearch & Compareを使っていたんですが、ちょっとした変更をAIに伝えるのが難しい…!

かと言ってGitHubに毎回PRを上げるわけにもいかないし…[2]

何か良い方法はないものか…と思っていた時によしこさん (yoshiko_pg) のツイートを見かけました

https://x.com/yoshiko_pg/status/1939485439661899842

https://github.com/yoshiko-pg/reviewit

これだ…!でも出来ればターミナル上で、さらに出来ればNeovimで完結できないだろうか…![3]

作ってみた

というわけで、Neovim上でref間の差分をレビューできるプラグイン「ReviewThem.nvim」を作ってみました。

https://github.com/KEY60228/reviewthem.nvim

lazy.nvimを使っていれば以下でインストール可能です。

{
  "KEY60228/reviewthem.nvim",
  dependencies = {
    "sindrets/diffview.nvim",
    "nvim-telescope/telescope.nvim",
  },
  config = function()
    require("reviewthem").setup({
      diff_tool = "diffview",  -- Currently only "diffview" is supported. More tools will be added soon!
      comment_sign = "💬",
      submit_format = "markdown",  -- "markdown" or "json"
      submit_destination = "clipboard",  -- "clipboard" or file path relative to project root
      ui = "builtin",  -- "builtin" or "telescope"
      keymaps = {
        start_review = "<leader>rtstart",
        add_comment = "<leader>rtc",
        submit_review = "<leader>rtsubmit",
        abort_review = "<leader>rtabort",
        show_comments = "<leader>rtsc",
        toggle_reviewed = "<leader>rtmr",
        show_status = "<leader>rtss",
      },
      command_aliases = {
        review_start = "rts",  -- Alias for ReviewThemStart
      },
    })
  end,
}

レビュー対象のbase branchとcompare branchを以下のように指定することで、差分ツールが開きます

:ReviewThemStart main feature/xxx

ReviewThemStart

コメントしたい箇所を選択して

:ReviewThemAddComment

とすることでコメントを残すことができます。

ReviewThemAddComment

レビュープロセスが終わったら

:ReviewThemSubmit

とコマンド入力すると差分ツールが閉じ、クリップボードにレビュー内容が保存されます。

レビュー内容の出力先はクリップボードとファイルのどちらかを選択することができ、形式もMarkdownとJSONを選択することができます。

出力結果は以下のような形になります。

Markdown

# Code Review

**Base:** main
**Compare:** feature/xxx
**Date:** 2025-07-04 18:25:49

## Comments

### alacritty/alacritty.toml

- **Lines 47-127:** アルファベット順に並び替えてください。

JSON

{
  "review": {
    "comments": [
      {
        "file": "alacritty/alacritty.toml",
        "line_start": 47,
        "line_end": 127,
        "comment": "アルファベット順に並び替えてください"
      }
    ],
    "timestamp": "2025-07-04 18:28:14",
    "base_ref": "main",
    "compare_ref": "feature/xxx"
  }
}

他にも以下のコマンドを用意しています

  • ReviewThemShowComments: コメントの一覧
  • ReviewThemMarkAsReviewed / ReviewThemUnmarkAsReviewed: ファイルをレビュー済みとしてmark/unmark
  • ReviewThemStatus: ファイルごとのレビュー状況の一覧
  • ReviewThemAbort: レビュープロセスの終了

今後やりたいこと

現時点では差分ツールとしてDiffview、UI/ファジーファインダーとしてtelescopeに依存する形になっていますが、将来的には色んなツールに対応できるようにしたいなと考えています。

https://github.com/sindrets/diffview.nvim

https://github.com/nvim-telescope/telescope.nvim

また、まだまだ荒削りで個人的に手の届いていない箇所 (コメントのUXやファジーファインダーの挙動) が多いのでその辺も改善していきたい…

所感

Neovimのプラグイン実装の知見ほぼ0だったんですが、Claude Codeがあれば形になるもんだなあとありがたいやら恐ろしいやら…

是非使ってみていただけると嬉しいです!!

IssueやStarも何卒…!

https://github.com/KEY60228/reviewthem.nvim


脚注
  1. 最近Cursor + WarpからNeovim + tmux + Alacrittyに移行してみました ↩︎

  2. 最近こんな記事も話題になってましたね ↩︎

  3. TUIモードもありますが、コメントは出来ない仕様のようでした (2025/7/4現在) ↩︎

AI Shift Tech Blog

Discussion