Personal Lua-based Neovim configuration used as a daily IDE for SRE/DevOps work and software development.
Disclaimer: This configuration is based on and forked from magidc/nvim-config. Credits to the original author for the foundational setup.
| Dependency | Version | Why |
|---|---|---|
| Neovim | 0.11+ | Native LSP API (vim.lsp.config, after/lsp/) |
| ripgrep | any | Telescope live grep and file search |
C compiler (gcc or clang) |
any | Compiling treesitter parsers from source |
| Node.js | 18+ | Required by several LSP servers installed via mason: bashls, eslint, jsonls, html, cssls |
| git | any | lazy.nvim bootstrap and plugin installation |
- Clone this repository into
~/.config/nvim:git clone --depth 1 https://github.com/venkatarenduchintala/nvim-config.git ~/.config/nvim - Install Neovim (0.11+). On Debian/Ubuntu the included script builds from source (stable branch) and installs system-wide:
This also installs the C compiler and build tools, satisfying that prerequisite. For other platforms see the Neovim install guide.
bash ~/.config/nvim/install_nvim.sh - Ensure all remaining prerequisites are installed (
ripgrep,node.js,git). - Launch Neovim — lazy.nvim bootstraps itself on first start and installs all plugins.
- LSP servers, DAP adapters, linters and formatters are installed automatically by mason.nvim on first launch.
Themes use a small plug-n-play system: each colorscheme lives in its own file
under lua/themes/<name>.lua that returns a lazy.nvim
plugin spec. lua/theme.lua auto-discovers every file in that directory, so
adding a theme is drop-in — there is no central list to edit. Only the active
theme's plugin is installed; the others are never fetched, keeping startup lean.
Default: gruvbox (Gruvbox Material), set in lua/settings.lua via
require("theme").set_active_theme("gruvbox").
Use the :Theme command (tab-completes across the discovered themes):
:Theme " show the active theme and list all available
:Theme everforest " select a themeThe choice is persisted to a machine-local state file
(stdpath("data")/active-theme.txt) and applied on the next launch, where the
active theme installs itself via lazy.nvim. To change the default for a fresh
install, edit the set_active_theme(...) call in lua/settings.lua.
Create lua/themes/<name>.lua returning a lazy.nvim spec that loads the
colorscheme in its config function:
return {
"author/mytheme.nvim",
config = function()
vim.o.background = "dark"
vim.cmd.colorscheme("mytheme")
end,
}It is discovered automatically and becomes selectable via :Theme mytheme.
Alongside the previously bundled colorschemes, several low-eyestrain dark themes (medium contrast, warm, desaturated) are included for long editing sessions:
gruvbox_material_soft— Gruvbox Material, medium background, low UI contrasteverforest— warm green-grey, mutedkanagawa— muted "ink painting" palettetokyonight_moon— softer Tokyonight variantzenbones— contrast-engineered, warm (requireslush.nvim)
The status line (lualine) uses
theme = "auto", so it follows whichever colorscheme is active.
Core mappings are defined in lua/mappings.lua. WhichKey provides inline descriptions for all bindings.
Plugin-specific mappings live in lua/plugins/configs/. LSP mappings are defined in lua/lsp/ and are only active when a language server is attached.
.
├── after/lsp/ # Per-server LSP settings (Neovim 0.11+ native API)
│ ├── gopls.lua # Go
│ ├── rust_analyzer.lua # Rust
│ ├── yamlls.lua # YAML (SchemaStore + Kubernetes schemas)
│ ├── helm_ls.lua # Helm
│ ├── ansiblels.lua # Ansible
│ ├── jsonnet_ls.lua # Jsonnet / Grafonnet
│ ├── lua_ls.lua # Lua (Neovim API aware)
│ └── eslint.lua # ESLint with auto-fix on save
├── lua/
│ ├── lsp/
│ │ ├── init.lua # Global capabilities + LspAttach autocmd
│ │ ├── handlers.lua # on_attach and capabilities shared across servers
│ │ └── configs/ # Language-specific lifecycle plugins
│ │ ├── java.lua # jdtls (own startup lifecycle)
│ │ ├── rust.lua # rustaceanvim + crates.nvim
│ │ ├── go.lua # nvim-dap-go (DAP only)
│ │ ├── python.lua # nvim-dap-python + jupyter client
│ │ ├── yaml.lua # yaml-companion (Telescope schema picker)
│ │ └── dap.lua # DAP UI and adapters
│ ├── plugins/
│ │ ├── init.lua # Plugin list (lazy.nvim entry point)
│ │ └── configs/ # Per-plugin configuration files
│ ├── themes/ # One file per colorscheme (see Themes section)
│ ├── mappings.lua # Core key mappings
│ ├── settings.lua # Neovim options and default theme selection
│ └── theme.lua # Theme auto-discovery loader + :Theme command
├── test/ # CI validation suite (see test/README.md)
│ ├── ci_validate.sh # Orchestrates all validation steps
│ ├── fixtures/ # Source files used as treesitter parse targets
│ └── *.lua # Headless validation scripts
└── .github/workflows/
└── validate.yml # GitHub Actions: build devcontainer + run test suite
See test/README.md for the full test suite documentation — scripts, fixtures, what each validates, and how to run the pipeline locally.
All roles
- mason.nvim — automatic installation of LSP servers, DAP adapters, linters and formatters
- mason-lspconfig — bridges mason with Neovim's native LSP API; auto-enables all installed servers
- mason-nvim-lint — bridges mason with nvim-lint for automatic linter installation
- Native LSP (Neovim 0.11+) —
vim.lsp.config/vim.lsp.enableAPI; global capabilities inlua/lsp/init.lua; per-server settings inafter/lsp/<name>.lua - lspsaga.nvim — enhanced LSP UI: code actions, hover docs, rename, breadcrumbs
- nvim-lint — async linting engine; triggers on save
- conform.nvim — formatting engine with per-filetype formatter chains
Go · Terraform · Helm · Ansible · Bash · Dockerfile · YAML · Jsonnet · Python · Markdown
- gopls — Go LSP: unused params, shadow analysis, staticcheck, gofumpt formatting
- terraformls + tflint — Terraform/HCL LSP and linting
- helm_ls — Helm chart LSP with embedded yamlls for template files
- ansiblels + ansible-lint — Ansible playbook LSP with validation and linting
- bashls + shellcheck + shfmt — Bash LSP, linting and formatting
- dockerls + docker_compose_language_service + hadolint — Dockerfile/Compose LSP and linting
- yamlls + yamllint + kube-linter — YAML LSP (SchemaStore-backed), linting; Kubernetes manifest linting
- jsonnet_ls — Jsonnet/Grafonnet LSP for Grafana dashboards as code (Tanka support via
-tflag) - pyright + ruff — Python LSP; ruff for fast linting and formatting (replaces pylint + black)
- marksman — Markdown LSP: link resolution, wikilinks, references
- actionlint — GitHub Actions workflow linting
go · terraform · hcl · bash · gotmpl · dockerfile · jsonnet · python · markdown · markdown_inline · yaml
Java · Spring Boot · Gradle · Maven
- nvim-jdtls — full jdtls lifecycle management: organize imports, super implementation, DAP integration
- nvim-dap + mason-nvim-dap — Debug Adapter Protocol; Java debug adapter + test runner via jdtls
Rust · Cargo
- rustaceanvim — native LSP API Rust support: runnables, debuggables, hover actions; uses
after/lsp/rust_analyzer.luasettings - crates.nvim —
Cargo.tomldependency info and version management inline
Python · Jupyter
- pyright + ruff — type-checked Python LSP with fast unified linting/formatting
- nvim-dap-python — Python debug adapter via debugpy
- nvim-jupyter-client — Jupyter notebook editing inside Neovim
Neovim plugin development
- lazydev.nvim — accurate Neovim API completions and type hints for
lua_ls; replaces manualworkspace.librarysetup - lua_ls — Lua LSP with LuaJIT runtime and Neovim global awareness
JavaScript · TypeScript · HTML · CSS · JSON · Rust · C/C++ · LaTeX
- eslint — JavaScript/TypeScript linting with auto-fix on save
- html/cssls/jsonls/clangd/pyright — LSP coverage for web and systems languages
- vimtex — LaTeX editing with live compile and PDF preview
All roles
- nvim-cmp — completion engine with sources: LSP, Neovim API, buffer, path, luasnip, lazydev
- LuaSnip — snippet engine with VSCode snippet support
- lspkind.nvim — VSCode-style completion item kind icons
All roles
- Telescope — fuzzy finder over files, buffers, LSP symbols, git, diagnostics and more
- neo-tree — file explorer with git status integration
- aerial.nvim — code outline window for symbols and quick navigation
- glance.nvim — peek at definitions, references and implementations in a floating window
- leap.nvim + flash.nvim — fast cursor motion anywhere on screen
- nvim-spider — CamelCase and snake_case word motions
All roles
- nvim-treesitter — syntax highlighting, indentation and structural editing
- nvim-treesitter-textobjects — semantic text objects: functions, classes, parameters, blocks, loops, conditionals
- nvim-autopairs — auto-close brackets, quotes and tags
- nvim-surround — add, change and delete surrounding delimiters
- vim-visual-multi — multiple cursors
- substitute.nvim — replace motion target with register contents
- dial.nvim — extended increment/decrement for dates, booleans, hex, etc.
- comment.nvim — smart line and block commenting
- splitjoin — split or join lists and argument blocks
- nvim-ufo — improved code folding with LSP/treesitter providers
- vim-matchup — extended
%matching for language keywords
All roles
- gitsigns.nvim — inline blame, hunk preview, stage/reset hunks in the gutter
- diffview.nvim — side-by-side diff viewer and merge tool
- lazygit.nvim — full LazyGit TUI inside Neovim
All roles
- claudecode.nvim — Claude Code integration: AI-assisted editing, code generation and explanation directly in the editor
All roles
- bufferline.nvim — tab bar with buffer management
- lualine.nvim — status line with LSP, git and diagnostics info
- trouble.nvim — diagnostics panel: errors, warnings, LSP references, quickfix
- todo-comments.nvim — highlight and search TODO/FIXME/NOTE/HACK comments
- which-key.nvim — popup showing available key bindings as you type
- toggleterm.nvim — floating, horizontal and vertical terminal panes
- neoclip.nvim — clipboard history picker via Telescope
- nvim-notify — animated popup notifications
- illuminate.nvim — automatically highlight all occurrences of the word under the cursor
- nvim-colorizer — inline color preview for hex codes and CSS colors
- undotree — visual undo history tree
- project.nvim — automatic project root detection and project switching
- Large file handler — native
BufReadPreautocmd disables LSP, treesitter, syntax, illuminate and swapfile for files larger than 2 MiB - neoscroll.nvim — smooth scrolling animations
- vim-startify — start screen with recent files and sessions