A customizable Neovim Personal Development Environment — batteries included but fully configurable.
This repository is mirrored from Codeberg: https://codeberg.org/rakeshsingh/neotalon -> Github: https://github.com/rakeshsingh77/neotalon
- What is NeoTalon?
- Quick Start
- Architecture & Layout
- Enable / Disable Modules
- Adding New Modules & Plugins
- Languages / LSP / Linters / Formatters
- Default Key Mappings
- Overriding & Defining New Mappings
- Contributing
- Troubleshooting & Notes
NeoTalon is a curated Neovim configuration that aims to be a modern, extendable "personal development environment". It provides:
- A plugin-driven, lazy-loaded setup (via
lazy.nvim). - Opinionated defaults that are easy to override.
- A simple convention for enabling/disabling modules and defining per-module configuration and keymaps.
This repository is intended as a base you can fork and customize to your workflows.
Note that this project is currently under development and should be considered beta quality. It is tested on Manjaro and Red Hat 8, and should work on any modern Linux distro. Windows is not currenly supported.
- Neovim 0.9+ (recommended)
- Git
- Optional but practical tools: ripgrep (
rg), fd, node/npm or pnpm/yarn for some plugins, andpythonfor Python LSP/formatters if used.
Clone into your Neovim config directory (or follow your own symlink pattern):
git clone https://github.com/rakeshsingh77/neotalon ~/.config/nvim
# then start nvim; lazy.nvim will be bootstrapped automaticallyOn first start, lazy.nvim will install plugins and Mason can be used to install language servers, linters and formatters.
- Open Neovim and run
:Lazyto interact with the plugin manager UI. :Lazy updateruns updates.- If a plugin is not loading, ensure its plugin spec exists inside
lua/neotalon/plugins-enabled/.
Important directories (in lua/neotalon):
plugins-available/— Plugin specs you can enable (examples and off-by-default modules).plugins-enabled/— Plugin specs that are imported bylazy.nvimand therefore active.conf/— Per-module configuration files. These are loaded withrun_config("<module>")if present.keymaps/—which-keymapping files.set_keymapwill source akeymaps/<module>.luawhen available.vars/— Global variables such as colorscheme, leader key and language tool selections.
Files of note:
lua/neotalon/conf/lazy.luabootstraps and configureslazy.nvimand importsneotalon.plugins-enabled.lua/neotalon/functions.luaexposes helpers:run_config()andset_keymap()which the plugin specs use.
NeoTalon uses a simple filesystem convention:
-
To enable a plugin/module, put its Lua spec file into
lua/neotalon/plugins-enabled/(copy or symlink fromplugins-available/if you want to keep the original).lazy.nvimimportsneotalon.plugins-enabledso any specs in that directory are loaded. Use of symlinks is recommended to keepplugins-available/as the source of truth. -
To disable, remove the link or file (or move it to
plugins-available/if not using the symlink method).
Examples:
# enable by symlinking
ln -s ../plugins-available/telescope.lua lua/neotalon/plugins-enabled/telescope.lua
# disable by moving
git mv lua/neotalon/plugins-enabled/telescope.lua lua/neotalon/plugins-available/After enabling/disabling a plugin, run nvim and use :Lazy sync or restart to apply changes.
Follow these steps to add a new plugin or module in a way that fits NeoTalon's conventions.
- Create a plugin spec file (preferably in
lua/neotalon/plugins-available/) that returns a table with one or more plugin specs. Example filename:lua/neotalon/plugins-available/my-plugin.lua. - Add a corresponding conf file if you need custom configuration:
lua/neotalon/conf/my-plugin.luawith asetup()function. - Add keymaps (optional):
lua/neotalon/keymaps/my-plugin.luausingwhich-key. - Enable the plugin by creating/symlinking to
lua/neotalon/plugins-enabled/my-plugin.lua.
-- lua/neotalon/plugins-available/example.lua
return {
{
"owner/example.nvim",
lazy = true,
event = "VeryLazy",
config = function()
run_config("example") -- will load lua/neotalon/conf/example.lua.setup()
end,
},
}Create lua/neotalon/conf/example.lua:
local M = {}
function M.setup()
require('example').setup({ option = true })
end
return Mrun_config("example") will automatically require neotalon.conf.example and call setup() (if present).
Optionally, create lua/neotalon/keymaps/example.lua and use which-key:
local wk = require('which-key')
wk.add({
{ "<leader>x", name = "Example" },
{ "<leader>xe", "<cmd>ExampleDoThing<cr>", desc = "Do Thing" },
})The code in run_config() calls set_keymap() which will try to require neotalon.keymaps.example automatically.
Language/tool selection lives in lua/neotalon/vars/languages.lua. Each language entry has flags for lsp, linter, formatter, and debugger, with enabled = true/false and tool names.
- To enable a server or tool, edit
vars/languages.luaand setenabled = true(and add the server/tool name if needed). - Mason integration will use these tables to install the required servers and tools.
Example (Python):
python = {
lsp = { enabled = true, servers = { "pyright" } },
linter = { enabled = true, tools = { "ruff" } },
formatter = { enabled = true, tools = { "black" } },
}Run :Mason in Neovim to install the listed tools.
- The leader key is set in
lua/neotalon/vars/vim.luaasMAPLEADER(defaults to space" "). The leader is applied early inlua/neotalon/keymaps/vim.lua.
There are a number of common prefixes established across modules (examples):
<leader>t— Telescope related actions<leader>g— Git / Neogit actions<leader>h— Harpoon<leader>r— Code runner actions<leader>s— Snacks (snippet manager)<leader>y— Yanky / yank history
For the full, up-to-date list of mappings, see the files in lua/neotalon/keymaps/.
- To add mappings for a module, add
lua/neotalon/keymaps/<module>.luaand callwhich-keyas shown above. - To override an existing mapping, edit its file in
lua/neotalon/keymaps/and change the mapping. Since keymaps are applied on startup byset_keymap(module), edits will take effect after restarting Neovim.
If you only need a quick override without editing the repo files, place a file with the same path under your personal config (if you split config) or create a file that runs on startup to call which-key with your replacements.
Tip: When changing a mapping, prefer to adjust the
keymapsfile for that plugin to keep mapping logic co-located with the plugin configuration.
- Add new plugins as
plugins-availableand enable them viaplugins-enabled. - Add or update
confandkeymapsfiles to ship sensible defaults with your plugins. - Keep changes small and focused and open a PR describing the motivation and user-facing behavior.
Please follow the repository's CONTRIBUTING.md for contribution guidelines.
- If a plugin does not load, ensure its spec file is in
plugins-enabled/and that the spec table is correct (see examples inplugins-available/). run_config()will silently ignore missingconffiles — this allows optional configuration files.- Use
:Lazy logand:Lazy healthfor debugging plugin loading issues. - If you are running an Arch based distro, you currently need to install
lua-language-serverfrom the software repository instead of using Mason. This is due to a library compatibility issue with the Archluapackage affecting libbfd-2.38-system.so (December, 2025)