My personal Neovim configuration — built with modularity, and a plug-and-play mindset in mind.
First of all, this repo is built and tested using the latest Neovim stable release and primarily on Linux. If you use the older version of Neovim and/or not using Linux, you might need to do your own adjustment.
Some plugins used in this config have specific external dependencies.
For example:
- nvim-telescope expects ripgrep and fd to be available in your system (see the official notes here).
- telescope-all-recent requires
libsqlite3to be accessible from yourPATH(see the requirements here). - nvim-treesitter requires
tree-sitter-cliand a working C compiler (see details here). - Some situation might require you to have Node.js or other JavaScript runtime installed, e.g. using nvim-dap with vscode-js-debug. You need to check the official documentations.
Note
For Windows users, related to tree-sitter-cli and C compiler:
If you enable the /essentials/treesitter module and run into C compiler issues on Windows, you do not need to install Visual Studio.
A lighter and simpler alternative is to install MinGW (for example via Scoop), then set the CC environment variable to point to your compiler executable (like cc.exe or gcc.exe). tree-sitter-cli will automatically use the compiler defined in the CC environment variable if it is present.
-
Clone this repository into your
$XDG_CONFIG_HOME, for example on Linux:git clone https://github.com/Xrayya/neovim-dotfile.git ~/.config/nvim -
Open Neovim and let it automatically install all required dependencies and also create
lua/extra-cofig/init.luafile -
You might want to update the all the plugins with
:Lazy syncsince I keeplazy-lock.jsontracked and might out of date. You might also want to remove the lockfile altogether, it's your choice. I keep thelazy-lock.jsonbecause I need it. -
Enable predefined plugins by importing the appropriate files into
lua/extra-config/init.lua
That’s it.
After installation, you’ll immediately get a fully working setup: keymaps, options, and a set of carefully chosen core plugins are enabled by default.
This repository also provides a collection of predefined essential plugins and extra (optional) plugins that you can enable as needed — true plug-and-play.
For your own customization, extra-config/init.lua is the intended entry point.
Use it to define personal tweaks or load additional configurations that are not included by default.
This file is gitignore'd by default since the philosophy is to make this whole Neovim configuration modular, plug and play,
and can be ajdusted for multiple purposes in multiple environment. Well, at least I always keep that mindset in mind when I develop this repository.
You can explore existing modules under:
Feel free to import, extend, or organize them into your own subfolders. Or, if you prefer, fork this repository and shape it entirely to your liking.
Below is an overview of the plugins used in this setup.
The foundation of the configuration: editor options, keymaps, and the most critical plugins. Core plugins include:
- lazy.nvim
- nvim-lspconfig
- none-ls.nvim
- mason.nvim with mason-lspconfig.nvim and mason-null-ls.nvim
- lazydev.nvim
- nvim-autopairs
- nvim-tree.lua
- telescope.nvim with telescope-fzf-native.nvim, telescope-ui-select.nvim, and telescope-all-recent.nvim
- tokyonight.nvim, etc.
Quality-of-life improvements such as statusline, snippets, and Git integration. Some highlights:
- lualine.nvim (customized, see here)
- nvim-treesitter, with:
- gitsigns.nvim
- noice.nvim
- nvim-dap with mason-nvim-dap.nvim, nvim-dap-view, and nvim-dap-virtual-text
- overseer.nvim
Additional features such as Discord presence, AI integrations, and language-specific tooling. This section is still growing.
Some notable extras:
- Language packs:
- JavaScript / TypeScript (js, ts, jsx, tsx)
- Using typescript-tools.nvim (config)
- Or plain nvim-lspconfig (config)
- Lua
- JSON and YAML, with SchemaStore.nvim configured
- Java using nvim-java which makes all necessary tools already set up and ready to go.
- JavaScript / TypeScript (js, ts, jsx, tsx)
- Discord presence via cord.nvim
- Symbols outline using aerial.nvim, etc.
- Debugger setup for JavaScript, TypeScript, Chrome, and MSEdge using vscode-js-debug already configured and works
A quick look at how this Neovim setup feels in daily use.
Clean syntax highlighting, LSP diagnostics, and completion out of the box.
Fast project-wide navigation powered by Telescope.
Inline Git signs and context-aware diffs for real-world workflows.
Running Chrome Debugger in React Project and stop on breakpoint
Additional UI enhancements and tools you can opt into.
This is my personal Neovim configuration, designed primarily for how I work and think.
That said, the structure is intentionally kept flexible so it can adapt to different workflows and use cases. Some choices may reflect my personal preferences and might not align with everyone’s taste — and that’s okay.
It’s open source. Tweak it, bend it, or completely reshape it into something that feels right for you.
For reference, here is my current lua/extra-config/init.lua:
---@module "lazy"
---@type LazySpec
return {
{
-- only set this if you're on windows
"prochri/telescope-all-recent.nvim",
init = function()
vim.g.sqlite_clib_path = vim.fn.stdpath("data") .. "/sqlitelib/sqlite3.dll" -- or any path to sqlite3.dll
end
},
{ import = "xrayya.essentials" },
{ import = "xrayya.essentials.treesitter" },
{ import = "xrayya.extras.ui.alpha" },
{ import = "xrayya.extras.ui.smear-cursor" },
{ import = "xrayya.extras.aerial" },
{ import = "xrayya.extras.colorizer" },
{ import = "xrayya.extras.todo-comment" },
{ import = "xrayya.extras.external" },
{ import = "xrayya.extras.lazygit" },
{ import = "xrayya.extras.tmux" },
{ import = "xrayya.extras.ui.undo-glow" },
{ import = "xrayya.extras.markdown-preview" },
{ import = "xrayya.extras.langs.lua" },
{ import = "xrayya.extras.langs.html-css" },
{ import = "xrayya.extras.langs.tailwindcss" },
{ import = "xrayya.extras.langs.js-ts-typescript-tools" },
{ import = "xrayya.extras.langs.json" },
{ import = "xrayya.extras.langs.yaml" },
{ import = "xrayya.extras.langs.c-cpp" },
{ import = "xrayya.extras.langs.java-java" },
{ import = "xrayya.extras.langs.python" },
{ import = "xrayya.extras.langs.xml" },
{ import = "xrayya.extras.langs.git" },
{ import = "xrayya.extras.langs.bash" },
{ import = "xrayya.extras.langs.ini" },
{ import = "xrayya.extras.langs.kitty" },
{ import = "xrayya.extras.langs.udev" },
{ import = "xrayya.extras.formatter.stylua" },
{ import = "xrayya.extras.formatter.prettier" },
{import = "xrayya.extras.debugger.js-chrome-msedge"}
}Found something that could be improved? Feel free to open an Issue or submit a Pull Request — contributions are always welcome.
Made with ❤️ by Xrayya




