Skip to content

v5.0.0

Latest

Choose a tag to compare

@ecosse3 ecosse3 released this 05 Mar 18:54

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

  1. Update Neovim to 0.11+ (brew install neovim or build from source)
  2. Backup your config: mv ~/.config/nvim ~/.config/nvim.backup
  3. Clone fresh: git clone https://github.com/ecosse3/nvim.git ~/.config/nvim
  4. Create your user config:
    cd ~/.config/nvim
    cp lua/config/user.lua.example lua/config/user.lua
  5. 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) and ts_ls (classic) via EcoVim.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) - use gl instead
  • refactoring.nvim plugin - LSP code actions provide similar functionality

Fixed:

  • s key now properly triggers Flash.nvim jump (was missing keybinding)
  • S key 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.nvim to snacks picker (picker = "snacks")
  • Deleted telescope.lua plugin 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=BufEnter defeating ft lazy 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-operations plugin — it only supports nvim-tree/neo-tree/triptych, not snacks explorer. LSP file rename is now handled natively by Snacks.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 EcovimNvimTreeTitle highlight to EcovimExplorerTitle
  • Replaced NvimTree filetypes with snacks_layout_box in 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_preview monkey-patch (handled by winborder)
  • 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 classAttributes for better completion, twMerge/twJoin class patterns, removed deprecated recommendedVariantOrder (Tailwind v4), removed redundant capabilities block
  • Deno — Removed deprecated importMap (Deno 2.x uses deno.json imports), removed dead registries (nest.land, crux.land), updated unstable to array format
  • Lua LS — Added checkThirdParty = false (suppresses popup, lazydev handles types), removed extreme preload values that could slow startup
  • Vue LS — Disabled hybridMode for tsgo compatibility (hybrid mode requires ts_ls/vtsls with @vue/typescript-plugin), added tsdk path
  • GraphQL — Added .graphqlrc.ts, .graphqlrc.toml, graphql.config.ts, graphql.config.toml root patterns (graphql-config v5)
  • Global — Removed redundant signatureHelp border handlers (now handled by winborder)

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 updatetime from 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.opt with vim.o following Neovim recommendations

12. New Plugins

Enhanced Diagnostics:

  • tiny-inline-diagnostic.nvim — Rich inline diagnostic display replacing native virtual_text with multiline support, severity-colored indicators, and overflow handling

LSP Enhancements:

  • SchemaStore.nvim — 500+ JSON/YAML schemas for jsonls and yamlls (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>cu to 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.json removed from vim-rooter patterns — prevents cwd from 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.config API

🚀 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:

GitHub Sponsors


📋 Full Changelog

See CHANGELOG.md for detailed commit history.

🐛 Known Issues

  • Copilot NES requires Neovim 0.11+ with LuaJIT

Thank you for using EcoVim! 🎊