
Neovim Debugging
- 1 installs
- 404 repo stars
- Updated August 5, 2026
- aiskillstore/marketplace
neovim-debugging is a Claude Code skill that systematically diagnoses Neovim and LazyVim configuration errors through hypothesis testing and headless inspection.
About
neovim-debugging is a Claude Code skill for diagnosing Neovim and LazyVim configuration problems. It forms hypotheses about a symptom (Lua errors, broken keymaps, plugins not loading, slow startup, UI issues) and tests them with headless nvim commands and file inspection before asking the user. A developer uses it when a Neovim config breaks and they want systematic root-cause analysis rather than trial and error.
- Diagnoses Neovim/LazyVim config problems by hypothesis testing, not checklists
- Uses headless nvim commands to gather info without user interaction
- Ships four reference docs: flowchart, error patterns, info gathering, plugin specifics
Neovim Debugging by the numbers
- 1 all-time installs (skills.sh)
- Ranked #489 of 596 Debugging skills by installs in the Skillselion catalog
- Data as of Aug 5, 2026 (Skillselion catalog sync)
neovim-debugging capabilities & compatibility
- Capabilities
- debugging · config diagnosis · error triage
- Use cases
- debugging
- IDEs
- neovim
- Pricing
- Free
What neovim-debugging says it does
Debug Neovim/LazyVim configuration issues. Use when: user reports Neovim errors, keymaps not working, plugins failing, or config problems.
Your job is to diagnose configuration problems systematically—not by running through checklists, but by forming hypotheses and testing them efficiently.
npx skills add https://github.com/aiskillstore/marketplace --skill neovim-debuggingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1 |
|---|---|
| repo stars | ★ 404 |
| Last updated | August 5, 2026 |
| Repository | aiskillstore/marketplace ↗ |
What it does
Diagnose why Neovim/LazyVim keymaps, plugins, or startup are broken and confirm the root cause.
Who is it for?
Neovim/LazyVim users whose keymaps, plugins, or startup broke and want root-cause diagnosis
Skip if: General Linux debugging or editors other than Neovim
When should I use this skill?
user reports Neovim errors, keymaps not working, plugins failing, or config problems
What you get
The root cause of a Neovim config problem is identified and the fix is verified against the symptom.
By the numbers
- 5-step detective debugging philosophy
- 5 problem-type diagnostic entry points
- 4 supporting reference docs
Files
Neovim/LazyVim Debugging Skill
You are an expert Neovim debugger. Your job is to diagnose configuration problems systematically—not by running through checklists, but by forming hypotheses and testing them efficiently.
Core Debugging Philosophy
Think Like a Detective
1. Observe symptoms → What exactly is the user experiencing? 2. Form hypotheses → What could cause this symptom? 3. Test the most likely hypothesis first → Use minimal, targeted tests 4. Narrow the scope → Binary search through possibilities 5. Confirm root cause → Verify the fix addresses the symptom
The Golden Rule
Before asking the user for more information, ask yourself: "Can I gather this programmatically using headless mode or file inspection?"
Only ask the user when you genuinely need interactive feedback (e.g., "Does the error appear when you do X?").
Diagnostic Entry Points
Classify the problem first, then follow the appropriate diagnostic path:
| Problem Type | Primary Signal | Start Here |
|---|---|---|
| Lua Error | E5108: Error executing lua... | error-patterns.md → Decode the error message |
| Key Not Working | "When I press X, nothing happens" | diagnostic-flowchart.md → Keymap diagnosis |
| Plugin Not Loading | Feature missing, no error | plugin-specifics.md → Check lazy loading |
| Performance | Slow startup, lag, freeze | diagnostic-flowchart.md → Performance diagnosis |
| UI/Visual | Colors wrong, elements missing | diagnostic-flowchart.md → UI diagnosis |
Quick Diagnostic Commands
Use these headless commands to gather information without user interaction:
# Check if a plugin is installed
nvim --headless -c "lua print(pcall(require, 'PLUGIN_NAME'))" -c "qa" 2>&1
# true = installed, false = not found
# Get a config value
nvim --headless -c "lua print(vim.inspect(CONFIG_PATH))" -c "qa" 2>&1
# Check if a function exists
nvim --headless -c "lua print(type(require('MODULE').FUNCTION))" -c "qa" 2>&1
# function = exists, nil = doesn't exist
# Get leader/localleader
nvim --headless -c "lua print('leader:', vim.g.mapleader, 'localleader:', vim.g.maplocalleader)" -c "qa" 2>&1
# Check LazyVim extras
cat ~/.config/nvim/lazyvim.json 2>/dev/null || echo "Not a LazyVim config"Decision Framework
<decision_tree>
1. Can I reproduce/verify this myself?
├─ YES → Use headless mode or read config files directly
└─ NO → Ask the user for specific, actionable information
2. Is the problem intermittent or consistent?
├─ Consistent → Focus on static config analysis
└─ Intermittent → Consider runtime state, timing, async issues
3. Did this work before?
├─ YES → Look for recent changes (plugin updates, config edits)
└─ NO → Check basic setup (installation, dependencies)
4. Is this isolated or widespread?
├─ Isolated (one plugin/key) → Focus on specific config
└─ Widespread → Check core config, leader settings, plugin manager
</decision_tree>Supporting Documents
| Document | When to Use |
|---|---|
| diagnostic-flowchart.md | Step-by-step diagnosis paths for each problem type |
| error-patterns.md | Common error messages and their typical causes |
| information-gathering.md | What to ask users and how to ask effectively |
| plugin-specifics.md | Plugin-specific debugging (which-key, LSP, telescope, etc.) |
Example Diagnosis Flow
<example> User says: "My localleader keymaps don't show in which-key"
Diagnostic thinking:
<analysis>
Symptom: which-key popup doesn't appear for localleader prefix
Hypotheses (ordered by likelihood):
1. localleader not triggering which-key (most common with LazyVim)
2. localleader mappings not registered
3. localleader itself not set correctly
4. which-key not installed/loaded
Test plan:
1. Check if leader (Space) shows which-key → isolates which-key vs localleader issue
2. Headless: verify localleader value
3. Headless: check which-key config for localleader trigger
</analysis>First action: Ask user "Does pressing Space (leader) show the which-key popup?"
- If YES → Problem is localleader-specific, check which-key trigger config
- If NO → which-key itself is broken, different diagnosis path
</example>
Anti-Patterns to Avoid
1. Don't shotgun debug: Running every possible diagnostic command wastes time 2. Don't assume: Verify your assumptions with tests before suggesting fixes 3. Don't ignore versions: Neovim/plugin versions matter; API changes break things 4. Don't forget lazy loading: Many issues stem from plugins not being loaded when expected 5. Don't skip reproduction: Confirm you understand the exact trigger before diagnosing
Output Format
When presenting findings, use this structure:
## Diagnosis
**Symptom**: [What the user reported]
**Root Cause**: [What's actually wrong]
**Evidence**: [How you determined this]
## Solution
[Step-by-step fix]
## Prevention
[How to avoid this in the future, if applicable]Diagnostic Flowcharts
This document provides step-by-step diagnostic paths for different problem categories. Each path is designed to narrow down the root cause efficiently.
---
1. Keymap Not Working
Initial Classification
User: "Key X doesn't work"
│
▼
┌─────────────────────────────────────┐
│ Is there an error message? │
├─────────────────────────────────────┤
│ YES → Go to error-patterns.md │
│ NO → Continue below │
└─────────────────────────────────────┘
│
▼
┌─────────────────────────────────────┐
│ Does the key work in vanilla Neovim?│
│ nvim -u NONE -c "echo 'test'" │
├─────────────────────────────────────┤
│ YES → Config/plugin issue │
│ NO → Terminal/system issue │
└─────────────────────────────────────┘Config/Plugin Path
Step 1: Is the mapping registered?
┌──────────────────────────────────────────────────────────┐
│ :map <the-key> │
│ :verbose map <the-key> (shows where it was defined) │
├──────────────────────────────────────────────────────────┤
│ Shows mapping → Mapping exists, execution problem │
│ No mapping → Mapping not created, registration problem │
└──────────────────────────────────────────────────────────┘
Step 2a: Mapping exists but doesn't execute
┌──────────────────────────────────────────────────────────┐
│ Possible causes: │
│ • Buffer-local mapping shadowed by global │
│ • Mode mismatch (nmap vs vmap vs imap) │
│ • which-key timeout/trigger issue │
│ • Conflicting mapping with higher priority │
├──────────────────────────────────────────────────────────┤
│ Test: :lua vim.keymap.set('n', '<the-key>', function() │
│ print('test') end) │
│ Then press the key - if 'test' prints, original mapping │
│ is being overwritten somewhere │
└──────────────────────────────────────────────────────────┘
Step 2b: Mapping not registered
┌──────────────────────────────────────────────────────────┐
│ Possible causes: │
│ • Plugin not loaded (lazy loading) │
│ • Config file not sourced │
│ • Conditional logic excluding this setup │
│ • Syntax error in config (silent failure) │
├──────────────────────────────────────────────────────────┤
│ Check: :Lazy → Is the plugin loaded? │
│ Check: :messages → Any errors during startup? │
│ Check: :scriptnames → Was the config file sourced? │
└──────────────────────────────────────────────────────────┘Leader/Localleader Specific Issues
Step 1: Verify the leader is set correctly
┌──────────────────────────────────────────────────────────┐
│ nvim --headless -c "lua print(vim.g.mapleader)" -c qa │
│ nvim --headless -c "lua print(vim.g.maplocalleader)" -c qa│
├──────────────────────────────────────────────────────────┤
│ Expected: " " (space) for leader, "\" for localleader │
│ Empty/nil → Leader not set, must be set BEFORE mappings │
└──────────────────────────────────────────────────────────┘
Step 2: Check mapping uses correct notation
┌──────────────────────────────────────────────────────────┐
│ In config: vim.keymap.set('n', '<leader>x', ...) │
│ vs │
│ vim.keymap.set('n', '<localleader>x', ...) │
├──────────────────────────────────────────────────────────┤
│ Note: <leader> and <localleader> are expanded at │
│ definition time, not execution time! │
└──────────────────────────────────────────────────────────┘
Step 3: which-key popup not showing for localleader
┌──────────────────────────────────────────────────────────┐
│ Common issue: which-key auto-triggers for Space but not │
│ for backslash │
├──────────────────────────────────────────────────────────┤
│ Test: :lua require('which-key').show('\\') │
│ If popup appears → Auto-trigger config issue │
│ If no popup → which-key registration issue │
├──────────────────────────────────────────────────────────┤
│ Fix: Add localleader to which-key triggers in config │
│ │
│ require('which-key').setup({ │
│ triggers = { │
│ { "<auto>", mode = "nxso" }, │
│ { "\\", mode = { "n", "v" } }, -- Add this! │
│ }, │
│ }) │
└──────────────────────────────────────────────────────────┘---
2. Plugin Not Loading
Step 1: Check if plugin is declared
┌──────────────────────────────────────────────────────────┐
│ :Lazy → Search for plugin name │
├──────────────────────────────────────────────────────────┤
│ Not listed → Plugin spec not added or has syntax error │
│ Listed as "not loaded" → Lazy loading conditions not met │
│ Listed as "loaded" → Plugin loaded, feature issue │
└──────────────────────────────────────────────────────────┘
Step 2: For "not loaded" plugins
┌──────────────────────────────────────────────────────────┐
│ Check lazy loading conditions in plugin spec: │
│ │
│ { │
│ "plugin/name", │
│ event = "VeryLazy", -- Loads after UI │
│ ft = "markdown", -- Loads for filetype │
│ cmd = "PluginCommand", -- Loads on command │
│ keys = { "<leader>p" }, -- Loads on keypress │
│ } │
├──────────────────────────────────────────────────────────┤
│ Force load for testing: :Lazy load plugin-name │
│ If plugin works after → Lazy loading condition problem │
│ If still broken → Plugin itself has issues │
└──────────────────────────────────────────────────────────┘
Step 3: For loaded but not working plugins
┌──────────────────────────────────────────────────────────┐
│ nvim --headless -c "lua print(require('plugin').setup)" │
│ -c "qa" 2>&1 │
├──────────────────────────────────────────────────────────┤
│ "function" → Setup function exists │
│ "nil" → Module doesn't export setup (API issue) │
├──────────────────────────────────────────────────────────┤
│ Check if your config calls setup(): │
│ grep -rn "require.*plugin.*setup" ~/.config/nvim/ │
└──────────────────────────────────────────────────────────┘---
3. Performance Issues
Startup Time Analysis
Step 1: Measure baseline
┌──────────────────────────────────────────────────────────┐
│ nvim --startuptime /tmp/startup.log +q │
│ tail -1 /tmp/startup.log # Total time │
├──────────────────────────────────────────────────────────┤
│ < 100ms → Fast (good) │
│ 100-300ms → Acceptable │
│ > 300ms → Slow, needs investigation │
│ > 1000ms → Very slow, likely plugin problem │
└──────────────────────────────────────────────────────────┘
Step 2: Identify slow components
┌──────────────────────────────────────────────────────────┐
│ Sort by time: │
│ sort -t: -k2 -n /tmp/startup.log | tail -20 │
├──────────────────────────────────────────────────────────┤
│ Look for: │
│ • Large require() times (plugin loading) │
│ • Long sourcing times (config files) │
│ • Repeated entries (multiple loads) │
└──────────────────────────────────────────────────────────┘
Step 3: Test with minimal config
┌──────────────────────────────────────────────────────────┐
│ nvim -u NONE --startuptime /tmp/minimal.log +q │
│ Compare with full config - difference is plugin overhead │
└──────────────────────────────────────────────────────────┘Runtime Performance
Step 1: Identify symptom
┌──────────────────────────────────────────────────────────┐
│ • Lag when typing → Completion/LSP issue │
│ • Lag when scrolling → Treesitter/syntax issue │
│ • Freeze on save → Format/lint issue │
│ • Periodic freezes → Async operation blocking │
└──────────────────────────────────────────────────────────┘
Step 2: Profile runtime
┌──────────────────────────────────────────────────────────┐
│ :profile start /tmp/profile.log │
│ :profile func * │
│ :profile file * │
│ [Do the action that causes lag] │
│ :profile stop │
│ :e /tmp/profile.log │
├──────────────────────────────────────────────────────────┤
│ Look for functions with high "Total" time │
└──────────────────────────────────────────────────────────┘---
4. UI/Visual Issues
Step 1: Terminal vs Neovim
┌──────────────────────────────────────────────────────────┐
│ echo $TERM # Should be xterm-256color or better │
│ nvim -c "echo &t_Co" -c "q" # Should be 256 or higher │
├──────────────────────────────────────────────────────────┤
│ Wrong colors often caused by: │
│ • TERM not set correctly │
│ • termguicolors not enabled │
│ • Colorscheme not installed/loaded │
└──────────────────────────────────────────────────────────┘
Step 2: Check termguicolors
┌──────────────────────────────────────────────────────────┐
│ nvim --headless -c "lua print(vim.o.termguicolors)" │
│ -c "qa" 2>&1 │
├──────────────────────────────────────────────────────────┤
│ true → 24-bit color enabled (good for modern terminals) │
│ false → Using terminal palette (may cause color issues) │
└──────────────────────────────────────────────────────────┘
Step 3: Missing UI elements
┌──────────────────────────────────────────────────────────┐
│ • No statusline → Check lualine/statusline plugin loaded │
│ • No icons → Font doesn't have Nerd Font glyphs │
│ • Broken borders → Unicode not rendering (font/terminal) │
│ • No highlights → Colorscheme not applied after plugins │
└──────────────────────────────────────────────────────────┘---
5. LSP Issues
Step 1: Check LSP server status
┌──────────────────────────────────────────────────────────┐
│ :LspInfo # Shows attached clients │
│ :LspLog # Shows LSP communication log │
│ :checkhealth lsp # Comprehensive LSP health check │
└──────────────────────────────────────────────────────────┘
Step 2: Server not attaching
┌──────────────────────────────────────────────────────────┐
│ Possible causes: │
│ • Server not installed (check :Mason) │
│ • Filetype not detected (:set ft?) │
│ • Root directory not found (no .git, package.json, etc.) │
│ • Server crashed on startup (check :LspLog) │
├──────────────────────────────────────────────────────────┤
│ Manual attach test: │
│ :lua vim.lsp.start({ name = "server", cmd = {"cmd"} }) │
└──────────────────────────────────────────────────────────┘
Step 3: Server attached but not working
┌──────────────────────────────────────────────────────────┐
│ • No completions → Check capabilities and nvim-cmp setup │
│ • No diagnostics → Server might need project config │
│ • Slow responses → Server overloaded or misconfigured │
├──────────────────────────────────────────────────────────┤
│ Debug: :lua print(vim.inspect(vim.lsp.get_clients())) │
└──────────────────────────────────────────────────────────┘---
6. After Plugin Update
Step 1: Identify what changed
┌──────────────────────────────────────────────────────────┐
│ Check lazy-lock.json for version changes: │
│ git diff ~/.config/nvim/lazy-lock.json │
├──────────────────────────────────────────────────────────┤
│ If tracked in git, you can see exact version changes │
└──────────────────────────────────────────────────────────┘
Step 2: Rollback test
┌──────────────────────────────────────────────────────────┐
│ :Lazy restore plugin-name # Restore to locked version │
│ Or manually edit lazy-lock.json with previous commit │
├──────────────────────────────────────────────────────────┤
│ If rollback fixes it → Plugin update introduced bug │
│ → Check plugin's GitHub Issues/Changelog │
└──────────────────────────────────────────────────────────┘
Step 3: Breaking change detection
┌──────────────────────────────────────────────────────────┐
│ Common breaking change patterns: │
│ • Function renamed or removed │
│ • Config option changed │
│ • Dependency added/removed │
│ • Default behavior changed │
├──────────────────────────────────────────────────────────┤
│ Check: Plugin's CHANGELOG.md, Releases page, commit msgs │
└──────────────────────────────────────────────────────────┘Error Patterns & Heuristics
This document maps common Neovim error messages to their typical causes and solutions. When you see an error, find the matching pattern and follow the diagnostic path.
---
How to Read Lua Error Messages
A typical Neovim Lua error looks like:
E5108: Error executing lua: /path/to/file.lua:42: attempt to index local 'opts' (a nil value)
stack traceback:
/path/to/file.lua:42: in function 'setup'
/path/to/other.lua:10: in main chunk| Component | Meaning |
|---|---|
E5108 | Neovim error code for Lua errors |
/path/to/file.lua:42 | File and line number where error occurred |
attempt to index local 'opts' | The operation that failed |
(a nil value) | The value that caused the failure |
stack traceback | Call chain leading to the error |
Pro tip: The stack traceback reads bottom-to-top. The bottom entry is where the call originated (often your config), the top is where it crashed (often plugin code).
---
Pattern Categories
1. Nil Access Errors
attempt to index (local/field/global) 'X' (a nil value)
What it means: Code tried to access X.something or X["something"] but X is nil.
Common causes:
| Pattern | Typical Cause | Diagnostic |
|---|---|---|
opts is nil | Function called without arguments | Check the caller—should pass {} at minimum |
config is nil | Plugin not configured | Ensure setup() was called before use |
M.something is nil | Module doesn't export this field | Check module's API (may have changed) |
client is nil | No LSP client attached | Check :LspInfo for this buffer |
Quick fix template:
-- Add defensive check
local value = opts and opts.field or default_value
-- Or ensure opts is never nil
function M.setup(opts)
opts = opts or {} -- Add this line
-- rest of function
end<example> Error: attempt to index local 'opts' (a nil value) in snacks/provider.lua:1098
Analysis:
- Snacks.nvim picker was called
- A function expected
optstable but received nil - Caller (probably another plugin or custom code) didn't pass options
Solution: 1. Find the caller in stack trace 2. Ensure it passes {} instead of nil/nothing 3. Or patch the receiving function: opts = opts or {} </example>
---
attempt to call (method/field) 'X' (a nil value)
What it means: Code tried to call X() or obj:X() but X is nil (function doesn't exist).
Common causes:
| Pattern | Typical Cause | Diagnostic |
|---|---|---|
| Plugin method nil | API changed in update | Check plugin changelog, compare with docs |
| require() returns nil | Module not found/failed to load | Check plugin installation |
| Object method nil | Wrong object type or not initialized | Verify object creation succeeded |
Diagnostic steps:
# Check if function exists
nvim --headless -c "lua print(type(require('MODULE').FUNCTION))" -c "qa" 2>&1
# Check module structure
nvim --headless -c "lua print(vim.inspect(require('MODULE')))" -c "qa" 2>&1---
2. Module Errors
module 'X' not found
Full error:
module 'telescope' not found:
no field package.preload['telescope']
no file './telescope.lua'
...Common causes:
| Cause | Diagnostic | Fix |
|---|---|---|
| Plugin not installed | :Lazy doesn't show plugin | Add to plugin specs |
| Plugin not loaded (lazy) | :Lazy shows "not loaded" | Trigger loading condition or :Lazy load X |
| Typo in module name | Check spelling | Common: nvim-tree vs nvim_tree |
| Wrong require path | Check plugin docs | Module path may differ from plugin name |
Lazy loading gotcha:
-- This fails if telescope not yet loaded:
local telescope = require('telescope') -- At top of file
-- This works:
vim.keymap.set('n', '<leader>ff', function()
require('telescope.builtin').find_files() -- Loaded on demand
end)---
loop or previous error loading module 'X'
What it means: Circular dependency—module A requires B which requires A.
Diagnostic:
-- Problematic pattern:
-- file_a.lua
local b = require('file_b')
-- file_b.lua
local a = require('file_a') -- Circular!Solutions: 1. Move shared code to a third module 2. Use lazy require (require inside function, not at top) 3. Restructure dependencies
---
3. Type Errors
bad argument #N to 'X' (Y expected, got Z)
What it means: Function X received wrong type at argument position N.
Common patterns:
bad argument #1 to 'nvim_buf_set_lines' (number expected, got nil)
→ Buffer handle is nil (buffer doesn't exist or wrong variable)
bad argument #2 to 'format' (string expected, got table)
→ Trying to use string.format with a table (missing serialization)
bad argument #1 to 'pairs' (table expected, got nil)
→ Iterating over nil (data not loaded or wrong variable)Quick diagnostic:
-- Before the failing call, add:
print(vim.inspect(suspicious_variable))
-- Or
assert(type(var) == "expected_type", "var was: " .. type(var))---
4. Vim API Errors
E5107: Error loading lua [...] Undefined variable
What it means: Vimscript variable referenced from Lua doesn't exist.
Examples:
Undefined variable: g:my_option
→ Use vim.g.my_option in Lua, but if never set, it's nil not "undefined"
Undefined variable: some_function
→ Calling Vimscript function wrong, use vim.fn.some_function()---
E523: Not allowed here
What it means: Tried to modify buffer/window in a context that doesn't allow it.
Common triggers:
- Modifying buffer in
TextChangedIautocmd while inserting - Changing windows in certain callback contexts
- Recursive autocommand triggers
Solution: Defer the action:
vim.schedule(function()
-- Do the modification here
end)---
E565: Not allowed to change text or change window
What it means: Similar to E523, blocked due to textlock.
Typical context: Completion popup is open, snippet is expanding
Solution: Use vim.schedule() or check vim.fn.mode() before action.
---
5. Plugin-Specific Patterns
LSP: client.server_capabilities is nil
Cause: LSP client not properly initialized or server crashed.
Diagnostic:
:LspInfo
:LspLog---
Treesitter: query: invalid node type at position X
Cause: Tree-sitter query uses node type that doesn't exist in grammar.
Common after: Language parser update changed node names.
Fix: Update queries or pin parser version.
---
Telescope: pickers.X is nil
Cause: Picker extension not loaded or doesn't exist.
Diagnostic:
:lua print(vim.inspect(require('telescope.builtin')))
:lua require('telescope').extensions.fzf -- Check extension---
6. Startup Errors
Errors at Neovim start that disappear on :messages
Cause: Error happens before UI is ready, message buffer clears.
Diagnostic:
# Capture all startup output
nvim 2>&1 | tee /tmp/nvim-startup.log
# Or use startuptime with verbose
nvim -V10/tmp/verbose.log --startuptime /tmp/startup.log +q---
E475: Invalid argument: 'X' during startup
Common causes:
- Invalid option name (typo or deprecated option)
- Option doesn't accept given value
- Setting option too early (before feature loaded)
Diagnostic:
:help 'X' " Check if option exists
:set X? " Check current value---
Error Analysis Framework
When you see an error, work through this framework:
<analysis>
1. WHAT failed?
- Extract the operation from error message
- What was it trying to do?
2. WHERE did it fail?
- File and line number from error
- Who called it? (check stack trace)
3. WHY did it fail?
- What value was unexpected?
- What state was wrong?
4. WHO is responsible?
- Plugin code? → Check for updates, issues
- User config? → Review recent changes
- Interaction? → Check plugin compatibility
5. WHEN does it happen?
- Always? → Static config issue
- Sometimes? → Race condition, async issue
- After update? → Breaking change
</analysis>---
Quick Reference: Error Code Meanings
| Code | Category | Common Cause |
|---|---|---|
| E5108 | Lua error | See patterns above |
| E5107 | Lua variable | Undefined vimscript var in Lua |
| E523 | Not allowed | Buffer modification blocked |
| E565 | Textlock | Change blocked during completion |
| E475 | Invalid argument | Wrong value for option |
| E492 | Not editor command | Typo in Ex command |
| E5113 | Lua string | Invalid UTF-8 or string operation |
Information Gathering Protocols
This document describes when and how to gather information from users, and when to gather it yourself programmatically.
---
The Golden Rule
Gather programmatically first, ask the user only when necessary.
Every question you ask the user costs time and requires them to know what you need. Before asking, try:
1. Headless commands - Run Neovim non-interactively to check state 2. File inspection - Read config files directly 3. Inference - Deduce from context (LazyVim? Plugin manager? Error message details?)
---
What You Can Gather Programmatically
System Information
# Neovim version
nvim --version | head -1
# Operating system
uname -a
# Terminal emulator (from env, not always reliable)
echo $TERM_PROGRAM $TERM
# Config directory
nvim --headless -c "lua print(vim.fn.stdpath('config'))" -c "qa" 2>&1Configuration State
# Check a plugin is installed
nvim --headless -c "lua print(pcall(require, 'telescope'))" -c "qa" 2>&1
# Get option value
nvim --headless -c "lua print(vim.o.tabstop)" -c "qa" 2>&1
# Get global variable
nvim --headless -c "lua print(vim.g.mapleader)" -c "qa" 2>&1
# Check mapping exists
nvim --headless -c "verbose map <leader>ff" -c "qa" 2>&1
# Get plugin config
nvim --headless -c "lua print(vim.inspect(require('telescope').extensions))" -c "qa" 2>&1File Contents
# LazyVim extras enabled
cat ~/.config/nvim/lazyvim.json 2>/dev/null
# Plugin specs
cat ~/.config/nvim/lua/plugins/*.lua
# Check for specific pattern in config
grep -rn "which-key" ~/.config/nvim/lua/
# Recent plugin updates
git -C ~/.local/share/nvim/lazy/plugin-name log --oneline -5Plugin State
# List loaded plugins (using lazy.nvim)
nvim --headless -c "lua for name, _ in pairs(require('lazy.core.config').plugins) do print(name) end" -c "qa" 2>&1
# Check plugin version
cat ~/.local/share/nvim/lazy/telescope.nvim/.git/HEAD
# Check lazy-lock versions
cat ~/.config/nvim/lazy-lock.json | jq '.["telescope.nvim"]'---
What Requires User Input
Interactive State (Cannot Be Reproduced Headlessly)
| Information Needed | Why Ask User |
|---|---|
| "What do you see when you press X?" | Runtime behavior with their full state |
| "Does the popup appear?" | Visual confirmation |
| "What's in your clipboard?" | System clipboard state |
| "Which terminal are you using?" | GUI vs TUI behavior differs |
Reproduction Steps
| Information Needed | Why Ask User |
|---|---|
| "What file were you editing?" | Filetype-specific issues |
| "What did you do right before the error?" | Sequence matters for race conditions |
| "Is this a new project or existing?" | LSP root detection varies |
Preference/Intent
| Information Needed | Why Ask User |
|---|---|
| "Do you want to keep this behavior?" | Understanding desired vs actual |
| "Which solution do you prefer?" | Multiple valid fixes exist |
---
How to Ask Effectively
Principle 1: Ask Specific, Closed Questions
❌ Bad: "Can you share your config?"
→ Too broad, wastes user time, produces noise
✅ Good: "What's the output of `:lua print(vim.g.maplocalleader)`?"
→ Specific command, specific answer expected
✅ Good: "Does pressing Space show the which-key popup?"
→ Yes/No answer that discriminates between hypothesesPrinciple 2: Explain Why You're Asking
❌ Bad: "Run this command and tell me the output."
→ User doesn't know why, may skip if seems tedious
✅ Good: "To check if the plugin is loading correctly, run `:Lazy` and
tell me if 'telescope' shows as 'loaded' or 'not loaded'."
→ User understands the diagnostic logicPrinciple 3: Provide Copy-Paste Commands
❌ Bad: "Check your leader key setting."
→ User may not know how
✅ Good: "Run this in Neovim and paste the result:
`:lua print('leader=' .. vim.inspect(vim.g.mapleader))`"
→ Ready to copy, exact format expectedPrinciple 4: Use Comparative Questions to Narrow Scope
"Does `<leader>` (Space) work with which-key but `<localleader>` (\\) doesn't?"
If YES → Problem isolated to localleader handling
If NO → which-key itself may be broken---
Question Templates by Problem Type
Error Messages
Please share:
1. The complete error message (including any "stack traceback" lines)
2. What action triggered the error
3. Whether this happens every time or intermittently
Copy the error by pressing `q` to dismiss, then `:messages` to see history.Key Not Working
Let me understand the issue:
1. When you press [KEY], what happens?
- Nothing at all
- Something different than expected
- Error message appears
2. Run `:map [KEY]` and share the output.
(If blank, the key isn't mapped)
3. Does pressing Space (leader) show the which-key popup?Plugin Not Working
Let's check the plugin status:
1. Run `:Lazy` and search for "[PLUGIN]"
- Is it listed?
- Does it show as "loaded" or "not loaded"?
2. Run `:checkhealth [plugin]` if available and share any warnings.LSP Issues
Let's check your LSP setup:
1. Open a file of the type that's having issues
2. Run `:LspInfo` and share the output
3. Run `:lua print(vim.bo.filetype)` to confirm the detected filetypePerformance Issues
Let's measure:
1. Run this and share the last line:
`nvim --startuptime /tmp/startup.log +q && tail -1 /tmp/startup.log`
2. Does the lag happen:
- During startup
- When typing
- When opening specific files
- When running specific commands---
Information Request Checklist
Before asking the user anything, verify:
- [ ] I cannot get this information via headless commands
- [ ] I cannot infer this from files I can read
- [ ] This information will actually help narrow down the cause
- [ ] I'm asking the minimum necessary to make progress
- [ ] My question is specific and actionable
- [ ] I've explained why I need this information
---
Common Mistakes
Over-Asking
❌ "Can you share:
- Your init.lua
- Your plugins folder
- Your lazy-lock.json
- Output of :Lazy
- Output of :checkhealth
- Your terminal and version
- ..."This overwhelms users. Instead, start with the minimum:
✅ "The error mentions 'telescope'. Let's verify it's installed:
Run `:Lazy` and tell me if telescope shows as 'loaded'."Asking Before Understanding
❌ User: "My config is broken"
You: "Can you share your config files?"First understand the symptom:
✅ User: "My config is broken"
You: "What specifically is broken? Error message, missing feature,
or unexpected behavior?"Asking for Things You Can Check
❌ "What's your Neovim version?"
(You can run: nvim --version | head -1)
❌ "Do you use LazyVim?"
(You can run: cat ~/.config/nvim/lazyvim.json)
❌ "What plugins do you have?"
(You can run: ls ~/.local/share/nvim/lazy/)---
Building a Diagnostic Picture
Structure your information gathering like an interview:
<gathering_strategy>
1. SYMPTOM: What exactly is the user experiencing?
→ Get specific, observable behavior
2. CONTEXT: Where does this happen?
→ Filetype, plugin, buffer, mode
3. HISTORY: Did this work before?
→ Yes → What changed? (Updates, config edits)
→ No → New setup, may be missing prerequisites
4. REPRODUCTION: Can you reliably trigger this?
→ Yes → Get exact steps
→ No → Intermittent issue, may need state analysis
5. ISOLATION: Does this happen in minimal config?
→ nvim -u NONE (no plugins)
→ nvim -u NORC (no user config)
→ Single plugin enabled
</gathering_strategy>Plugin-Specific Debugging
This document provides debugging knowledge for commonly problematic plugins and subsystems.
---
lazy.nvim (Plugin Manager)
Core Concepts
- Lazy loading: Plugins aren't loaded until triggered (event, command, keymap, filetype)
- Plugin spec: Table defining how/when to load a plugin
- lazy-lock.json: Pins exact commit hashes for reproducible installs
Common Issues
Plugin Not Loading
-- Check if lazy knows about it
:Lazy -- Search for plugin name
-- Force load for testing
:Lazy load plugin-name
-- Check why it's not loaded
:lua print(vim.inspect(require('lazy.core.config').plugins['plugin-name']))Lazy loading conditions:
{
"plugin/name",
event = "VeryLazy", -- After UI is ready
event = "BufReadPre", -- Before reading any buffer
ft = "lua", -- Only for Lua files
cmd = "PluginCmd", -- Only when command is run
keys = "<leader>x", -- Only when key is pressed
}Config vs Opts
-- opts: Merged with defaults, passed to setup()
opts = { feature = true }
-- config: Full control, replaces default setup
config = function(_, opts)
require('plugin').setup(opts) -- You must call setup yourself
endCommon mistake: Defining config but forgetting to call setup().
Dependencies Not Loaded
{
"main-plugin",
dependencies = {
"dep-plugin", -- Loaded before main-plugin
},
}Check dependency is listed and loaded first: :Lazy → check both plugins' state.
---
which-key.nvim
Core Concepts
- Triggers: Keys that activate which-key popup
- Mappings: Key descriptions shown in popup
- Groups: Nested key categories (e.g.,
<leader>ffor "file" operations)
Common Issues
Popup Not Appearing
-- Check which-key is loaded
:lua print(require('which-key'))
-- Manual trigger (always works if installed)
:lua require('which-key').show('<leader>')
:lua require('which-key').show('\\') -- localleaderIf manual works but automatic doesn't → trigger configuration issue.
Localleader Not Triggering Automatically
This is extremely common with LazyVim. By default, which-key auto-triggers for <leader> (Space) but not <localleader> (backslash).
-- Fix: Add to which-key setup
require('which-key').setup({
triggers = {
{ "<auto>", mode = "nxso" }, -- Default auto triggers
{ "\\", mode = { "n", "v" } }, -- Add localleader!
},
})For LazyVim, add this in lua/plugins/which-key.lua:
return {
"folke/which-key.nvim",
opts = {
triggers = {
{ "<auto>", mode = "nxso" },
{ "\\", mode = { "n", "v" } },
},
},
}Mappings Not Showing
-- Check mappings using Neovim's built-in commands
:nmap <leader> -- List all leader mappings
:verbose map <key> -- Show where a specific mapping was defined
-- Mappings are registered via:
-- 1. Via which-key.add() (v3) or register() (v2, deprecated)
-- 2. Via opts.spec in setup
-- 3. Via vim.keymap.set with desc option---
LSP (Language Server Protocol)
Core Concepts
- Server: External process providing intelligence (e.g.,
typescript-language-server) - Client: Neovim's connection to the server
- Capabilities: What features server/client support
- Root directory: Project root for the server (affects file discovery)
Common Issues
Server Not Attaching
:LspInfo " Shows attached clients for current buffer
:LspLog " Shows LSP communication log
:checkhealth lsp " Comprehensive checkCommon causes:
| Symptom | Likely Cause | Check |
|---|---|---|
| No clients | Server not installed | :Mason → is it installed? |
| No clients | Filetype not detected | :set ft? |
| No clients | No root found | Need .git, package.json, etc. |
| Client attached but no features | Capability mismatch | :lua print(vim.inspect(vim.lsp.get_clients()[1].server_capabilities)) |
Mason vs Manual Installation
-- Mason manages server binaries
:Mason -- Check installed servers
-- Manual: Server must be in PATH
:!which typescript-language-serverNo Completions
-- Check if client supports completion
:lua print(vim.lsp.get_clients()[1].server_capabilities.completionProvider)
-- Check nvim-cmp source is configured
:lua print(vim.inspect(require('cmp').get_config().sources))No Diagnostics
-- Check if diagnostics are enabled
:lua print(vim.diagnostic.is_enabled())
-- Check diagnostic count
:lua print(vim.inspect(vim.diagnostic.get(0)))
-- Some servers need project config (tsconfig.json, pyproject.toml)---
Treesitter
Core Concepts
- Parser: Generates syntax tree for a language
- Query: Pattern to match tree nodes (for highlights, folds, etc.)
- Highlight: Syntax highlighting via queries
Common Issues
No Syntax Highlighting
:TSInstallInfo " Check parser installation status
:InspectTree " View syntax tree for current bufferCommon causes:
| Symptom | Likely Cause | Check |
|---|---|---|
| No colors | Parser not installed | :TSInstall {lang} |
| Wrong colors | Parser outdated | :TSUpdate |
| Partial colors | Query error | Check :messages for query errors |
Parser Installation Failed
# Compilers required
# Linux: gcc/clang
# Mac: Xcode command line tools
# Windows: MSVC or MinGW
# Check compiler
:checkhealth nvim-treesitterQuery Errors After Update
query: invalid node type at position X for language YParser update changed node names. Solutions: 1. Update all plugins that use queries 2. Or pin treesitter parsers in lazy-lock.json
---
Telescope
Core Concepts
- Picker: UI for selecting items (files, buffers, etc.)
- Finder: Generates list of items
- Sorter: Orders results
- Extension: Additional pickers (fzf, file_browser, etc.)
Common Issues
Picker Not Found
-- List available pickers
:lua print(vim.inspect(vim.tbl_keys(require('telescope.builtin'))))
-- Check extension loaded
:lua print(require('telescope').extensions.fzf)Extension Not Working
-- Extensions must be loaded after setup
require('telescope').setup({})
require('telescope').load_extension('fzf')For lazy.nvim:
{
'nvim-telescope/telescope.nvim',
dependencies = {
'nvim-telescope/telescope-fzf-native.nvim',
build = 'make', -- Must compile native code
},
config = function()
require('telescope').setup({})
require('telescope').load_extension('fzf')
end,
}Slow Performance
-- Check if using native fzf sorter
:lua print(require('telescope').extensions.fzf)
-- Preview causing lag? Disable for testing:
:Telescope find_files previewer=false---
nvim-cmp (Completion)
Core Concepts
- Source: Where completions come from (LSP, buffer, path, snippets)
- Mapping: Keys to navigate/confirm completions
- Sorting: Priority and ordering of completions
Common Issues
No Completions Appearing
-- Check sources configured
:lua print(vim.inspect(require('cmp').get_config().sources))
-- Force completion manually
<C-Space> -- or whatever mapping you have
-- Check if completion is enabled
:lua print(require('cmp').visible())LSP Completions Missing
-- Verify LSP client attached
:LspInfo
-- Check LSP source is in cmp sources
:lua for _, s in ipairs(require('cmp').get_config().sources) do print(s.name) end
-- Should see 'nvim_lsp'Snippet Completions Not Expanding
-- Check snippet engine configured
:lua print(vim.inspect(require('cmp').get_config().snippet))
-- Verify LuaSnip (or your engine) is loaded
:lua print(require('luasnip'))---
Snacks.nvim (Folke's Utilities)
Common Issues
Picker Errors
attempt to index local 'opts' (a nil value)Cause: Another plugin/code calling snacks picker without passing options table.
Solution: Find the caller in stack trace, ensure it passes {} at minimum.
Dashboard Not Showing
-- Check if Snacks dashboard is enabled
:lua print(require('snacks').config.dashboard.enabled)
-- Force show
:lua require('snacks').dashboard()---
LazyVim Specifics
Understanding LazyVim Structure
~/.config/nvim/
├── init.lua # Bootstrap lazy.nvim
├── lazyvim.json # Enabled extras
└── lua/
├── config/
│ ├── autocmds.lua # User autocmds (extend LazyVim)
│ ├── keymaps.lua # User keymaps (extend LazyVim)
│ ├── lazy.lua # lazy.nvim setup
│ └── options.lua # User options (extend LazyVim)
└── plugins/
└── *.lua # User plugin specs (extend LazyVim)Extras
LazyVim extras add optional functionality. Enabled extras are in lazyvim.json:
{
"extras": [
"lazyvim.plugins.extras.lang.typescript",
"lazyvim.plugins.extras.editor.mini-files"
]
}To check what an extra provides:
cat ~/.local/share/nvim/lazy/LazyVim/lua/lazyvim/plugins/extras/lang/typescript.luaOverriding LazyVim Defaults
-- In lua/plugins/example.lua
-- Override opts (merged with defaults)
return {
"plugin/name",
opts = { your_option = true },
}
-- Full override (replaces LazyVim config)
return {
"plugin/name",
opts = function(_, opts)
opts.your_option = true
return opts
end,
}
-- Disable a LazyVim plugin
return {
"plugin/name",
enabled = false,
}Common LazyVim Issues
"I added a plugin but nothing happened"
Check you're using the right file path: lua/plugins/filename.lua (not plugin/)
"My keymaps are overwritten"
LazyVim loads after user config. Use vim.api.nvim_create_autocmd("User", { pattern = "LazyVimStarted", callback = ... }) for guaranteed last execution.
"Which extra provides X?"
grep -rn "the-feature" ~/.local/share/nvim/lazy/LazyVim/lua/lazyvim/plugins/extras/{
"schema_version": "2.0",
"meta": {
"generated_at": "2026-01-16T18:36:30.639Z",
"slug": "bityoungjae-neovim-debugging",
"source_url": "https://github.com/BitYoungjae/marketplace/tree/main/plugins/nvim-doctor/skills/neovim-debugging",
"source_ref": "main",
"model": "claude",
"analysis_version": "3.0.0",
"source_type": "community",
"content_hash": "38c44a5f8413db658cc98ef6d5991ffece9c440d21e95e779eff00bba6c127c9",
"tree_hash": "ea4d1c5b8021f4843cb582ff6da2dd133f589dda409161133772e19c24e3450b"
},
"skill": {
"name": "neovim-debugging",
"description": "Debug Neovim/LazyVim configuration issues. Use when: user reports Neovim errors, keymaps not working, plugins failing, or config problems. Provides systematic diagnosis through hypothesis testing, not just checklists. Think like a detective narrowing down possibilities.",
"summary": "Debug Neovim/LazyVim configuration issues. Use when: user reports Neovim errors, keymaps not working...",
"icon": "🔧",
"version": "1.0.0",
"author": "BitYoungjae",
"license": "MIT",
"category": "coding",
"tags": [
"neovim",
"debugging",
"lazyvim",
"configuration",
"troubleshooting"
],
"supported_tools": [
"claude",
"codex",
"claude-code"
],
"risk_factors": [
"scripts",
"external_commands",
"filesystem",
"network"
]
},
"security_audit": {
"risk_level": "safe",
"is_blocked": false,
"safe_to_publish": true,
"summary": "Pure documentation skill containing markdown files with Neovim debugging methodology and code examples. The static scanner flagged 336 patterns in markdown documentation as potential security issues, but all are false positives. The flagged patterns are code examples within markdown code fences (not executable backticks), references to Neovim config paths (not credential files), and diagnostic command examples (not network scanning tools). All tool usage is appropriate for diagnosing Neovim/LazyVim configuration issues.",
"risk_factor_evidence": [
{
"factor": "scripts",
"evidence": [
{
"file": "diagnostic-flowchart.md",
"line_start": 182,
"line_end": 182
},
{
"file": "error-patterns.md",
"line_start": 82,
"line_end": 145
},
{
"file": "SKILL.md",
"line_start": 1,
"line_end": 148
}
]
},
{
"factor": "external_commands",
"evidence": [
{
"file": "diagnostic-flowchart.md",
"line_start": 1,
"line_end": 290
},
{
"file": "error-patterns.md",
"line_start": 1,
"line_end": 295
},
{
"file": "information-gathering.md",
"line_start": 1,
"line_end": 298
},
{
"file": "plugin-specifics.md",
"line_start": 1,
"line_end": 448
}
]
},
{
"factor": "filesystem",
"evidence": [
{
"file": "diagnostic-flowchart.md",
"line_start": 154,
"line_end": 294
},
{
"file": "error-patterns.md",
"line_start": 268,
"line_end": 271
},
{
"file": "information-gathering.md",
"line_start": 60,
"line_end": 289
},
{
"file": "plugin-specifics.md",
"line_start": 378,
"line_end": 449
}
]
},
{
"factor": "network",
"evidence": [
{
"file": "skill-report.json",
"line_start": 6,
"line_end": 6
}
]
}
],
"critical_findings": [],
"high_findings": [],
"medium_findings": [],
"low_findings": [],
"dangerous_patterns": [],
"files_scanned": 6,
"total_lines": 1824,
"audit_model": "claude",
"audited_at": "2026-01-16T18:36:30.639Z"
},
"content": {
"user_title": "Debug Neovim configuration issues",
"value_statement": "Neovim configuration problems cause frustration and lost productivity. This skill provides systematic diagnosis through hypothesis testing to quickly identify root causes and restore functionality.",
"seo_keywords": [
"Neovim debugging",
"LazyVim troubleshooting",
"Neovim configuration",
"Neovim keymaps not working",
"Neovim plugin issues",
"Neovim LSP problems",
"Claude Code",
"Codex",
"Claude"
],
"actual_capabilities": [
"Diagnose Lua errors using pattern recognition and stack trace analysis",
"Test keymaps and leader key configurations programmatically",
"Verify plugin loading states and lazy loading conditions",
"Profile Neovim startup time and identify performance bottlenecks",
"Debug LSP server attachment and capability issues",
"Check Treesitter parser installation and query errors"
],
"limitations": [
"Cannot fix terminal emulator or system-level keyboard issues",
"Cannot recover corrupted plugin installations (requires manual fix)",
"Cannot diagnose GPU rendering issues that depend on specific hardware",
"Cannot access cloud or remote Neovim configurations"
],
"use_cases": [
{
"target_user": "New Neovim users",
"title": "Fix first-time setup issues",
"description": "Get up and running quickly when keymaps, plugins, or basic features are not working as expected."
},
{
"target_user": "LazyVim users",
"title": "Debug LazyVim-specific problems",
"description": "Resolve issues with LazyVim extras, plugin overrides, and the LazyVim-specific configuration structure."
},
{
"target_user": "Power users",
"title": "Diagnose complex LSP and performance issues",
"description": "Deep-dive into Language Server Protocol problems, startup time optimization, and plugin conflicts."
}
],
"prompt_templates": [
{
"title": "Basic error check",
"scenario": "Neovim shows an error",
"prompt": "My Neovim shows this error: [paste error message]. What is causing it and how do I fix it?"
},
{
"title": "Keymap diagnosis",
"scenario": "Key binding not working",
"prompt": "My [leader/localleader] keymap [key] is not working. Help me diagnose why and find a fix."
},
{
"title": "Plugin debugging",
"scenario": "Plugin not loading",
"prompt": "The [telescope/which-key/LSP] plugin is not working correctly. Check if it is installed and loaded, and identify the issue."
},
{
"title": "Performance analysis",
"scenario": "Neovim is slow",
"prompt": "Neovim starts slowly or lags during [typing/scrolling/saving]. Help me profile and fix the performance issue."
}
],
"output_examples": [
{
"input": "My Neovim shows 'attempt to index local opts (a nil value)' when I try to use telescope",
"output": [
"Root cause: Plugin calling function without passing options table",
"Diagnostic: The stack trace shows the caller is not passing opts",
"Fix: Either patch the receiving function to handle nil opts, or ensure caller passes {}",
"Prevention: Check plugin compatibility after updates"
]
},
{
"input": "My spacebar which-key popup is not showing any keymaps",
"output": [
"Root cause: Leader key not set before keymap definitions",
"Diagnostic: Check if vim.g.mapleader is nil when mappings are created",
"Fix: Move vim.g.mapleader = ' ' before any keymap definitions",
"Prevention: Always set leader in before section of config"
]
},
{
"input": "Neovim takes 3 seconds to start up",
"output": [
"Root cause: Lazy loading not properly configured on large plugin",
"Diagnostic: Profile shows plugin loading on VimEnter instead of on-demand",
"Fix: Add ft, event, or keys condition to plugin spec",
"Prevention: Use lazy-lock.json to track performance-impacting changes"
]
}
],
"best_practices": [
"Always use headless commands to verify state before asking the user for information",
"Form hypotheses and test the most likely one first rather than shotgun debugging",
"Check if the issue is new by reviewing recent plugin updates or config changes",
"Verify leader and localleader settings are set BEFORE keymap definitions"
],
"anti_patterns": [
"Asking users for information you can gather programmatically with headless commands",
"Running every possible diagnostic command instead of targeting the specific symptom",
"Assuming plugin APIs have not changed after updates",
"Skipping reproduction steps and guessing at the root cause"
],
"faq": [
{
"question": "What Neovim versions are supported?",
"answer": "Neovim 0.9+ recommended. Some features require 0.10+ for latest APIs."
},
{
"question": "What is the startup time detection limit?",
"answer": "Normal startup is under 300ms. Over 1000ms indicates a serious plugin issue."
},
{
"question": "How does this skill integrate with my config?",
"answer": "It reads your config files and runs headless diagnostic commands remotely."
},
{
"question": "Is my configuration data safe?",
"answer": "Yes. All reads stay within your Neovim config directory. No data leaves your machine."
},
{
"question": "Why is my keymap not showing in which-key?",
"answer": "Common causes: localleader not set, which-key trigger not configured, or plugin not loaded."
},
{
"question": "How is this different from checkhealth?",
"answer": "checkhealth finds known issues. This skill diagnoses user-specific configuration problems through interactive debugging."
}
]
},
"file_structure": [
{
"name": "diagnostic-flowchart.md",
"type": "file",
"path": "diagnostic-flowchart.md",
"lines": 319
},
{
"name": "error-patterns.md",
"type": "file",
"path": "error-patterns.md",
"lines": 334
},
{
"name": "information-gathering.md",
"type": "file",
"path": "information-gathering.md",
"lines": 320
},
{
"name": "plugin-specifics.md",
"type": "file",
"path": "plugin-specifics.md",
"lines": 451
},
{
"name": "SKILL.md",
"type": "file",
"path": "SKILL.md",
"lines": 148
}
]
}
Related skills
FAQ
What Neovim setups does it cover?
It targets Neovim and LazyVim configurations, including LazyVim extras read from lazyvim.json.
Does it need me to run commands manually?
It prefers headless nvim commands and file inspection, asking you only when it genuinely needs interactive feedback.