Vim x Claude

1 min read

I've been playing with different AI-in-editor setups recently, and most of them are… a lot. Too much UI, too much autocomplete, too much noise.

So I ended up using something lighter: the Claude Code CLI + claudecode.nvim.

It brings Claude into Neovim as a floating terminal with real context awareness and native diff integration. Nothing fancy, nothing bloated. Just a fast way to send code out, get feedback, and apply changes.

Here's my setup if you want to try it.

  1. Install Claude Code CLI (skip if you already have this)
Bash
script.sh
npm install -g @anthropic-ai/claude-code
export ANTHROPIC_API_KEY="sk-your-key-here"
claude --version  # test it works
  1. Add the Neovim plugin

I use lazy.nvim, but any manager works. Requires Neovim 0.8.0+.

LUA
file.lua
require("lazy").setup({
  {
    "coder/claudecode.nvim",
    dependencies = { "folke/snacks.nvim" },
    config = true,
  }
})

That's it — no giant config blocks required unless you want them.

  1. Commands & Key Mappings

Main commands:

VIM
file.vim
:ClaudeCode              " Toggle Claude terminal
:ClaudeCodeFocus         " Focus Claude window
:ClaudeCodeSelectModel   " Select Claude model
:ClaudeCodeSend          " Send visual selection to Claude
:ClaudeCodeAdd <file>    " Add file to context (with optional line ranges)
:ClaudeCodeTreeAdd       " Add file from tree (nvim-tree, neo-tree, oil)
:ClaudeCodeDiffAccept    " Accept proposed changes
:ClaudeCodeDiffDeny      " Reject proposed changes

Recommended leader key mappings:

LUA
file.lua
vim.keymap.set("n", "<leader>ac", "<cmd>ClaudeCode<cr>", { desc = "Toggle Claude" })
vim.keymap.set("n", "<leader>af", "<cmd>ClaudeCodeFocus<cr>", { desc = "Focus Claude" })
vim.keymap.set("n", "<leader>ar", "<cmd>ClaudeCode --resume<cr>", { desc = "Resume Claude" })
vim.keymap.set("n", "<leader>aC", "<cmd>ClaudeCode --continue<cr>", { desc = "Continue Claude" })
vim.keymap.set("n", "<leader>am", "<cmd>ClaudeCodeSelectModel<cr>", { desc = "Select model" })
vim.keymap.set("n", "<leader>ab", "<cmd>ClaudeCodeAdd %<cr>", { desc = "Add current buffer" })
vim.keymap.set("v", "<leader>as", "<cmd>ClaudeCodeSend<cr>", { desc = "Send selection" })
vim.keymap.set("n", "<leader>as", "<cmd>ClaudeCodeTreeAdd<cr>", { desc = "Add from tree" })
vim.keymap.set("n", "<leader>aa", "<cmd>ClaudeCodeDiffAccept<cr>", { desc = "Accept diff" })
vim.keymap.set("n", "<leader>ad", "<cmd>ClaudeCodeDiffDeny<cr>", { desc = "Deny diff" })
  1. The workflow

Here's how I use it:

  1. Highlight code in visual mode
  2. Hit :ClaudeCodeSend to send it to Claude
  3. Ask: "Can you clean this up and add types?"
  4. Review the diff that appears
  5. :ClaudeCodeDiffAccept to apply or :ClaudeCodeDiffDeny to skip
  6. Keep moving

Subscribe to the newsletter

Get notified when I publish new posts. No spam, unsubscribe anytime.