Ecovim: Frontend Neovim Config

March 4, 2026 ยท View on GitHub

Last commit Stars License Neovim Version

A non-minimal Neovim config built to work most efficiently with Frontend Development.

โœจ Features

๐Ÿค– AI & Assistance

๐ŸŽจ UI & Experience

๐Ÿ’ป Frontend Development

  • TypeScript, React, Next.js, Vue
  • TailwindCSS with color highlighting
  • blink.cmp - completion engine
  • boundary.nvim - RSC 'use client' markers
  • NPM package info in package.json
  • Jest testing & coverage
  • treesj - smart split/join lines

๐Ÿ”ง DevOps & Tools

  • Docker LSP support
  • Terraform & HCL
  • YAML language server
  • yazi.nvim - terminal file manager
  • harpoon - quick file navigation
  • multicursor - multi-cursor editing
  • Monorepo-aware root detection (pnpm, Turborepo, Nx, Lerna, Rush)

๐Ÿ” Code Quality

๐ŸŒณ Git Integration

๐Ÿ“˜ TypeScript & React Features

EcoVim ships with deep TypeScript and React/Next.js integration out of the box:

FeaturePluginDescription
Type checkingtsc.nvimAsync project-wide tsc --noEmit with quickfix
Error translationts-error-translatorHuman-readable TypeScript errors
RSC boundariesboundary.nvimVisualize 'use client' directive usage in Next.js
Template stringstemplate-stringAuto-convert to template literals on ${}
Tailwind valuestw-valuesPreview resolved Tailwind class values
Tailwind foldtailwind-foldFold long Tailwind class strings
Smart incrementdial.nvimCycle true/false, const/let, increment dates
Reference countssymbol-usageShow usage counts above functions/components
Live renameinc-renamePreview LSP rename as you type
JSON/YAML schemasSchemaStoreAuto-schemas for tsconfig, package.json, etc.
Lua API completionslazydevNeovim Lua API types for vim.*, plugins

๐Ÿš€ Performance

  • Startup time: ~90ms (measured on M1 Mac)
  • Lazy loaded: All plugins via lazy.nvim

Screenshots

Dashboard

Dashboard

Overview

Neovim

More screenshots

Some of screenshots can be old

TailwindCSS with nvim-cmp

TailwindCSS

Which Key Menu

WhichKey

Lazygit

Lazygit

Git Side Blame

Side Blame


โ˜• Support

If you enjoy using EcoVim and would like to support its development:

GitHub Sponsors

Your support helps maintain and improve EcoVim. Thank you! ๐Ÿ™

Installation

Just clone GitHub repo into ~/.config/nvim.

Prerequisities

  • Make sure you have installed the latest version of Neovim v0.11+ (nightly is preferred).
  • Have wget, curl, unzip, git, make, pip, python, npm, node, luarocks, fd, ripgrep and cargo installed on your system. You can check if you are missing anything with :checkhealth command.
  • Have any nerd font installed. Fira Code has been used in screenshots. You can download it from nerdfonts.com.

After install configuration:

  1. Selected treesitter Languages are installed by default. To check it run :TSInstallInfo. Make sure to run :TSInstall <lang> for specific language you want to install.
  2. LSP servers are enabled by default. You can check installed LSP servers by :Mason command.

Configuration

All customization is done in lua/config/user.lua. This file is gitignored and won't cause merge conflicts when updating!

Quick Start

# Copy the example file
cp lua/config/user.lua.example lua/config/user.lua

# Edit your personal config
nvim lua/config/user.lua

Quick Customization Examples

-- lua/config/user.lua

-- Change colorscheme
EcoVim.colorscheme = "tokyonight-storm"

-- Add custom LSP servers
EcoVim.lsp.ensure_installed = { "rust_analyzer", "gopls" }

-- Override formatters
EcoVim.formatters = {
  javascript = { "prettierd" },
  typescript = { "prettierd" },
}

-- Add custom autocmds
EcoVim.autocmds.auto_save = {
  event = "FocusLost",
  pattern = "*",
  command = "silent! wa",
}

-- Override any plugin config (use repo name, e.g., "snacks.nvim")
EcoVim.plugin_overrides["snacks.nvim"] = function(_, opts)
  opts.picker.layout = "vertical"
end

-- Configure project directories (for <leader>pl project picker)
EcoVim.plugins.projects.dev = { "~/Projects", "~/Work" }

-- Rooter supports monorepo tools out of the box:
-- pnpm, Turborepo, Nx, Lerna, Rush
-- Add package.json back to rooter if you don't use monorepos
-- EcoVim.plugins.rooter.patterns = { ".git", "package.json" }

-- Toggle features on/off
EcoVim.lsp.format_on_save = true        -- Enable auto-format on save
EcoVim.lsp.inlay_hints = false           -- Disable inlay hints
EcoVim.lsp.typescript_server = "ts_ls"   -- Switch from tsgo to ts_ls
EcoVim.plugins.completion.ghost_text = false  -- Disable ghost text
EcoVim.plugins.git.blame_line = false    -- Disable inline git blame

-- Custom vim options
vim.opt.tabstop = 4
vim.opt.shiftwidth = 4

Full Configuration Options

OptionTypeDefaultDescription
colorschemestring"tokyonight-night"Theme name
ui.fonttableGUI font settings
ui.float.borderstring"rounded"Border style: "rounded", "single", "double", "shadow", "none"
lsp.ensure_installedtable{}Additional LSP servers to install via Mason
lsp.excludetable{ "copilot" }LSP servers to not auto-enable
lsp.typescript_serverstring"tsgo"TypeScript server: "tsgo" (fast, native) or "ts_ls" (classic)
lsp.serverstable{}Custom LSP server configurations
lsp.format_on_savebooleanfalseAuto-format on save (toggle at runtime with :LspToggleAutoFormat)
lsp.inlay_hintsbooleantrueShow inlay hints from LSP servers
formatterstable{}Override formatters per filetype
linterstable{}Override linters per filetype
autocmdstableAdd custom autocmds
plugin_overridestableOverride any plugin configuration
plugins.ai.*.enabledbooleanvariesEnable/disable AI plugins (avante, copilot, opencode)
plugins.completion.select_first_on_enterbooleanfalseAuto-select first completion item on Enter
plugins.completion.ghost_textbooleantrueShow inline completion preview (ghost text)
plugins.git.blame_linebooleantrueShow inline git blame on current line
plugins.rooter.patternstableRoot detection patterns for vim-rooter
plugins.projects.devtable{ "~/Projects" }Directories to scan for projects
plugins.projects.patternstable{ ".git" }Patterns to detect project roots

Tips

  • Runtime toggles -- Some options also have runtime commands: :LspToggleAutoFormat for format-on-save, :Gitsigns toggle_current_line_blame for git blame.
  • Plugin overrides let you change ANY plugin's config without forking files. Use the plugin's GitHub repo name (e.g., "snacks.nvim", "blink.cmp"). Function overrides receive (plugin, opts) -- mutate opts directly, no need to return.
  • Monorepo users -- EcoVim detects pnpm/Turborepo/Nx/Lerna/Rush roots automatically. The package.json is excluded from rooter patterns to prevent cwd from scoping to sub-packages.
  • Non-monorepo users -- Add package.json back: EcoVim.plugins.rooter.patterns = { ".git", "package.json" }
  • Border style -- EcoVim.ui.float.border controls ALL floating windows (hover, diagnostics, completion, signature help). Set it once and everything follows.
  • See user.lua.example for the complete reference with all available options and inline documentation.

Updating EcoVim

Since your config is in user.lua (gitignored), you can safely update:

cd ~/.config/nvim
git pull

No merge conflicts with your personal settings!

For vim settings and new plugins

  • Edit config/options.lua for vim options
  • Create files in lua/plugins/ for new plugins

Keybindings

Space (SPC) is my Leader key.

Tip: Press SPC in normal mode to open the which-key menu and explore all available keybindings interactively.

File Explorer (Snacks)

File Explorer (Snacks)

Key BindingsDescription
<C-e>Toggle Snacks file explorer
<D-e>Toggle Snacks file explorer (macOS Cmd+E)

The Snacks explorer uses its own keybindings when focused. Press ? inside the explorer to see all available actions (create, rename, copy, delete, etc.).

Searching

Searching

Key BindingsDescription
<C-p>Smart file finder (Snacks picker)
<S-p>Live grep (Snacks picker)
sFlash jump to any word
SFlash treesitter selection
SPC s fFind files
SPC s bFind buffers
SPC s gGit grep
SPC s oGrep open buffers
SPC s hRecent files
SPC s HCommand history
SPC s sSearch history
SPC s qQuickfix list
SPC s cColor schemes
SPC s dSearch dotfiles (nvim config)
SPC s tSearch TODOs
SPC s TSearch TODO/FIX/FIXME
]tNext TODO comment
[tPrevious TODO comment
Working with LSP

Working with LSP

Key BindingsDescription
gdGo to definition
grGo to references
gyGo to type definition
giGo to implementation
KHover documentation / peek fold
LSignature help (normal & insert mode)
glLine diagnostics
]gNext diagnostic
[gPrevious diagnostic
<C-Space> / SPC c aCode action
SPC c fFormat document (LSP)
SPC c rRename symbol (live preview)
SPC c RRename file
SPC c dDiagnostics list (Snacks picker)
SPC c tToggle format on save
SPC c uToggle symbol usage
SPC c mMason LSP manager
SPC c l iLSP Info
SPC c l rLSP Restart
SPC c l sLSP Stop
SPC c l SLSP Start
SPC s sDocument symbols
SPC s SWorkspace symbols
TypeScript / React (buffer-local)

TypeScript / React (buffer-local)

These keybindings are available in TypeScript/JavaScript buffers:

Key BindingsDescription
SPC c eWorkspace errors (TSC)
SPC c iAdd missing imports
SPC c oOrganize imports
SPC c sSort imports
SPC c uRemove unused imports
SPC c vShow Tailwind CSS values
<C-a>Smart increment (numbers, booleans, dates, const/let, &&/||, etc.)
<C-x>Smart decrement
Formatting & Linting

Formatting & Linting

Key BindingsDescription
SPC fFormat file (conform.nvim)
SPC f (visual)Format selection
SPC lLint file (nvim-lint)
Working with Git

Working with Git

Key BindingsDescription
SPC g gLazygit
SPC g sGit status (Snacks picker)
SPC g fGit files (Snacks picker)
SPC g aGit add current file
SPC g AGit add all
SPC g bBlame panel (git-blame)
SPC g mBlame line (full commit)
SPC g dDiff file history (diffview)
SPC g DDiff view open
SPC g SDiff view status
SPC g iGitHub issues list (Octo)
SPC g pGitHub pull requests list (Octo)
SPC g LCopy git URL for selection (gitlinker)
]cNext change hunk
[cPrevious change hunk
Hunk actions
SPC g h sStage hunk
SPC g h rReset hunk
SPC g h SStage buffer
SPC g h RReset buffer
SPC g h uUndo stage hunk
SPC g h pPreview hunk
SPC g h dDiff hunk
SPC g h tToggle deleted
Git log
SPC g l aLazygit log (cwd)
SPC g l cLazygit current file history
SPC g l AGit log (Snacks picker)
SPC g l CFile commits (Snacks picker)
Working with Project

Working with Project

Key BindingsDescription
SPC p wGrep word under cursor in project (Snacks picker)
SPC p lSwitch between projects (Snacks picker)
Search & Replace (grug-far)
SPC p r rOpen search & replace
SPC p r aSearch & replace (ast-grep engine)
SPC p r wSearch & replace word under cursor
SPC p r WSearch & replace word under cursor in current file
SPC p r fSearch & replace in current file
Sessions
SPC p s sSave current session
SPC p s lLoad session
SPC p s LLoad last session
SPC p s mSession manager commands
AI & Agents

AI & Agents

Key BindingsDescription
Copilot NES
<Tab>Accept/navigate Copilot NES suggestion
Avante (when enabled)
SPC a aToggle Avante sidebar
Uses Avante default keybindings โ€” see :h avante for full list
Opencode (when enabled)
SPC oOpencode group (see which-key)
MCPHub
:MCPHubOpen MCP Hub
Debugging (DAP)

Debugging (DAP)

Key BindingsDescription
SPC d aContinue
SPC d dContinue
SPC d bToggle breakpoint
SPC d BConditional breakpoint
SPC d iStep into
SPC d oStep out
SPC d OStep over
SPC d hEvaluate expression
SPC d tTerminate
SPC d uOpen DAP UI
SPC d cClose DAP UI
SPC d wFloat watches
SPC d sFloat scopes
SPC d rFloat REPL

Pre-configured for Chrome, Node.js (pwa-node), Next.js server-side, Jest, Vitest, and Deno.

Testing (Jest / Neotest)

Testing (Jest / Neotest)

Available in TypeScript/JavaScript buffers:

Key BindingsDescription
SPC j jRun nearest test
SPC j fRun current file
SPC j lRun last test
SPC j oOpen test output
SPC j iToggle info panel
SPC j sStop
Harpoon

Harpoon

Key BindingsDescription
SPC HAdd file to Harpoon
SPC hOpen Harpoon menu
SPC 1-4Jump to Harpoon file 1-4
SPC [Previous Harpoon file
SPC ]Next Harpoon file
Multi-cursor

Multi-cursor

Using jake-stewart/multicursor.nvim:

Key BindingsDescription
<Up>Add cursor above
<Down>Add cursor below
SPC mAdd cursor at next match of word
<Left>Rotate to next cursor
<Right>Rotate to previous cursor
SPC xDelete cursor
<C-LeftMouse>Add/remove cursor with mouse
<C-q>Toggle cursor
<Esc>Clear cursors (or enable if disabled)
SPC g vRestore cursors
SPC AAlign cursor columns
Window & Split Management

Window & Split Management

Key BindingsDescription
SPC vSplit right
SPC VSplit below
<C-h/j/k/l>Move between splits
<A-h/j/k/l>Resize splits
SPC SPC h/j/k/lSwap buffer between splits
SPC =Resize +5
SPC -Resize -5
<C-\>Previous split
Commenting

Commenting

Key BindingsDescription
gccToggle line comment
gbcToggle block comment
gc (visual)Toggle comment
gcOAdd comment line before
gcoAdd comment line after
SPC a cComment box
Table Mode / Alignment

Table Mode / Alignment

Key BindingsDescription
ga (visual)Aligns selection based on separator (comma, semi-colon, colon etc.) via mini.align
SPC t mToggle Table Mode (activates in markdown files via vim-table-mode)
SPC t i C(Table Mode) Insert column before
SPC t i c(Table Mode) Insert column after
SPC t d c(Table Mode) Delete column
SPC t d r(Table Mode) Delete row
SPC t s(Table Mode) Sort table alphabetically
NPM Package Management

NPM Package Management

Available in package.json buffers:

Key BindingsDescription
SPC n sShow package versions
SPC n hHide package versions
SPC n uUpdate package
SPC n iInstall new package
SPC n dDelete package
SPC n rReinstall dependencies
SPC n cChange version
Zen Mode

Zen Mode

Key BindingsDescription
SPC zZen mode
SPC ZZoom mode
Other Useful Bindings

Other Useful Bindings

Key BindingsDescription
<S-q>Smartly close current buffer without breaking UI
<D-s>Save file (macOS Cmd+S)
<D-q> / <D-w>Close buffer (macOS Cmd+Q/W)
<D-d> / <D-u>Half-page scroll down/up (macOS Cmd+D/U)
<D-i>Jump forward in jumplist (macOS Cmd+I)
<C-o>Jump to previous position in jumplist
<Tab> / <S-Tab>Cycle through buffers
<BS>Jump to first non-blank character
HJump to first non-blank character
v <CR>Smartly select next treesitter subject (repeat to expand)
ciqChange inside ANY quotes (`` or '' or "" etc.) via mini.ai
cibChange inside ANY brackets ({} or [] or () etc.) via mini.ai
zaToggle fold
zMClose all folds
zROpen all folds
zrOpen all folds except imports/comments
gJSmart join lines (treesitter-based via treesj)
~Swap function arguments (treesitter)
gPPrint debug variable under cursor (printer.nvim)
<F12>Toggle terminal
SPC qToggle quickfix list
SPC , / SPC .Previous / next quickfix item
SPC yOpen Yazi file manager
SPC DOpen database (sqlit)
Snippets
SPC a s aAdd new snippet
SPC a s eEdit snippet
EcoVim
SPC / /Open dashboard
SPC / cOpen config
SPC / iManage plugins (Lazy)
SPC / uUpdate plugins
SPC a nToggle line numbers
SPC a rToggle relative numbers
Treesitter textobjects
]] / [[Next / previous JSX element
]f / [fNext / previous function start
]m / [mNext / previous class start
af / ifSelect around / inside function
ac / icSelect around / inside class

Check out the which-key menu and keymappings.lua for most used maps.

Performance

Measured on M1.

Ecovim started in 91.13ms

Done
DescriptionProgress
lazy.nvim instead of packer100%
Better support for null-ls and local formatting100%
Better support to project word refactor100%
Support for nvim-dap debugger for React100%
Support ESLint & Prettier in Native LSP100%
Replace coc.nvim with Native LSP100%
Replace telescope.nvim with snacks.nvim picker100%
Replace nvim-tree with snacks.nvim explorer100%
Update statusline to support LSP diagnostics100%
Rewrite most config to lua100%
Support TailwindCSS with colors100%
Provide current screenshots100%
Create shell installer for Linux & MacOS100%
Better LSP configuration via EcoVim.lsp100%
Custom formatters/linters via EcoVim config100%
Plugin/keymap customization via EcoVim config100%