AIエージェントのお供にNeovimはいかが? ― コードビューアーとしてのNeovim入門

はじめに

Claude Codeや​Codex CLIと​いった​AIエージェントを​日常的に​使っている​輪ごむです。

最近、​ターミナル上で​AIエージェントに​コードを​書いて​もらう​スタイルが​定着してきました。​Ghosttyなどの​モダンな​ターミナルで​Claude Codeや​Codex CLI、​OpenCodeを​走らせている​方も​多いのではないでしょうか。

こんな​経験、​ありませんか?

これらの​AIエージェントツールでは、​プロンプト入力中にCtrl+Gを​押すと$EDITORに​設定した​エディタが​開きます。​そこで​プロンプトを​書くだけでなく、​AIが​編集中の​コードを​横目で​確認できたら​便利ですよね。

この​記事では、「コードビューアー」と​しての​Neovimを​最小構成で​構築します。​VSCodeに​近い​操作感に​なるように​設定するので、​Vim怖い勢の​方も​安心してください。

「Vimを​閉じられなくて​困った」と​いう​あの​悲劇、​ありますよね。​この​設定を​入れればCtrl+Qで​確実に​閉じられるので、​もう​二度と​起きません!!!!

この​記事の​ゴール: Neovimで​ファイルを​開いて、​ハイライト付きで​読めて、​ファイルを​切り​替えられて、​gitの​差分が​見られる​状態に​なる​こと。

セットアップ

$EDITORを​nvimに​設定する

シェルの​設定ファイルに​以下を​追記してください。

12
# ~/.zshrc や​ ~/.bashrc の​場合
export EDITOR=nvim
12
# ~/.config/fish/config.fish の​場合
set -gx EDITOR nvim

反映するには​ source ~/.zshrc するか、​ターミナルを​再起動してください。​Claude Codeなどを​再起動すると、Ctrl+Gで​Neovimが​開くようになります。

Neovim nightlyを​インストール

この​設定では​Neovim nightly​(>= 0.12.0)が​必要です。​Neovim 0.12で​追加されたvim.packと​いう​組み込みパッケージマネージャーを​使っている​ためです。

brew経由​(macOS)​:

1
brew install neovim --HEAD

mise経由:

1
mise use -g neovim@nightly

winget経由​(Windows)​:

1
winget install Neovim.Neovim.Nightly

Denoを​インストール

vim-fallや​vim-ginなどの​denops系プラグインで​必要です。

12345
# brew
brew install deno

# mise
mise use -g deno@latest

まず​安心して​ほしい​:最低限の​キー操作

Vimと​聞くだけで​身構えてしまう方、​ここだけ​覚えれば​怖くないです!!

操作キー説明VSCodeだと
Neovimを​閉じるCtrl+Q保存せず強制終了。​もう​閉じられなくて​困らない!ウィンドウを​閉じる
保存Ctrl+Sおなじみの​保存Ctrl+S
入力モードに​入るiテキストが​打てるようになる(常に​入力可能)
入力モードを​抜けるEscノーマルモードに​戻るEscで​メニューを​閉じる​感覚
ファイルを​閉じるCtrl+W開いている​タブを​閉じるCtrl+W
ファイルを​開くCtrl+Pファジーファインダーで​ファイルを​検索Ctrl+P
サイドバー表示Ctrl+Shift+Eファイルエクスプローラーを​開くCtrl+Shift+E
サイドバートグルCtrl+Bファイルエクスプローラーの​表示/非​表示Ctrl+B

VSCodeと​ほとんど​同じ​キーバインドに​しているので、​乗り換えコストは​かなり​低いはずです。

初期設定コード

以下の​コードを​ ~/.config/nvim/init.lua に​コピーして​貼り付けるだけです。​初回起動時に​プラグインが​自動で​インストールされます。

設定の​中身を​ざっくり説明すると​:

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306
-- =============================================================================
-- AIエージェントの​お供に​Neovimは​いかが?​ ― 初期設定コード
-- =============================================================================
--
-- 使い方​:
--   この​ファイルを​ ~/.config/nvim/init.lua に​コピーしてください。
--   初回起動時に​プラグインが​自動で​インストールされます。
--
-- 前提:
--   - Neovim nightly (>= 0.12.0)
--   - Deno (vim-fall, vim-gin, skkeleton で​必要。​代替プラグインなら​不要)
--
-- ⚠️ 注意:
--   以下の​キーマッピングは​この​設定ファイルで​追加している​ものです。
--   素の​ Neovim には​存在しません。​この​ファイルを​適用してから​使ってください。
--
--   Ctrl+Q  → Neovim を​閉じる​(保存せず強制終了)
--   Ctrl+S  → 保存
--   Ctrl+W  → 現在の​ファイル​(バッファ)を​閉じる
--   Ctrl+P  → ファイルピッカーを​開く
--   Ctrl+Shift+E → ファイルエクスプローラーを​開く
--   Ctrl+B  → ファイルエクスプローラーを​トグル
-- =============================================================================

-- ---------------------------------------------------------------------------
-- 基本設定
-- ---------------------------------------------------------------------------

-- クリップボードを​OSと​共有​(コピペが​自然に​できる)
vim.opt.clipboard = "unnamedplus"

-- 行番号を​表示
vim.opt.number = true

-- カーソル行を​ハイライト
vim.opt.cursorline = true

-- 24bitカラーを​有効化​(bufferline等で​必要)
vim.opt.termguicolors = true

-- マウス操作を​有効化​(タブの​クリック切り​替え等)
vim.opt.mouse = "a"

-- 検索時に​大文字小文字を​区別しない​(大文字が​含まれる​場合は​区別する)
vim.opt.ignorecase = true
vim.opt.smartcase = true

-- インデント設定
vim.opt.expandtab = true
vim.opt.shiftwidth = 2
vim.opt.tabstop = 2

-- サインカラム​(gitsignsの​表示用)を​常に​表示
vim.opt.signcolumn = "yes"

-- スワップファイルを​無効化
vim.opt.swapfile = false

-- ---------------------------------------------------------------------------
-- キーマッピング​(VSCode風)
-- ---------------------------------------------------------------------------
-- ⚠️ これらは​「この​設定ファイルで​追加した」​カスタムキーマッピングです。
--    素の​ Neovim には​存在しません。

-- Ctrl+Q: Neovimを​確実に​閉じる​(保存しない)
-- もう​「Vimを​閉じられない」で​困る​ことは​ありません!
vim.keymap.set("n", "<C-q>", "<Cmd>qa!<CR>", { desc = "Neovimを​閉じる​(強制)​" })
vim.keymap.set("i", "<C-q>", function()
  -- 入力モード中に​Ctrl+Qを​押した​場合は​注意メッセージを​表示
  vim.api.nvim_echo({
    { "Escキーを​押してから​Ctrl+Qしてください​", "WarningMsg" },
  }, true, {})
end, { desc = "閉じ方の​ヒントを​表示" })

-- Ctrl+S: 保存
vim.keymap.set("n", "<C-s>", "<Cmd>w<CR>", { desc = "保存" })
vim.keymap.set("i", "<C-s>", "<Cmd>w<CR>", { desc = "保存" })

-- Ctrl+W: 現在の​バッファ​(タブ)を​閉じる
-- VSCodeの​Ctrl+Wと​同じ​感覚で​使えます
vim.keymap.set("n", "<C-w>", function()
  local bufnr = vim.api.nvim_get_current_buf()
  -- 直前の​バッファに​切り替えてから​閉じる
  vim.cmd("bprevious")
  -- 元の​バッファを​削除
  vim.api.nvim_buf_delete(bufnr, { force = false })
end, { desc = "現在の​バッファを​閉じる​" })

-- ​その​他の​便利な​キーマッピング​(コメントを​外すと​有効に​なります)
-- vim.keymap.set("n", "<C-z>", "u", { desc = "Undo​(元に​戻す)​" })
-- vim.keymap.set("n", "<C-y>", "<C-r>", { desc = "Redo​(やり直す)​" })
-- vim.keymap.set("n", "<C-a>", "ggVG", { desc = "全選​択" })
-- vim.keymap.set("v", "<C-c>", '"+y', { desc = "コピー" })
-- vim.keymap.set("n", "<C-f>", "/", { desc = "検索" })

-- ---------------------------------------------------------------------------
-- プラグインの​インストール​(vim.pack)
-- ---------------------------------------------------------------------------
-- Neovim nightly (>= 0.12) に​内蔵された​パッケージマネージャーを​使います。
-- 初回起動時に​自動的に​プラグインが​ダウンロードされます。

vim.pack.add({
  -- === Denops​(vim-fall, vim-gin, skkeleton の​基盤)​ ===
  "https://github.com/vim-denops/denops.vim",

  -- === ファイルピッカー: vim-fall ===
  "https://github.com/lambdalisue/vim-fall",

  -- === ファイルエクスプローラー: vim-fern ===
  "https://github.com/lambdalisue/vim-fern",

  -- === Git操作: vim-gin ===
  "https://github.com/lambdalisue/vim-gin",

  -- === Git差分​表示: gitsigns.nvim ===
  "https://github.com/lewis6991/gitsigns.nvim",

  -- === タブライン: bufferline.nvim ===
  "https://github.com/akinsho/bufferline.nvim",
  "https://github.com/nvim-tree/nvim-web-devicons",

  -- === コードハイライト: treesitter ===
  { src = "https://github.com/nvim-treesitter/nvim-treesitter", version = "main" },

  -- === 日本語入力​(SKK)​: skkeleton ===
  -- Deno が​必要です。​不要な方は​この​行を​コメントアウトしてください。
  "https://github.com/vim-skk/skkeleton",

  -- === AIエージェント操作: nvim-aibo ===
  -- Neovimの​バッファを​使って​Claude Codeや​Codex CLIに​指示を​出せる​プラグイン。
  -- Deno (denops.vim) が​必要です。
  "https://github.com/lambdalisue/nvim-aibo",
})

-- ---------------------------------------------------------------------------
-- Treesitter​(コードハイライト)
-- ---------------------------------------------------------------------------
-- ファイルを​開いた​とき、​コードに​色が​つくようになります。

-- よく​使われる​言語の​パーサーを​インストール
local ts_parsers = {
  "bash",
  "css",
  "dockerfile",
  "fish",
  "git_config",
  "git_rebase",
  "gitcommit",
  "gitignore",
  "go",
  "html",
  "javascript",
  "json",
  "lua",
  "make",
  "markdown",
  "markdown_inline",
  "python",
  "rust",
  "sql",
  "toml",
  "tsx",
  "typescript",
  "vim",
  "vimdoc",
  "yaml",
  "zig",
}

-- ​「全部​入れたい」​場合は​上の​代わりに​以下を​使ってください​:
-- vim.cmd("TSInstall all")

local nts = require("nvim-treesitter")
nts.install(ts_parsers)

-- プラグインが​更新された​ときに​パーサーも​自動更新
vim.api.nvim_create_autocmd("PackChanged", {
  callback = function()
    nts.update()
  end,
})

-- ファイルを​開いた​ときに​ treesitter ハイライトを​有効化
vim.api.nvim_create_autocmd("FileType", {
  callback = function(args)
    local filetype = args.match
    local lang = vim.treesitter.language.get_lang(filetype)
    if lang and vim.treesitter.language.add(lang) then
      vim.bo.indentexpr = "v:lua.require'nvim-treesitter'.indentexpr()"
      vim.treesitter.start()
    end
  end,
})

-- ---------------------------------------------------------------------------
-- gitsigns.nvim​(Git差分​表示)
-- ---------------------------------------------------------------------------
-- ファイルの​変更箇所の​左側に​カラーマークが​表示されます。

require("gitsigns").setup({
  signs = {
    add          = { text = "┃" },
    change       = { text = "┃" },
    delete       = { text = "_" },
    topdelete    = { text = "‾" },
    changedelete = { text = "~" },
    untracked    = { text = "┆" },
  },
  -- 現在行の​blame情報を​表示したい​場合は​trueに
  current_line_blame = false,
})

-- ---------------------------------------------------------------------------
-- bufferline.nvim​(タブライン)
-- ---------------------------------------------------------------------------
-- 複数ファイルを​開くと​画面上部に​ファイル名が​タブ表示されます。
-- クリックでも​切り​替えられます。

require("bufferline").setup({
  options = {
    -- 閉じる​ボタンを​クリックで​バッファを​閉じられる
    close_command = "bdelete! %d",
    -- マウスの​右クリックで​閉じる
    right_mouse_command = "bdelete! %d",
    -- タブの​見た​目
    separator_style = "thin",
    -- 数字の​表示
    numbers = "ordinal",
  },
})

-- ---------------------------------------------------------------------------
-- vim-fall​(ファイルピッカー)
-- ---------------------------------------------------------------------------
-- VSCode の​ Ctrl+P と​同じ​感覚で​ファイルを​開けます。
-- Ctrl+P → ファイル名を​入力 → Enter で​開く

vim.keymap.set("n", "<C-p>", "<Cmd>Fall file<CR>", { desc = "ファイルピッカー (vim-fall)" })

-- グレップ検索​(ファイル内容を​検索)
-- vim.keymap.set("n", "<C-S-f>", "<Cmd>Fall grep<CR>", { desc = "グレップ検索 (vim-fall)" })

-- ---------------------------------------------------------------------------
-- vim-fern​(ファイルエクスプローラー)
-- ---------------------------------------------------------------------------
-- VSCode の​ Ctrl+Shift+E / Ctrl+B と​同じ​感覚で​サイドバーを​操作できます。

-- Ctrl+Shift+E: ファイルエクスプローラーを​開く
vim.keymap.set("n", "<C-S-e>", "<Cmd>Fern . -reveal=% -drawer -width=30<CR>", {
  desc = "ファイルエクスプローラーを​開く​ (vim-fern)",
})

-- Ctrl+B: ファイルエクスプローラーを​トグル
vim.keymap.set("n", "<C-b>", "<Cmd>Fern . -reveal=% -drawer -width=30 -toggle<CR>", {
  desc = "ファイルエクスプローラーを​トグル (vim-fern)",
})

-- ---------------------------------------------------------------------------
-- vim-gin​(Git操作)
-- ---------------------------------------------------------------------------
-- ターミナルでの​ git コマンドと​同じ​感覚で​使えます。
--
-- 使い方​:
--   :Gin status           → git status
--   :Gin commit           → git commit
--   :Gin log              → git log
--   :GinStatus            → 対話的な​ステータス画面
--     ファイル上で​ << を​押すと​ステージング
--     ファイル上で​ >> を​押すと​リセット
--   :GinLog               → コミット履歴
--   :GinDiff              → 差分​表示

-- ---------------------------------------------------------------------------
-- skkeleton​(日本語入力 - SKK)
-- ---------------------------------------------------------------------------
-- Neovim上で​日本語を​入力できます。​Deno が​必要です。
--
-- Ctrl+J で​SKKを​有効化/無効化します。
-- 使い方​: 入力モードで​ Ctrl+J → Nihongo と​入力 → Space で​変換

vim.keymap.set("i", "<C-j>", "<Plug>(skkeleton-toggle)", { desc = "SKK切り​替え" })
vim.keymap.set("c", "<C-j>", "<Plug>(skkeleton-toggle)", { desc = "SKK切り​替え" })

-- SKKの​辞書設定​(必要に​応じて​パスを​変更してください)
-- vim.api.nvim_create_autocmd("User", {
--   pattern = "skkeleton-initialize-pre",
--   callback = function()
--     vim.fn["skkeleton#config"]({
--       globalDictionaries = { "~/.skk/SKK-JISYO.L" },
--       userDictionary = "~/.skk/user-dictionary",
--     })
--   end,
-- })

-- ---------------------------------------------------------------------------
-- nvim-aibo​(AIエージェント操作)
-- ---------------------------------------------------------------------------
-- Neovimの​バッファを​使って​Claude Codeや​Codex CLIに​指示を​出せる​プラグインです。
-- lambdalisueさん作。​Denops (Deno) が​必要です。
--
-- 使い方​:
--   Neovim上で​バッファに​プロンプトを​書いて、​AIエージェントに​送信できます。
--   ターミナルを​分割して​AIエージェントを​横に​並べて​作業する​イメージです。
--
-- 詳細は​公式リポジトリを​参照してください​:
-- https://github.com/lambdalisue/nvim-aibo

設定コードが​長く​見えるかもしれませんが、​コピペ一発で​動くので​ご安心ください。​ここからは、​設定に​含まれている​各プラグインの​紹介を​していきます。

プラグイン紹介

設計方​針

今回の​プラグイン構成では、lambdalisue(通称りんだん)さんの​プラグインを​メインで​採用しています。

同じ​作者で​揃えると、​設定の​書き方や​UI設計に​統一感が​出るのが​いい​ところです。​りんだんさんの​プラグインは​「入れるだけで​使える」と​いう​思想で​作られているので、​初心者の​方にも​ぴったりだと​思います。

各プラグインには​代替プラグインも​紹介するので、​好みに​合わせて​選んで​みてください。

コードハイライト:treesitter

TODO: スクリーンショットを​追加 —>

Treesitterは、​コードを​構文解析して​正確に​ハイライトしてくれる​仕組みです。​設定コードに​含まれているので、​初回起動時に​自動で​有効に​なります。

対応言語が​非常に​多く、​正規表現ベースの​従来の​ハイライトよりも​ずっと​正確です。​初期設定では​よく​使われる​言語の​パーサーを​指定していますが、vim.cmd("TSInstall all") で​全言語を​一括インストールする​ことも​できます。

ファイルピッカー:vim-fall

TODO: スクリーンショットまたは​GIFを​追加 —>

VSCodeのCtrl+Pと​同じ​感覚で​ファイルを​開ける​プラグインです。

操作方​法:

  1. Ctrl+Pを​押す
  2. ファイル名の​一部を​入力​(ファジー検索)
  3. Enterで​開く

これだけです。​Deno​(denops.vim)が​必要ですが、​動作が​軽快で​おすすめです。

代替プラグイン:

プラグイン特徴
telescope.nvim最も​有名で​情報が​多い。​困った​ときに​検索しやすい
ddu.vim日本人作者​(Shougo氏)。​高い​カスタマイズ性
nvim-deck日本人作者。​telescopeに​近い​使用感で​シンプルな​UI
mini.pick最小構成で​依存が​少ない。​Denoも​不要

ファイルエクスプローラー:vim-fern

TODO: スクリーンショットまたは​GIFを​追加 —>

VSCodeの​サイドバーに​ある​ファイルツリーの​イメージです。

操作方​法:

代替プラグイン:

プラグイン特徴
neo-tree.nvimLua製の​モダンな​ファイルエクスプローラー
oil.nvimバッファ自体が​ファイルエクスプローラーに​なる​ユニークな​UI

タブライン:bufferline.nvim

TODO: スクリーンショットを​追加 —>

複数ファイルを​開くと​画面上部に​ファイル名が​タブと​して​表示されます。​クリックでも​切り​替えられるので、​VSCodeの​タブバーと​同じ​感覚で​使えます。

代替プラグイン:

プラグイン特徴
barbar.nvimアニメーション付きの​タブバー
mini.tabline最小構成の​タブライン

Git操作:vim-gin

TODO: スクリーンショットまたは​GIFを​追加 —>

ターミナルでの​gitコマンドと​同じ​感覚で​使えるのが​vim-ginの​良い​ところです。

使い方​:

代替プラグイン:

プラグイン特徴
vim-fugitiveTim Pope作の​老舗Gitプラグイン。​Deno不要
neogitEmacsの​Magitに​インスパイアされた​Gitプラグイン

Git差分​表示:gitsigns.nvim

ファイルを​開くと​変更箇所の​左側に​カラーマークが​表示されます。​変更した​行、​追加した​行、​削除した​行が​ひと目で​分かります。

変更箇所の​差分プレビューや​blameの​確認も​できるので、​AIエージェントが​どこを​変更したかの​確認にも​使えます。

AIエージェント操作:nvim-aibo

TODO: スクリーンショットまたは​GIFを​追加 —>

lambdalisue/nvim-aiboは、​Neovimの​バッファを​使って​Claude Codeや​Codex CLIに​指示を​出せる​プラグインです。

ターミナルを​分割して​AIエージェントを​横に​並べ、​Neovimの​バッファに​プロンプトを​書いて​そのまま​送信できます。​コードを​読みながら​AIに​指示を​出すと​いう、​まさに​この​記事の​コンセプトに​ぴったりの​プラグインです。

おまけ

日本語入力​(SKK)​:skkeleton

vim-skk/skkeletonは、​Neovim上で​日本語を​スムーズに​入力できる​プラグインです。​日本人の​kuuoteさん作。​Denoが​必要です。

入力モードでCtrl+Jを​押すと​SKKが​有効に​なり、​ローマ字入力で​日本語が​打てるようになります。​普通の​IMEとは​少し​違う​操作感ですが、​慣れると​かなり​快適です。

マークダウンプレビュー

TODO: プラグイン名と​設定を​追加 —>

ブログや​ドキュメントを​書く​方には、​マークダウンプレビュー系の​プラグインも​おすすめです。

代替プラグインの​設定例

メインで​紹介した​プラグインの​代わりに​使える​プラグインの​設定例です。​使いたい​ものが​あれば、vim.pack.addに​プラグインを​追加し、​対応する​キーマッピングの​コメントを​外してください。

telescope.nvim​(ファイルピッカー)

最も​有名な​ファジーファインダー。​情報が​豊富で​困った​とき​検索しやすいです。

vim.pack.addに​以下を​追加:

12
"https://github.com/nvim-lua/plenary.nvim",
"https://github.com/nvim-telescope/telescope.nvim",

設定:

1234
require("telescope").setup({})
local builtin = require("telescope.builtin")
vim.keymap.set("n", "<C-p>", builtin.find_files, { desc = "ファイルピッカー (telescope)" })
vim.keymap.set("n", "<C-S-f>", builtin.live_grep, { desc = "グレップ検索 (telescope)" })
mini.pick​(ファイルピッカー)

最小構成で​依存が​少ない。​Denoも​不要です。

vim.pack.addに​以下を​追加:

1
"https://github.com/echasnovski/mini.pick",

設定:

12
require("mini.pick").setup({})
vim.keymap.set("n", "<C-p>", "<Cmd>Pick files<CR>", { desc = "ファイルピッカー (mini.pick)" })
neo-tree.nvim​(ファイルエクスプローラー)

Lua製の​モダンな​ファイルエクスプローラー。

vim.pack.addに​以下を​追加:

123
"https://github.com/nvim-lua/plenary.nvim",
"https://github.com/MunifTanjim/nui.nvim",
"https://github.com/nvim-neo-tree/neo-tree.nvim",

設定:

123
require("neo-tree").setup({})
vim.keymap.set("n", "<C-S-e>", "<Cmd>Neotree toggle<CR>", { desc = "ファイルエクスプローラー (neo-tree)" })
vim.keymap.set("n", "<C-b>", "<Cmd>Neotree toggle<CR>", { desc = "ファイルエクスプローラートグル (neo-tree)" })
oil.nvim​(ファイルエクスプローラー)

バッファ自体が​ファイルエクスプローラーに​なる​ユニークな​UI。

vim.pack.addに​以下を​追加:

1
"https://github.com/stevearc/oil.nvim",

設定:

12
require("oil").setup({})
vim.keymap.set("n", "-", "<Cmd>Oil<CR>", { desc = "ファイルエクスプローラー (oil.nvim)" })
vim-fugitive​(Git操作)

Tim Pope作の​老舗Gitプラグイン。​Deno不要。

vim.pack.addに​以下を​追加:

1
"https://github.com/tpope/vim-fugitive",

使い方​:

123
:Git status   → git status
:Git commit   → git commit
:Git log      → git log

おわりに

AIが​コードを​書く​時代に、​Neovimは​「書く​道具」だけでなく​「読む・確認する​道具」と​しての​価値が​増したと​感じています。

この​設定は​あくまで​スタート地点です。​使っていく​うちに​「ここを​もう​少し​こうしたい」が​出てきて、​自分​好みに​育てていく​楽しさが​あります。​それが​Vimの​醍醐味なんですよね。

まずはinit.luaを​コピーして、Ctrl+Pで​ファイルを​開く​ところから​試してみてください!!!!


Vim/Neovimに​興味を​持った方は、​ぜひ以下の​コミュニティも​覗いてみてください。