NeoVimにClaude Code Neovim IDE Extensionをインストールする
管理者·
概要
VSCode拡張と同じWebSocket MCPプロトコルを実装したNeovimプラグインをnixで導入する方法について。
Claude Code Neovim IDE Extension (coder/claudecode.nvim) を利用します。こちらはPure Luaで依存ゼロのプラグインになります。 snacks.nvim があるとターミナルUIが強化される。
Nix
claude.nixの中身は以下
{
config,
pkgs,
lib,
...
}: {
programs.neovim = {
plugins = [
{
plugin = pkgs.vimUtils.buildVimPlugin {
name = "claudecode-nvim";
src = pkgs.fetchFromGitHub {
"owner" = "coder";
"repo" = "claudecode.nvim";
"rev" = "432121f0f5b9bda041030d1e9e83b7ba3a93dd8f";
"hash" = "sha256-XXXXXXXXXXXXXXXXXXXXXXXXXXX";
};
};
type = "lua";
config = ''
require("claudecode").setup({
-- -----------------------------------------------------------------
-- Server
-- -----------------------------------------------------------------
port_range = { min = 10000, max = 65535 },
auto_start = true, -- Neovim起動時にWebSocketサーバーを自動開始
log_level = "info", -- "trace"|"debug"|"info"|"warn"|"error"
-- claude CLIのパス(nixpkgsにない場合はフルパスを指定)
-- terminal_cmd = vim.fn.expand("~/.claude/local/claude"),
terminal_cmd = nil, -- nilのとき PATH上の "claude" を使用
-- -----------------------------------------------------------------
-- 挙動
-- -----------------------------------------------------------------
focus_after_send = true, -- 送信後にClaudeターミナルにフォーカス
track_selection = true, -- ビジュアル選択をClaudeに自動追跡
visual_demotion_delay_ms = 50,
-- -----------------------------------------------------------------
-- ターミナルウィンドウ
-- -----------------------------------------------------------------
terminal = {
split_side = "right", -- "left" | "right"
split_width_percentage = 0.38, -- 画面幅の38%
provider = "native", -- snacks.nvimがない環境ではnativeが安定
auto_close = true, -- Claude終了時にウィンドウを閉じる
},
})
-- -----------------------------------------------------------------
-- キーマップ(<leader>a プレフィックスで統一)
-- -----------------------------------------------------------------
local map = vim.keymap.set
local o = { noremap = true, silent = true }
-- 起動・フォーカス
map("n", "<leader>ac", "<cmd>ClaudeCode<cr>", vim.tbl_extend("force", o, { desc = "Toggle Claude" }))
map("n", "<leader>af", "<cmd>ClaudeCodeFocus<cr>", vim.tbl_extend("force", o, { desc = "Focus Claude" }))
-- セッション継続
map("n", "<leader>ar", "<cmd>ClaudeCode --resume<cr>", vim.tbl_extend("force", o, { desc = "Resume Claude" }))
map("n", "<leader>aC", "<cmd>ClaudeCode --continue<cr>", vim.tbl_extend("force", o, { desc = "Continue Claude" }))
-- コンテキスト追加
map("n", "<leader>ab", "<cmd>ClaudeCodeAdd %<cr>", vim.tbl_extend("force", o, { desc = "Add current buffer" }))
map("v", "<leader>as", "<cmd>ClaudeCodeSend<cr>", vim.tbl_extend("force", o, { desc = "Send selection" }))
-- nvim-tree上でファイルをClaudeに追加
map("n", "<leader>as", "<cmd>ClaudeCodeTreeAdd<cr>", vim.tbl_extend("force", o, { desc = "Add file (nvim-tree)" }))
-- モデル選択・ステータス確認
map("n", "<leader>am", "<cmd>ClaudeCodeSelectModel<cr>", vim.tbl_extend("force", o, { desc = "Select model" }))
map("n", "<leader>aS", "<cmd>ClaudeCodeStatus<cr>", vim.tbl_extend("force", o, { desc = "Claude status" }))
-- diff操作(Claudeがファイル変更を提案したとき)
-- :w → 変更を承認 / da → 承認(専用)
-- :q → 変更を却下 / dq → 却下(専用)
'';
}
];
};
}
初回のみ以下のコマンドでhash値を取得する
nix-shell -p nix-prefetch-github --run "nix-prefetch-github coder claudecode.nvim"
呼び出し側
imports = [
./claude.nix
];
シェア: