by coder
🧩 Claude Code Neovim IDE Extension
# Add to your Claude Code skills
git clone https://github.com/coder/claudecode.nvimGuides for using ide extensions skills like claudecode.nvim.
Last scanned: 4/23/2026
{
"issues": [],
"status": "PASSED",
"scannedAt": "2026-04-23T06:07:21.514Z",
"semgrepRan": false,
"npmAuditRan": true,
"pipAuditRan": true
}claudecode.nvim is an open-source ide extensions skill for AI coding assistants such as Claude Code, Codex CLI, and ChatGPT, built by coder. 🧩 Claude Code Neovim IDE Extension. It has 2,922 GitHub stars.
Yes. claudecode.nvim passed SkillsLLM's automated security scan — a dependency vulnerability audit plus prompt-injection heuristics — with no high-severity issues. You can read the full report in the Security Report section on this page.
Clone the repository with "git clone https://github.com/coder/claudecode.nvim" and add it to your Claude Code skills directory (see the Installation section above).
claudecode.nvim is primarily written in Lua. It is open-source under coder on GitHub, so you can review or fork the full source.
Yes. SkillsLLM lists many other IDE Extensions skills you can browse and compare side by side. Open the IDE Extensions category from the badge at the top of this page, or use the Related Skills and comparison links further down to weigh claudecode.nvim against similar tools.
No comments yet. Be the first to share your thoughts!
Top skills in this category by stars
The first Neovim IDE integration for Claude Code — bringing Anthropic's AI coding assistant to your favorite editor with a pure Lua implementation.
🎯 TL;DR: When Anthropic released Claude Code with VS Code and JetBrains support, I reverse-engineered their extension and built this Neovim plugin. This plugin implements the same WebSocket-based MCP protocol, giving Neovim users the same AI-powered coding experience.
https://github.com/user-attachments/assets/9c310fb5-5a23-482b-bedc-e21ae457a82d
When Anthropic released Claude Code, they only supported VS Code and JetBrains. As a Neovim user, I wanted the same experience — so I reverse-engineered their extension and built this.
vim.loop and Neovim built-ins{
"coder/claudecode.nvim",
dependencies = { "folke/snacks.nvim" },
config = true,
-- `cmd` lets lazy.nvim create command stubs that load the plugin on first use,
-- so `:ClaudeCode` and friends work on a fresh start. Without it, a keys-only
-- spec defers loading until a <leader>a* mapping is pressed and the commands
-- would not exist yet.
cmd = {
"ClaudeCode",
"ClaudeCodeFocus",
"ClaudeCodeSelectModel",
"ClaudeCodeAdd",
"ClaudeCodeSend",
"ClaudeCodeTreeAdd",
"ClaudeCodeStatus",
"ClaudeCodeStart",
"ClaudeCodeStop",
"ClaudeCodeOpen",
"ClaudeCodeClose",
"ClaudeCodeDiffAccept",
"ClaudeCodeDiffDeny",
"ClaudeCodeCloseAllDiffs",
},
keys = {
{ "<leader>a", nil, desc = "AI/Claude Code" },
{ "<leader>ac", "<cmd>ClaudeCode<cr>", desc = "Toggle Claude" },
{ "<leader>af", "<cmd>ClaudeCodeFocus<cr>", desc = "Focus Claude" },
{ "<leader>ar", "<cmd>ClaudeCode --resume<cr>", desc = "Resume Claude" },
{ "<leader>aC", "<cmd>ClaudeCode --continue<cr>", desc = "Continue Claude" },
{ "<leader>am", "<cmd>ClaudeCodeSelectModel<cr>", desc = "Select Claude model" },
{ "<leader>ab", "<cmd>ClaudeCodeAdd %<cr>", desc = "Add current buffer" },
{ "<leader>as", "<cmd>ClaudeCodeSend<cr>", mode = "v", desc = "Send to Claude" },
{
"<leader>as",
"<cmd>ClaudeCodeTreeAdd<cr>",
desc = "Add file",
ft = { "NvimTree", "neo-tree", "oil", "minifiles", "netrw", "snacks_picker_list" },
},
-- Diff management
{ "<leader>aa", "<cmd>ClaudeCodeDiffAccept<cr>", desc = "Accept diff" },
{ "<leader>ad", "<cmd>ClaudeCodeDiffDeny<cr>", desc = "Deny diff" },
},
}
That's it! The plugin will auto-configure everything else.
Lazy-loading: with this spec the plugin loads on first use — when a listed
cmdis run or a mapped key is pressed — not at startup. Thecmdlist is what makes:ClaudeCode(and the other commands below) available before any keymap is pressed. If you would rather load the plugin eagerly at startup, setlazy = false(thecmd/keystriggers then become optional).
If you've used Claude Code's migrate-installer command to move to a local installation, you'll need to configure the plugin to use the local path.
Claude Code offers a claude migrate-installer command that:
~/.claude/local/Check your installation type:
# Check where claude command points
which claude
# Global installation shows: /usr/local/bin/claude (or similar)
# Local installation shows: alias to ~/.claude/local/claude
# Verify installation health
claude doctor
If you have a local installation, configure the plugin with the direct path:
{
"coder/claudecode.nvim",
dependencies = { "folke/snacks.nvim" },
opts = {
terminal_cmd = "~/.claude/local/claude", -- Point to local installation
},
config = true,
-- Also copy the `cmd = { ... }` list from the Installation section above so the
-- :ClaudeCode* commands load without having to press a key first.
keys = {
-- Your keymaps here
},
}
Claude Code also offers an experimental native binary installation method currently in alpha testing. This provides a single executable with no Node.js dependencies.
Install the native binary using one of these methods:
# Fresh install (recommended)
curl -fsSL claude.ai/install.sh | bash
# From existing Claude Code installation
claude install
The exact binary path depends on your shell integration. To find your installation:
# Check where claude command points
which claude
# Verify installation type and health
claude doctor
Configure the plugin with the detected path:
{
"coder/claudecode.nvim",
dependencies = { "folke/snacks.nvim" },
opts = {
terminal_cmd = "/path/to/your/claude", -- Use output from 'which claude'
},
config = true,
-- Also copy the `cmd = { ... }` list from the Installation section above so the
-- :ClaudeCode* commands load without having to press a key first.
keys = {
-- Your keymaps here
},
}
Note: If Claude Code was installed globally via npm, you can use the default configuration without specifying
terminal_cmd.
" Launch Claude Code in a split
:ClaudeCode
" Claude now sees your current file and selections in real-time!
" Send visual selection as context
:'<,'>ClaudeCodeSend
" Claude can open files, show diffs, and more
:ClaudeCode to open Claude in a split terminal<leader>as to send it to Claudenvim-tree/neo-tree/oil.nvim/mini.nvim, or a focused snacks picker list / the Snacks Explorer sidebar, press <leader>as on a file to add it to Claude's contextSnacks.picker.files()/grep()), which keep focus in the input box, bind a picker action that calls require("claudecode").send_at_mention(...) for the selected item(s) — the claude-fzf.nvim community extension does the equivalent for fzf-lua:ClaudeCode - Toggle the Claude Code terminal window:ClaudeCodeFocus - Smart focus/toggle Claude terminal:ClaudeCodeSelectModel - Select Claude model and open terminal with optional arguments:ClaudeCodeSend - Send current visual selection to Claude:ClaudeCodeSendText {text} - Send text to the open Claude terminal and submit it (! to insert without submitting; native/snacks providers only):ClaudeCodeAdd <file-path> [start-line] [end-line] - Add specific file to Claude context with optional line range:ClaudeCodeDiffAccept - Accept diff changes:ClaudeCodeDiffDeny - Reject diff changes:ClaudeCodeCloseAllDiffs - Close pending Claude diffs (leaves accepted/saved diffs intact):ClaudeCodeSendText {text} types {text} into the open Claude terminal and submits it — useful for scripting and keymaps. Use :ClaudeCodeSendText! to insert the text without submitting. The same is available programmatically:
local terminal = require("claudecode.terminal")
terminal.send_to_terminal("run the test suite") -- types + submits
terminal.send_to_terminal("draft prompt", { submit = false }) -- insert only
This writes directly to the terminal's job channel, so it only works with the in-editor providers (native/snacks). The external/none providers run Claude outside Neovim, where there is no pane to write to (a warning is logged).
When Claude proposes changes, the plugin opens a native Neovim diff view:
:w (save) or <leader>aa:q or <leader>adYou can edit Claude's suggestions before accepting them.
If a diff is resolved outside this Neovim (for example via Claude remote control on another device) the diff windows would otherwise stay open. They are now closed automatically when the Claude session that opened them disconnects. If you resolve diffs remotely while the session is still connected, run :ClaudeCodeCloseAllDiffs to clear the leftover pending proposals — it leaves any diff