โโโโ โโโโโโโโโโโ โโโโโโโ โโโโโโโโโโโโโโโ
โโโโโ โโโโโโโโโโโโโโโโโโโโ โโโโโโโโโโโโโโโโ
โโโโโโ โโโโโโโโโ โโโ โโโ โโโโโโ โโโ โโโ
โโโโโโโโโโโโโโโโ โโโ โโโ โโโโโโ โโโ โโโ
โโโ โโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโโ
โโโ โโโโโโโโโโโโโ โโโโโโโ โโโโโโโโโโโโโโโโโโ
Note
EdHeltzel's Neovim Configuration
My personal Neovim configuration, based on LazyVim - optimized for web development and used as my ADE (AI/Agent Development Environment) of choice.
- LazyVim Foundation: Built on LazyVim for a solid, well-maintained base
- AI Integration: opencode and Claude Code with Codeium and Supermaven for text completion
- Multi-Language: JavaScript/TypeScript, Go, Python, PHP/WordPress, Rust, and more
- Hybrid Formatting: Biome-first with Prettier fallback
- Custom Theme: Eldritch colorscheme with custom lualine statusline
- Quick Start
- Architecture
- Plugin Categories
- Keybindings Reference
- Language Support
- Configuration Guide
- Workflows
- Neovim >= 0.10.0
- Git
- A Nerd Font (for icons)
- Node.js (for LSP servers)
- Ripgrep (for search)
This configuration is part of my Dotfiles repo managed with GNU Stow:
# Clone the dotfiles repository
git clone https://github.com/edheltzel/dotfiles ~/.dotfiles
# Stow the nvim package
cd ~/.dotfiles
make stow pkg=nvim
# Or manually
stow -v nvim- Open Neovim:
nvim - Lazy.nvim will automatically install all plugins
- Run
:Masonto install LSP servers and formatters - Run
:LazyExtrasto enable additional language packs
lua/
โโโ config/ # Core configuration
โ โโโ lazy.lua # Plugin manager bootstrap
โ โโโ options.lua # Vim options
โ โโโ keymaps.lua # Custom keybindings
โ โโโ autocmds.lua # Autocommands
โ โโโ filetypes.lua # Custom filetype associations
โ
โโโ plugins/ # Plugin configurations
โโโ disabled.lua # Disabled plugins (neo-tree)
โ
โโโ ai/ # AI assistants
โ โโโ claudecode.lua
โ โโโ opencode.lua
โ โโโ windsurf.lua
โ
โโโ coding/ # Code editing
โ โโโ emmet.lua
โ โโโ surround.lua
โ
โโโ editor/ # Editor enhancements
โ โโโ git.lua
โ โโโ ghostty.lua
โ โโโ multicursor.lua
โ
โโโ formatting/ # Code formatters
โ โโโ prettier.lua
โ
โโโ linting/ # Linters
โ โโโ biome.lua
โ
โโโ languages/ # Language-specific configs
โ โโโ go.lua
โ โโโ python.lua
โ โโโ typescript.lua
โ โโโ php.lua # PHP/WordPress (phpactor)
โ โโโ astro.lua
โ โโโ docker.lua
โ โโโ jinja.lua
โ โโโ mdx.lua
โ โโโ tailwind.lua
โ โโโ ghostty.lua
โ
โโโ ui/ # UI customization
โ โโโ colorscheme.lua
โ โโโ eldritch.lua
โ โโโ lualine.lua
โ โโโ treesitter-context.lua
โ โโโ lualine/
โ โโโ neoed.lua # Theme adapter
โ โโโ eldritch.lua # Eldritch theme
โ โโโ rose-pine.lua # Rose Pine theme
โ
โโโ utils/ # Utilities
โโโ snacks.lua
init.lua- Entry point, loadsconfig.lazyconfig/lazy.lua- Bootstraps lazy.nvim, loads filetypes- LazyVim base plugins load
- Custom plugin specs load (in directory import order)
config/options.lua- Vim optionsconfig/keymaps.lua- Keybindings (VeryLazy)config/autocmds.lua- Autocommands (VeryLazy)
| Plugin | Description | Key Binding |
|---|---|---|
| opencode.nvim | opencode integration | <C-A-S-o> |
| claudecode.nvim | Claude Code integration | <C-A-S-c> |
| codeium | AI code completion | (via LazyExtras) |
| supermaven | AI code completion | (via LazyExtras) |
opencode Configuration (lua/plugins/ai/opencode.lua):
- Floating window (80% width/height)
- Rounded border
YOLOordangerously-skip-permissionsis enabled by default with opencod
Claude Code Configuration (lua/plugins/ai/claudecode.lua):
- Floating window (80% width/height)
- Rounded border
--dangerously-skip-permissionsmode enabled
| Plugin | Description | Key Bindings |
|---|---|---|
| multicursor.nvim | Multiple cursors | <C-S-l>, <C-A-down/up> |
| gitsigns.nvim | Git integration | Current line blame enabled |
| flash.nvim | Motion plugin | <leader>jj |
Formatter Priority (from lua/plugins/formatting/prettier.lua):
- Biome (primary for JS/TS/JSON/CSS)
- Prettier (fallback for Biome-supported, primary for HTML/MD)
- yamlfmt (YAML files)
| Component | Plugin | Configuration |
|---|---|---|
| Colorscheme | eldritch.nvim | Dark theme with dim inactive |
| Statusline | lualine.nvim | Custom NEO.ED theme |
| File Explorer | snacks.explorer | Right sidebar, hidden files |
| Picker | snacks.picker | Default layout |
| Dashboard | snacks.dashboard | Custom NEO.ED header |
| Terminal | snacks.terminal | Borderless float |
See CHEATSHEET.md for the complete keybindings reference.
From lazyvim.json:
AI:
ai.claudecode- Claude Code integrationai.codeium- AI completion
Coding:
coding.mini-surround- Surround text objectsdap.core- Debug adapter protocol
Editor:
editor.harpoon2- Quick file navigationeditor.mini-files- File browsereditor.snacks_explorer- Snacks file explorereditor.snacks_picker- Snacks picker
Formatting:
formatting.biome- Biome formatter/linter
Languages:
lang.angular- Angularlang.astro- Astrolang.docker- Docker/Composelang.elixir- Elixirlang.go- Golang.helm- Helm chartslang.json- JSONlang.markdown- Markdownlang.php- PHPlang.python- Pythonlang.rust- Rustlang.svelte- Sveltelang.tailwind- Tailwind CSSlang.terraform- Terraformlang.toml- TOMLlang.typescript- TypeScriptlang.vue- Vuelang.yaml- YAML
Utilities:
util.dot- Dotfile supportutil.mini-hipatterns- Pattern highlighting
LSP: gopls with enhanced settings
- gofumpt formatting
- Inlay hints (parameters, types, values)
- Static analysis (nilness, unused params/writes)
- Semantic tokens
Testing: neotest-golang
LSP: Pyright + Ruff
- Pyright for type checking
- Ruff for linting (replaces ESLint behavior)
DAP: debugpy integration
Virtual Environments: venv-selector.nvim
LSP: vtsls (not tsserver)
- Complete function calls
- Auto-update imports on file move
- Inlay hints
- Move to file refactoring
DAP: js-debug-adapter
Custom Icons: eslintrc, package.json, tsconfig, etc.
LSP: phpactor
- Blade template support
- WordPress development optimized
- Diagnostics disabled (no "function not found" errors)
Formatter: phpcbf with WordPress coding standards
DAP: php-debug-adapter
WordPress Setup:
For WordPress projects, add php-stubs/wordpress-stubs via Composer and create a .phpactor.json:
{
"php_code_sniffer.enabled": false,
"language_server_worse_reflection.diagnostics.enable": false,
"indexer.stub_paths": ["%project_root%/vendor/php-stubs/wordpress-stubs"]
}-- UI
opt.cursorline = true -- Highlight current line
opt.cursorcolumn = true -- Highlight current column
opt.scrolloff = 999 -- Keep cursor centered
opt.wrap = true -- Wrap long lines
-- Files
opt.swapfile = false -- No swap files
opt.backup = false -- No backup files
opt.undofile = true -- Persistent undo
-- Timing
o.timeoutlen = 250 -- Key sequence timeout
-- Platform
g.codeium_arch = "arm64"
g.codeium_os = "Darwin"| Extension/Pattern | Filetype |
|---|---|
.njk |
htmldjango |
.webc |
htmldjango |
.conf |
sh |
*.blade.php |
blade |
*.svg |
html |
- YAML Frontmatter: Enables YAML syntax in template files
- Help Windows: Opens help in vertical split
- Auto Resize: Equalizes splits on window resize
- No Auto Comment: Disables automatic comment continuation
- Dotenv Syntax: Highlights
.envfiles asdosini
Colorscheme: Eldritch (lua/plugins/ui/eldritch.lua)
- Transparent: false
- Dim inactive: true
- Dark sidebars and floats
- Custom background:
#171928
Statusline: Custom lualine theme (lua/plugins/ui/lualine/neoed.lua)
- Centered filename
- Mode indicator (left and right)
- Project directory
- Git branch and diff
- Diagnostics
- Macro recording indicator
- Start Neovim - Dashboard shows recent files, dotfiles shortcuts
- Open Project - Use
<leader>fffor file picker - Navigate Files - Use Snacks explorer (right sidebar)
- Edit with Multi-Cursor -
<C-n>for next match - Format on Save - Biome/Prettier automatically formats
- Open Lazygit:
<leader>gg - View inline blame (automatic via gitsigns)
- Stage changes in Lazygit
- Commit with conventional messages
- Set breakpoints
- Start debug session with language-specific commands
- Use DAP UI for inspection
- Toggle Claude Code:
<C-A-S-c> - Floating window appears (80% size)
- Ask questions or request code changes
- Claude Code can read/modify files directly
:Lazy " Open plugin manager
:Lazy sync " Sync plugins
:Lazy health " Check plugin health:LspInfo " Check LSP status
:LspLog " View LSP logs
:Mason " Manage LSP servers:LazyProfile " Profile startup time:source % " Reload current file
" Or restart NeovimPart of the dotfiles repository. See main repository for license information.