EcoVim v5.0.0
🎉 Major Release: Neovim 0.11 + Complete Modernization
I'm excited to announce EcoVim v5.0.0 - a massive update bringing native Neovim 0.11+ support, a brand-new configuration system, and dozens of improvements and bug fixes!
⚠️ Breaking Changes
Important: This release requires Neovim 0.11 or higher.
Migration Guide
- Update Neovim to 0.11+ (
brew install neovimor build from source) - Backup your config:
mv ~/.config/nvim ~/.config/nvim.backup - Clone fresh:
git clone https://github.com/ecosse3/nvim.git ~/.config/nvim - Create your user config:
cd ~/.config/nvim cp lua/config/user.lua.example lua/config/user.lua
- Migrate your customizations from your backup to
user.lua
Major Changes
| Before (v4.x) | After (v5.0) |
|---|---|
| Telescope picker | Snacks.nvim picker (telescope fully removed) |
| nvim-tree | Snacks.nvim explorer |
| toggleterm | Snacks Terminal |
| nvim-notify | Snacks Notifier |
| nvim-cmp | blink.cmp |
| copilot.lua | copilot-lsp (with NES) |
| codecompanion | opencode + MCPHub |
| indent-blankline | Snacks indent |
✨ What's New
1. 🎛️ New Configuration System
The biggest change: Personal configuration now lives in lua/config/user.lua (gitignored!)
-- lua/config/user.lua
-- Your personal settings - never causes merge conflicts!
EcoVim.colorscheme = "tokyonight-storm"
EcoVim.lsp.ensure_installed = { "rust_analyzer" }Features:
- ✅
EcoVim.lsp- Add custom LSP servers - ✅
EcoVim.formatters- Override formatters per filetype - ✅
EcoVim.linters- Override linters per filetype - ✅
EcoVim.autocmds- Add custom autocmds - ✅
EcoVim.plugin_overrides- Modify ANY plugin config
2. 🤖 Enhanced AI Integration
- Avante.nvim - Claude-powered coding agent with tool use
- GitHub Copilot NES - Next Edit Suggestions (press
<Tab>to accept) - Opencode.nvim - OpenAI integration
- MCPHub - Model Context Protocol for AI tool integration
3. 🎨 Modern UI with Snacks.nvim
All UI components now use folke/snacks.nvim:
- Picker - Fast fuzzy finder with git integration
- Explorer - File tree with git status
- Terminal - Built-in terminal
- Notifications - Beautiful notifications
- Bigfile - Handles large files gracefully
- Indent - Animated indent guides
4. 🔧 DevOps Support
New language servers for infrastructure:
- Docker LSP
- Terraform + HCL
- YAML
5. 💻 Frontend Improvements
- blink.cmp - Lightning-fast completion with npm + emoji support
- TypeScript Server Toggle - Switch between
tsgo(fast, native Go-based) andts_ls(classic) viaEcoVim.lsp.typescript_server - Tailwind - Color highlighting via nvim-highlight-colors
- multicursor.nvim - Better multi-cursor editing
6. 🍎 macOS Optimized
New Command (⌘) keybindings:
<D-s>- Save<D-q>/<D-w>- Close buffer<D-d>/<D-u>- Page scroll<D-i>- Jump forward
7. ⌨️ Keybinding Improvements
Comprehensive keybindings documentation: The README now includes a complete, audited reference of every keybinding in EcoVim — 12 new sections covering AI & Agents, DAP Debugging, Testing, Search & Replace, Formatting & Linting, TypeScript-specific, Harpoon, Multi-cursor, Window & Split Management, Zen Mode, NPM Package Management, and Treesitter textobjects.
Added which-key descriptions for:
<leader>h/<leader>H- Harpoon menu / add file<leader>[/<leader>]- Harpoon prev / next<leader>f/<leader>l- Format file / lint file<leader>y- Yazi file manager<leader>D- Database (sqlit)<leader>x- Delete cursor (multicursor)<leader>A- Align cursors (multicursor)<leader>gv- Restore cursors<leader>m- Add cursor below
Changed:
- Multicursor align:
<leader>a→<leader>A(avoids conflict with Actions group)
Removed:
<leader>cl(line diagnostics) - useglinsteadrefactoring.nvimplugin - LSP code actions provide similar functionality
Fixed:
skey now properly triggers Flash.nvim jump (was missing keybinding)Skey now triggers Flash.nvim treesitter mode
8. 🔧 Capability-Based LSP Keymaps
New smart keymaps that only register when the LSP server supports the specific capability:
-- Auto-detected by server capabilities:
{ "<leader>cA", vim.lsp.buf.code_action, has = "codeAction" }
{ "<leader>cR", Snacks.rename.rename_file, has = { "workspace/didRenameFiles", ... } }
{ "gd", vim.lsp.buf.definition, has = "definition" }
{ "gr", vim.lsp.buf.references, has = "references" }
{ "K", vim.lsp.buf.hover, has = "hover" }
{ "L", vim.lsp.buf.signature_help, has = "signatureHelp" }
{ "<leader>cf", vim.lsp.buf.format, has = "documentFormatting" }
-- and more...The has field automatically prefixes with textDocument/ if no / is present.
9. 🍎 macOS Cmd+h Note
macOS reserves Cmd+h for "Hide Application", so window navigation uses Cmd+Shift+h/j/k/l instead. This applies to all terminals (Ghostty, Neovide, kitty, etc.) — there is no reliable way to remap Cmd+h at the application level.
10. Complete Telescope Removal
Telescope.nvim has been fully removed — all picker functionality is now provided by snacks.nvim.
- Removed custom telescope pickers (
pickers.lua,multi-rg.lua) - Removed
git-worktree.nvim(use lazygit for worktree management) - Removed telescope dependency from
nvim-scissors(auto-detects snacks) - Switched
octo.nvimto snacks picker (picker = "snacks") - Deleted
telescope.luaplugin spec entirely
Snacks grep supports inline rg flags via -- ARGS syntax (e.g., search_term -- -g *.lua), which fully replaces the custom multi-rg picker.
11. Code Quality & Reliability
Plugin Fixes:
- Removed minuet plugin and all references
- Fixed blink.cmp appearance config placement and provider name collision
- Fixed printer.nvim
event=BufEnterdefeatingftlazy loading - Fixed session-manager plugin spec not registering due to parse-time require
- Added missing nui.nvim dependency to noice.nvim
- Removed dead git-worktree opts block
NvimTree Cleanup:
- Removed
nvim-lsp-file-operationsplugin — it only supports nvim-tree/neo-tree/triptych, not snacks explorer. LSP file rename is now handled natively bySnacks.rename.rename_file()(bound to<leader>cR) and snacks explorer's built-in file operations - Removed all dead NvimTree references: which-key attach function, autocmd, highlight groups, filetype exclusion lists
- Renamed
EcovimNvimTreeTitlehighlight toEcovimExplorerTitle - Replaced NvimTree filetypes with
snacks_layout_boxin galaxyline, winbar, and cursorword exclusions
LSP Improvements:
- Migrated from deprecated vuels (Vetur) to volar for Vue support
- Fixed global diagnostic toggle to be buffer-local
- Fixed format_on_save augroup duplicating handlers (clear=false -> clear=true)
- Removed redundant
open_floating_previewmonkey-patch (handled bywinborder) - Fixed diagnostic float firing on InsertLeave
LSP Server Config Audit:
All 13 LSP server configurations have been audited and modernized:
- ESLint — Removed deprecated
experimental.useFlatConfig(server auto-detects flat config vs legacy), reduced debounce from 2000ms to 500ms - Tailwind CSS — Added
classAttributesfor better completion,twMerge/twJoinclass patterns, removed deprecatedrecommendedVariantOrder(Tailwind v4), removed redundant capabilities block - Deno — Removed deprecated
importMap(Deno 2.x usesdeno.jsonimports), removed dead registries (nest.land, crux.land), updatedunstableto array format - Lua LS — Added
checkThirdParty = false(suppresses popup, lazydev handles types), removed extreme preload values that could slow startup - Vue LS — Disabled
hybridModefor tsgo compatibility (hybrid mode requires ts_ls/vtsls with@vue/typescript-plugin), addedtsdkpath - GraphQL — Added
.graphqlrc.ts,.graphqlrc.toml,graphql.config.ts,graphql.config.tomlroot patterns (graphql-config v5) - Global — Removed redundant
signatureHelpborder handlers (now handled bywinborder)
Robustness (pcall Guards):
- Added pcall guards to 10+ unprotected
require()calls across LSP servers,
colorscheme, utilities, and plugin configs to prevent cascading load errors
Autocmd Safety:
- Added augroups to all ungrouped autocmds to prevent duplication on re-source
- Fixed jest file glob patterns (
*test.js->*.test.js) - Added augroup support to user-defined EcoVim.autocmds
Performance:
- Increased
updatetimefrom 100ms to 300ms to reduce CursorHold CPU load - Lazy loaded 8+ plugins that were loading eagerly at startup
Security:
- Fixed shell injection in git.lua
- Wrapped user config dofile in pcall
- Protected MCPHub requires in avante
Other:
- Replaced deprecated APIs (
vim.loop->vim.uv,vim.diagnostic.disable, etc.) - Fixed critical bugs (missing format function, broken keymap specs, etc.)
- Replaced
vim.optwithvim.ofollowing Neovim recommendations
12. New Plugins
Enhanced Diagnostics:
- tiny-inline-diagnostic.nvim — Rich inline diagnostic display replacing native
virtual_textwith multiline support, severity-colored indicators, and overflow handling
LSP Enhancements:
- SchemaStore.nvim — 500+ JSON/YAML schemas for
jsonlsandyamlls(replaces 8 hardcoded schema URLs) - inc-rename.nvim — Live-preview LSP rename with
<leader>cr(integrates with noice.nvim command line) - symbol-usage.nvim — Inline reference and implementation counts above function definitions (
<leader>cuto toggle) - lazydev.nvim — Proper Neovim Lua API type completions for
vim.*,vim.uv, and installed plugins (integrates with blink.cmp)
Next.js / React:
- boundary.nvim — Visualize
'use client'/'use server'RSC boundaries with virtual text annotations in TSX/JSX files
13. Monorepo & Project Management
EcoVim now ships with monorepo-aware project root detection out of the box, supporting all major JS/TS monorepo tools.
Supported monorepo tools:
- pnpm workspaces (
pnpm-workspace.yaml) - Turborepo (
turbo.json) - Nx (
nx.json) - Lerna (
lerna.json) - Rush (
rush.json)
What changed:
package.jsonremoved from vim-rooter patterns — preventscwdfrom scoping to sub-packages inside monorepos- Monorepo root markers are checked before
.git, so the monorepo root is always preferred - Snacks project picker (
<leader>pl) uses.git-only patterns for project detection - Project directories and rooter patterns are fully configurable via
user.lua
Customizable via user.lua:
-- Configure where your projects live
EcoVim.plugins.projects.dev = { "~/Projects", "~/Work" }
-- If you don't use monorepos, add package.json back
EcoVim.plugins.rooter.patterns = { ".git", "package.json" }14. User-Configurable Options
New options you can toggle in user.lua without touching plugin files:
| Option | Default | Description |
|---|---|---|
EcoVim.lsp.typescript_server |
"tsgo" |
TypeScript server: "tsgo" (fast, native) or "ts_ls" (classic). Inactive server is auto-excluded. |
EcoVim.lsp.format_on_save |
false |
Auto-format on save (toggle at runtime with :LspToggleAutoFormat) |
EcoVim.lsp.inlay_hints |
true |
Show inlay hints from LSP servers |
EcoVim.plugins.completion.ghost_text |
true |
Show ghost text (inline completion preview) in blink.cmp |
EcoVim.plugins.git.blame_line |
true |
Show inline git blame on current line (toggle with :Gitsigns toggle_current_line_blame) |
Bug fix: Diagnostic float borders now respect EcoVim.ui.float.border instead of being hardcoded to "rounded".
TypeScript keybindings: The <leader>c keybindings (organize imports, add missing imports, remove unused, fix all) now use standard LSP code actions instead of TSTools commands, so they work with both tsgo and ts_ls.
📊 Performance
- Startup time: ~90ms (M1 Mac)
- Lazy loading: All plugins
- Native LSP: Uses Neovim 0.11
vim.lsp.configAPI
🚀 Quick Start
# Clone
git clone https://github.com/ecosse3/nvim.git ~/.config/nvim
# Setup user config
cd ~/.config/nvim
cp lua/config/user.lua.example lua/config/user.lua
# Start Neovim
nvim
# Install LSP servers
:Mason🙏 Support
If you enjoy EcoVim, consider supporting development:
📋 Full Changelog
See CHANGELOG.md for detailed commit history.
🐛 Known Issues
- Copilot NES requires Neovim 0.11+ with LuaJIT
Thank you for using EcoVim! 🎊