🚀 Codetyper.nvim
AI-powered coding partner for Neovim - Write code faster with LLM assistance while staying in control of your logic.
✨ Features
- 📐 Split View: Work with your code and prompts side by side
- 💬 Ask Panel: Chat interface for questions and explanations
- 🤖 Agent Mode: Autonomous coding agent with tool use (read, edit, write, bash)
- 🏷️ Tag-based Prompts: Use
/@and@/tags to write natural language prompts - ⚡ Transform Commands: Transform prompts inline without leaving your file
- 🔌 Multiple LLM Providers: Claude, OpenAI, Gemini, Copilot, and Ollama (local)
- 📋 Event-Driven Scheduler: Queue-based processing with optimistic execution
- 🎯 Tree-sitter Scope Resolution: Smart context extraction for functions/methods
- 🧠 Intent Detection: Understands complete, refactor, fix, add, document intents
- 📊 Confidence Scoring: Automatic escalation from local to remote LLMs
- 🛡️ Completion-Aware: Safe injection that doesn't fight with autocomplete
- 📁 Auto-Index: Automatically create coder companion files on file open
- 📜 Logs Panel: Real-time visibility into LLM requests and token usage
- 💰 Cost Tracking: Persistent LLM cost estimation with session and all-time stats
- 🔒 Git Integration: Automatically adds
.coder.*files to.gitignore - 🌳 Project Tree Logging: Maintains a
tree.logtracking your project structure - 🧠 Brain System: Knowledge graph that learns from your coding patterns
📚 Table of Contents
- Requirements
- Installation
- Quick Start
- Configuration
- LLM Providers
- Commands Reference
- Usage Guide
- Logs Panel
- Cost Tracking
- Agent Mode
- Keymaps
- Health Check
📋 Requirements
- Neovim >= 0.8.0
- curl (for API calls)
- One of: Claude API key, OpenAI API key, Gemini API key, GitHub Copilot, or Ollama running locally
Required Plugins
- plenary.nvim - Async utilities
- nvim-treesitter - Scope detection for functions/methods
Optional Plugins
- nvim-treesitter-textobjects - Better text object support
- nui.nvim - UI components
📦 Installation
Using lazy.nvim
{
"cargdev/codetyper.nvim",
dependencies = {
"nvim-lua/plenary.nvim", -- Required: async utilities
"nvim-treesitter/nvim-treesitter", -- Required: scope detection
"nvim-treesitter/nvim-treesitter-textobjects", -- Optional: text objects
"MunifTanjim/nui.nvim", -- Optional: UI components
},
cmd = { "Coder", "CoderOpen", "CoderToggle", "CoderAgent" },
keys = {
{ "<leader>co", "<cmd>Coder open<cr>", desc = "Coder: Open" },
{ "<leader>ct", "<cmd>Coder toggle<cr>", desc = "Coder: Toggle" },
{ "<leader>ca", "<cmd>CoderAgentToggle<cr>", desc = "Coder: Agent" },
},
config = function()
require("codetyper").setup({
llm = {
provider = "claude", -- or "openai", "gemini", "copilot", "ollama"
},
})
end,
}
Using packer.nvim
use {
"cargdev/codetyper.nvim",
config = function()
require("codetyper").setup()
end,
}
🚀 Quick Start
1. Open a file and start Coder:
:e src/utils.ts
:Coder open
2. Write a prompt in the coder file (left panel):
/@ Create a function to validate email addresses
using regex, return boolean @/
3. The LLM generates code and injects it into utils.ts (right panel)
⚙️ Configuration
require("codetyper").setup({
-- LLM Provider Configuration
llm = {
provider = "claude", -- "claude", "openai", "gemini", "copilot", or "ollama"
-- Claude (Anthropic) settings
claude = {
api_key = nil, -- Uses ANTHROPIC_API_KEY env var if nil
model = "claude-sonnet-4-20250514",
},
-- OpenAI settings
openai = {
api_key = nil, -- Uses OPENAI_API_KEY env var if nil
model = "gpt-4o",
endpoint = nil, -- Custom endpoint (Azure, OpenRouter, etc.)
},
-- Google Gemini settings
gemini = {
api_key = nil, -- Uses GEMINI_API_KEY env var if nil
model = "gemini-2.0-flash",
},
-- GitHub Copilot settings (uses copilot.lua/copilot.vim auth)
copilot = {
model = "gpt-4o",
},
-- Ollama (local) settings
ollama = {
host = "http://localhost:11434",
model = "deepseek-coder:6.7b",
},
},
-- Window Configuration
window = {
width = 25, -- Percentage of screen width (25 = 25%)
position = "left",
border = "rounded",
},
-- Prompt Tag Patterns
patterns = {
open_tag = "/@",
close_tag = "@/",
file_pattern = "*.coder.*",
},
-- Auto Features
auto_gitignore = true, -- Automatically add coder files to .gitignore
auto_open_ask = true, -- Auto-open Ask panel on startup
auto_index = false, -- Auto-create coder companion files on file open
-- Event-Driven Scheduler
scheduler = {
enabled = true, -- Enable event-driven prompt processing
ollama_scout = true, -- Use Ollama for first attempt (fast local)
escalation_threshold = 0.7, -- Below this confidence, escalate to remote
max_concurrent = 2, -- Max parallel workers
completion_delay_ms = 100, -- Delay injection after completion popup
apply_delay_ms = 5000, -- Wait before applying code (ms), allows review
},
})
Environment Variables
| Variable | Description |
|---|---|
ANTHROPIC_API_KEY |
Claude API key |
OPENAI_API_KEY |
OpenAI API key |
GEMINI_API_KEY |
Google Gemini API key |
Credentials Management
Instead of storing API keys in your config (which may be committed to git), you can use the credentials system:
:CoderAddApiKey
This command interactively prompts for:
- Provider selection (Claude, OpenAI, Gemini, Copilot, Ollama)
- API key (for cloud providers)
- Model name
- Custom endpoint (for OpenAI-compatible APIs)
Credentials are stored securely in ~/.local/share/nvim/codetyper/configuration.json (not in your config files).
Priority order for credentials:
- Stored credentials (via
:CoderAddApiKey) - Config file settings
- Environment variables
Other credential commands:
:CoderCredentials- View configured providers:CoderSwitchProvider- Switch between configured providers:CoderRemoveApiKey- Remove stored credentials
🔌 LLM Providers
Claude (Anthropic)
Best for complex reasoning and code generation.
llm = {
provider = "claude",
claude = { model = "claude-sonnet-4-20250514" },
}
OpenAI
Supports custom endpoints for Azure, OpenRouter, etc.
llm = {
provider = "openai",
openai = {
model = "gpt-4o",
endpoint = "https://api.openai.com/v1/chat/completions", -- optional
},
}
Google Gemini
Fast and capable.
llm = {
provider = "gemini",
gemini = { model = "gemini-2.0-flash" },
}
GitHub Copilot
Uses your existing Copilot subscription (requires copilot.lua or copilot.vim).
llm = {
provider = "copilot",
copilot = { model = "gpt-4o" },
}
Ollama (Local)
Run models locally with no API costs.
llm = {
provider = "ollama",
ollama = {
host = "http://localhost:11434",
model = "deepseek-coder:6.7b",
},
}
📝 Commands Reference
All commands can be invoked via :Coder {subcommand} or their dedicated command aliases.
Core Commands
| Command | Alias | Description |
|---|---|---|
:Coder open |
:CoderOpen |
Open the coder split view |
:Coder close |
:CoderClose |
Close the coder split view |
:Coder toggle |
:CoderToggle |
Toggle the coder split view |
:Coder process |
:CoderProcess |
Process the last prompt in coder file |
:Coder status |
- | Show plugin status and configuration |
:Coder focus |
- | Switch focus between coder and target windows |
:Coder reset |
- | Reset processed prompts to allow re-processing |
:Coder gitignore |
- | Force update .gitignore with coder patterns |
Ask Panel (Chat Interface)
| Command | Alias | Description |
|---|---|---|
:Coder ask |
:CoderAsk |
Open the Ask panel |
:Coder ask-toggle |
:CoderAskToggle |
Toggle the Ask panel |
:Coder ask-close |
- | Close the Ask panel |
:Coder ask-clear |
:CoderAskClear |
Clear chat history |
Agent Mode (Autonomous Coding)
| Command | Alias | Description |
|---|---|---|
:Coder agent |
:CoderAgent |
Open the Agent panel |
:Coder agent-toggle |
:CoderAgentToggle |
Toggle the Agent panel |
:Coder agent-close |
- | Close the Agent panel |
:Coder agent-stop |
:CoderAgentStop |
Stop the running agent |
Agentic Mode (IDE-like Multi-file Agent)
| Command | Alias | Description |
|---|---|---|
:Coder agentic-run <task> |
:CoderAgenticRun <task> |
Run an agentic task (multi-file changes) |
:Coder agentic-list |
:CoderAgenticList |
List available agents |
:Coder agentic-init |
:CoderAgenticInit |
Initialize .coder/agents/ and .coder/rules/ |
Transform Commands (Inline Tag Processing)
| Command | Alias | Description |
|---|---|---|
:Coder transform |
:CoderTransform |
Transform all /@ @/ tags in file |
:Coder transform-cursor |
:CoderTransformCursor |
Transform tag at cursor position |
| - | :CoderTransformVisual |
Transform selected tags (visual mode) |
Project & Index Commands
| Command | Alias | Description |
|---|---|---|
| - | :CoderIndex |
Open coder companion for current file |
:Coder index-project |
:CoderIndexProject |
Index the entire project |
:Coder index-status |
:CoderIndexStatus |
Show project index status |
Tree & Structure Commands
| Command | Alias | Description |
|---|---|---|
:Coder tree |
:CoderTree |
Refresh .coder/tree.log |
:Coder tree-view |
:CoderTreeView |
View .coder/tree.log in split |
Queue & Scheduler Commands
| Command | Alias | Description |
|---|---|---|
:Coder queue-status |
:CoderQueueStatus |
Show scheduler and queue status |
:Coder queue-process |
:CoderQueueProcess |
Manually trigger queue processing |
Processing Mode Commands
| Command | Alias | Description |
|---|---|---|
:Coder auto-toggle |
:CoderAutoToggle |
Toggle automatic/manual prompt processing |
:Coder auto-set <mode> |
:CoderAutoSet <mode> |
Set processing mode (auto/manual) |
Memory & Learning Commands
| Command | Alias | Description |
|---|---|---|
:Coder memories |
:CoderMemories |
Show learned memories |
:Coder forget [pattern] |
:CoderForget [pattern] |
Clear memories (optionally matching pattern) |
Brain Commands (Knowledge Graph)
| Command | Alias | Description |
|---|---|---|
| - | :CoderBrain [action] |
Brain management (stats/commit/flush/prune) |
| - | :CoderFeedback <type> |
Give feedback to brain (good/bad/stats) |
LLM Statistics & Feedback
| Command | Description |
|---|---|
:Coder llm-stats |
Show LLM provider accuracy statistics |
:Coder llm-feedback-good |
Report positive feedback on last response |
:Coder llm-feedback-bad |
Report negative feedback on last response |
:Coder llm-reset-stats |
Reset LLM accuracy statistics |
Cost Tracking
| Command | Alias | Description |
|---|---|---|
:Coder cost |
:CoderCost |
Show LLM cost estimation window |
:Coder cost-clear |
- | Clear session cost tracking |
Credentials Management
| Command | Alias | Description |
|---|---|---|
:Coder add-api-key |
:CoderAddApiKey |
Add or update LLM provider API key |
:Coder remove-api-key |
:CoderRemoveApiKey |
Remove LLM provider credentials |
:Coder credentials |
:CoderCredentials |
Show credentials status |
:Coder switch-provider |
:CoderSwitchProvider |
Switch active LLM provider |
UI Commands
| Command | Alias | Description |
|---|---|---|
:Coder type-toggle |
:CoderType |
Show Ask/Agent mode switcher |
:Coder logs-toggle |
:CoderLogs |
Toggle logs panel |
📖 Usage Guide
Tag-Based Prompts
Write prompts in your coder file using /@ and @/ tags:
/@ Create a Button component with the following props:
- variant: 'primary' | 'secondary' | 'danger'
- size: 'sm' | 'md' | 'lg'
- disabled: boolean
Use Tailwind CSS for styling @/
When you close the tag with @/, the prompt is automatically processed.
Transform Commands
Transform prompts inline without the split view:
// In your source file:
/@ Add input validation for email and password @/
// Run :CoderTransformCursor to transform the prompt at cursor
Prompt Types
The plugin auto-detects prompt type:
| Keywords | Type | Behavior |
|---|---|---|
complete, finish, implement, todo |
Complete | Completes function body (replaces scope) |
refactor, rewrite, simplify |
Refactor | Replaces code |
fix, debug, bug, error |
Fix | Fixes bugs (replaces scope) |
add, create, generate |
Add | Inserts new code |
document, comment, jsdoc |
Document | Adds documentation |
optimize, performance, faster |
Optimize | Optimizes code (replaces scope) |
explain, what, how |
Explain | Shows explanation only |
Function Completion
When you write a prompt inside a function body, the plugin uses Tree-sitter to detect the enclosing scope and automatically switches to "complete" mode:
function getUserById(id: number): User | null {
/@ return the user from the database by id, handle not found case @/
}
The LLM will complete the function body while keeping the exact same signature. The entire function scope is replaced with the completed version.
📊 Logs Panel
The logs panel provides real-time visibility into LLM operations:
Features
- Generation Logs: Shows all LLM requests, responses, and token usage
- Queue Display: Shows pending and processing prompts
- Full Response View: Complete LLM responses are logged for debugging
- Auto-cleanup: Logs panel and queue windows automatically close when exiting Neovim
Opening the Logs Panel
:CoderLogs
The logs panel opens automatically when processing prompts with the scheduler enabled.
Keymaps
| Key | Description |
|---|---|
q |
Close logs panel |
<Esc> |
Close logs panel |
💰 Cost Tracking
Track your LLM API costs across sessions with the Cost Estimation window.
Features
- Session Tracking: Monitor current session token usage and costs
- All-Time Tracking: Persistent cost history stored per-project in
.coder/cost_history.json - Model Breakdown: See costs by individual model
- Pricing Database: Built-in pricing for 50+ models (GPT, Claude, Gemini, O-series, etc.)
Opening the Cost Window
:CoderCost
Cost Window Keymaps
| Key | Description |
|---|---|
q / <Esc> |
Close window |
r |
Refresh display |
c |
Clear session costs |
C |
Clear all history |
Supported Models
The cost tracker includes pricing for:
- OpenAI: GPT-4, GPT-4o, GPT-4o-mini, O1, O3, O4-mini, and more
- Anthropic: Claude 3 Opus, Sonnet, Haiku, Claude 3.5 Sonnet/Haiku
- Local: Ollama models (free, but usage tracked)
- Copilot: Usage tracked (included in subscription)
🤖 Agent Mode
The Agent mode provides an autonomous coding assistant with tool access:
Available Tools
- read_file: Read file contents
- edit_file: Edit files with find/replace
- write_file: Create or overwrite files
- bash: Execute shell commands
Using Agent Mode
- Open the agent panel:
:CoderAgentor<leader>ca - Describe what you want to accomplish
- The agent will use tools to complete the task
- Review changes before they're applied
Agent Keymaps
| Key | Description |
|---|---|
<CR> |
Submit message |
Ctrl+c |
Stop agent execution |
q |
Close agent panel |
⌨️ Keymaps
Default Keymaps (auto-configured)
| Key | Mode | Description |
|---|---|---|
<leader>ctt |
Normal | Transform tag at cursor |
<leader>ctt |
Visual | Transform selected tags |
<leader>ctT |
Normal | Transform all tags in file |
<leader>ca |
Normal | Toggle Agent panel |
<leader>ci |
Normal | Open coder companion (index) |
Ask Panel Keymaps
| Key | Description |
|---|---|
@ |
Attach/reference a file |
Ctrl+Enter |
Submit question |
Ctrl+n |
Start new chat |
Ctrl+f |
Add current file as context |
q |
Close panel |
Y |
Copy last response |
Suggested Additional Keymaps
local map = vim.keymap.set
map("n", "<leader>co", "<cmd>Coder open<cr>", { desc = "Coder: Open" })
map("n", "<leader>cc", "<cmd>Coder close<cr>", { desc = "Coder: Close" })
map("n", "<leader>ct", "<cmd>Coder toggle<cr>", { desc = "Coder: Toggle" })
map("n", "<leader>cp", "<cmd>Coder process<cr>", { desc = "Coder: Process" })
map("n", "<leader>cs", "<cmd>Coder status<cr>", { desc = "Coder: Status" })
🏥 Health Check
Verify your setup:
:checkhealth codetyper
This checks:
- Neovim version
- curl availability
- LLM configuration
- API key status
- Telescope availability (optional)
📁 File Structure
your-project/
├── .coder/ # Auto-created, gitignored
│ └── tree.log # Project structure log
├── src/
│ ├── index.ts # Your source file
│ ├── index.coder.ts # Coder file (gitignored)
└── .gitignore # Auto-updated with coder patterns
🤝 Contributing
Contributions are welcome! Please see CONTRIBUTING.md for guidelines.
📄 License
MIT License - see LICENSE for details.
👨💻 Author
cargdev
- Website: cargdev.io
- Blog: blog.cargdev.io
- Email: carlos.gutierrez@carg.dev
Made with ❤️ for the Neovim community