skills/neovim/SKILL.md
Comprehensive guide for this Neovim configuration - a modular, performance-optimized Lua-based IDE. Use when configuring plugins, adding keybindings, setting up LSP servers, debugging, or extending the configuration. Covers lazy.nvim, 82+ plugins across 9 categories, DAP debugging, AI integrations, and performance optimization.
npx skillsauth add julianobarbosa/claude-code-skills neovimInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
A comprehensive guide for working with this modular, performance-optimized Neovim configuration built on lazy.nvim.
| Metric | Value |
|--------|-------|
| Plugin Manager | lazy.nvim |
| Total Plugins | 82 |
| Target Startup | <50ms |
| Module Pattern | M.setup() |
| Leader Key | <Space> |
~/.config/nvim/
├── init.lua # Entry point
├── lua/
│ ├── config/ # Core configuration (11 modules)
│ │ ├── lazy.lua # Plugin manager bootstrap
│ │ ├── options.lua # Vim options
│ │ ├── keymaps.lua # Key bindings
│ │ ├── autocmds.lua # Autocommands
│ │ └── performance.lua # Startup optimization
│ ├── plugins/specs/ # Plugin specs (9 categories)
│ │ ├── core.lua # Foundation (plenary, nui, devicons)
│ │ ├── ui.lua # UI (lualine, bufferline, noice)
│ │ ├── editor.lua # Editor (autopairs, flash, harpoon)
│ │ ├── lsp.lua # LSP (lspconfig, mason, conform)
│ │ ├── git.lua # Git (fugitive, gitsigns, diffview)
│ │ ├── ai.lua # AI (copilot, ChatGPT)
│ │ ├── debug.lua # DAP (nvim-dap, dap-ui)
│ │ ├── tools.lua # Tools (telescope, neo-tree)
│ │ └── treesitter.lua # Syntax (treesitter, textobjects)
│ ├── kickstart/ # Kickstart-derived modules
│ └── utils/ # Utility functions
└── lazy-lock.json # Plugin version lock
All configuration modules follow the M.setup() pattern:
local M = {}
M.setup = function()
-- Configuration logic here
end
return M
Add to the appropriate category file in lua/plugins/specs/:
-- lua/plugins/specs/tools.lua
return {
-- Existing plugins...
{
"author/plugin-name",
event = "VeryLazy", -- Loading strategy
dependencies = { "dep/name" }, -- Required plugins
opts = {
-- Plugin options
},
config = function(_, opts)
require("plugin-name").setup(opts)
end,
},
}
| Strategy | When to Use | Example |
|----------|-------------|---------|
| lazy = true | Default, load on demand | Most plugins |
| event = "VeryLazy" | After UI loads | UI enhancements |
| event = "BufReadPre" | When opening files | Treesitter, gitsigns |
| event = "InsertEnter" | When typing | Completion, autopairs |
| cmd = "CommandName" | On command invocation | Heavy tools |
| ft = "filetype" | For specific filetypes | Language plugins |
| keys = {...} | On keypress | Motion plugins |
| Command | Description |
|---------|-------------|
| :Lazy | Open lazy.nvim dashboard |
| :Lazy sync | Update and install plugins |
| :Lazy profile | Show startup time analysis |
| :Lazy clean | Remove unused plugins |
| :Lazy health | Check plugin health |
See references/lsp.md for complete LSP reference.
mason.nvim (installer)
├── mason-lspconfig.nvim → nvim-lspconfig
├── mason-tool-installer.nvim (auto-install)
└── mason-nvim-dap.nvim → nvim-dap
nvim-lspconfig
├── blink.cmp (completion)
├── conform.nvim (formatting)
├── nvim-lint (linting)
└── trouble.nvim (diagnostics)
-- In lua/plugins/specs/lsp.lua, add to mason-tool-installer list:
ensure_installed = {
"lua_ls",
"pyright",
"your_new_server", -- Add here
}
-- Configure in lspconfig setup:
servers = {
your_new_server = {
settings = {
-- Server-specific settings
},
},
}
| Key | Action |
|-----|--------|
| gd | Go to definition |
| gr | Go to references |
| gI | Go to implementation |
| gD | Go to declaration |
| K | Hover documentation |
| <leader>rn | Rename symbol |
| <leader>ca | Code action |
| <leader>D | Type definition |
| <leader>ds | Document symbols |
| <leader>ws | Workspace symbols |
See references/keybindings.md for complete reference.
| Key | Action |
|-----|--------|
| <C-h/j/k/l> | Window navigation |
| <S-h> / <S-l> | Previous/next buffer |
| <leader>sf | Search files |
| <leader>sg | Search by grep |
| <leader><space> | Search buffers |
| \\ | Toggle Neo-tree |
-- In lua/config/keymaps.lua M.setup():
vim.keymap.set('n', '<leader>xx', function()
-- Your action
end, { desc = 'Description for which-key' })
-- Or in a plugin spec:
keys = {
{ "<leader>xx", "<cmd>Command<CR>", desc = "Description" },
}
See references/debugging.md for complete reference.
| Key | Action |
|-----|--------|
| <F5> | Continue/Start debugging |
| <F10> | Step over |
| <F11> | Step into |
| <F12> | Step out |
| <leader>b | Toggle breakpoint |
| <leader>B | Conditional breakpoint |
-- In lua/plugins/specs/debug.lua
local dap = require("dap")
dap.adapters.your_adapter = {
type = "executable",
command = "path/to/adapter",
}
dap.configurations.your_filetype = {
{
type = "your_adapter",
request = "launch",
name = "Launch",
program = "${file}",
},
}
| Layer | Technique | Savings |
|-------|-----------|---------|
| 1 | vim.loader.enable() | ~50ms |
| 2 | Skip vim._defaults | ~180ms |
| 3 | Disable providers | ~10ms |
| 4 | Disable builtins | ~20ms |
| 5 | Deferred config | ~30ms |
| 6 | Event-based loading | Variable |
:Lazy profile
-- In init.lua
vim.defer_fn(function()
require('config.options').setup()
require('config.keymaps').setup()
require('config.autocmds').setup()
end, 0)
-- In lua/config/autocmds.lua M.setup():
vim.api.nvim_create_autocmd("FileType", {
pattern = { "markdown", "text" },
callback = function()
vim.opt_local.wrap = true
vim.opt_local.spell = true
end,
})
-- In lua/config/options.lua M.setup():
vim.opt.your_option = value
-- In lua/utils/init.lua
local M = {}
M.your_function = function(args)
-- Implementation
end
return M
-- Usage: require('utils').your_function(args)
plenary.nvim, nui.nvim, nvim-web-devicons, lazy.nvim
tokyonight, alpha-nvim, lualine, bufferline, noice, nvim-notify, which-key, indent-blankline, mini.indentscope, fidget, nvim-scrollbar
nvim-autopairs, flash.nvim, clever-f, nvim-spectre, grug-far, harpoon, persistence, smartyank, vim-sleuth, vim-illuminate, tabular, todo-comments, toggleterm
nvim-lspconfig, mason, mason-lspconfig, mason-tool-installer, lazydev, luvit-meta, SchemaStore, conform, nvim-lint, trouble, blink.cmp/nvim-cmp, LuaSnip
vim-fugitive, vim-rhubarb, gitsigns, diffview, vim-flog, git-conflict, octo
copilot.vim, ChatGPT.nvim, mcphub.nvim
nvim-dap, nvim-dap-ui, nvim-dap-virtual-text, nvim-dap-python, nvim-dap-go, mason-nvim-dap, telescope-dap, nvim-nio
telescope, telescope-fzf-native, telescope-ui-select, neo-tree, oil.nvim, nvim-bqf, rest.nvim, vim-dadbod, vim-dadbod-ui, vim-dadbod-completion, iron.nvim, markdown-preview, nvim-puppeteer, obsidian.nvim
nvim-treesitter, nvim-treesitter-context, nvim-treesitter-textobjects
| Issue | Solution |
|-------|----------|
| Plugins not loading | :Lazy sync |
| LSP not starting | :LspInfo, :Mason |
| Icons missing | Install a Nerd Font |
| Slow startup | :Lazy profile |
| Treesitter errors | :TSUpdate |
| Keybinding conflicts | :verbose map <key> |
:checkhealth
-- Temporarily add to plugin config:
log_level = vim.log.levels.DEBUG,
:LspInfo shows nothing — open a new buffer of the same filetype or :edit to retrigger the autocommand.lazy-lock.json silently pins everything: :Lazy sync will not update plugins unless the lock entry is removed or :Lazy update is run explicitly. Sync only installs missing plugins and removes orphans.vim.defer_fn(..., 0) runs after UIEnter but before FileType: Config loaded this way misses the first buffer's filetype event. Move keymaps and options out of defer_fn if first-buffer integrations break.~/.local/share/nvim/mason/bin/, not $PATH: External tools that invoke formatters or linters from the shell will not find Mason-installed binaries unless you prepend that path explicitly.event = "VeryLazy" defers until after UI is ready: Plugins that intercept startup behavior (sessions, dashboards, colorschemes) must use lazy = false with priority = 1000 — VeryLazy is too late.:TSUpdate is mandatory or you will see "Impossible pattern" errors with no obvious cause.testing
Brief description of what this skill does. Include specific triggers - when should Claude use this skill? Example triggers, file types, or keywords that indicate this skill applies.
tools
Manage and troubleshoot PATH configuration in zsh. Use when adding tools to PATH (bun, nvm, Python venv, cargo, go), diagnosing "command not found" errors, validating PATH entries, or organizing shell configuration in .zshrc and .zshrc.local files.
tools
Zabbix monitoring system automation via API and Python. Use when: (1) Managing hosts, templates, items, triggers, or host groups, (2) Automating monitoring configuration, (3) Sending data via Zabbix trapper/sender, (4) Querying historical data or events, (5) Bulk operations on Zabbix objects, (6) Maintenance window management, (7) User/permission management
development
Operate YouTube Music via natural language. Search songs, artists, albums, playlists, lyrics, charts, recommendations, and control playback. Browse personal library, manage playlists, rate tracks, and inspect account info. Use this skill whenever the user asks about YouTube Music, wants to play music, manage playlists, search by song or artist name, inspect lyrics, or control playback.