NAVI // NAVIVIM FOR AGENTS
The rules of the road for anyone — human or agent — working on NaviVim itself.
Mirrored from AGENTS.md in the NaviVim repo. The repo copy is the source of truth.
Share this file with humans and AI agents working on NaviVim. It is the contract for this project's editing experience. Source of truth: the NaviVim repo (
~/NaviVim, live at~/.config/nvimvia symlink). Edit the repo, never the symlink target directly.
NaviVim is the default text-editing experience for Navi — a minimal, Debian-based, tiling-focused Linux environment. The distro has its own AGENTS.md and handbook; everything below is about NaviVim.
NaviVim's ambition is a premier, best-in-class Neovim experience: an in-terminal IDE that feels like a cohesive whole with the system it ships on — welcoming to newcomers (especially people arriving from VSCode) without dumbing anything down for veterans. Concretely that means:
lazy.nvim. No framework distros
(no LazyVim / NvChad / LunarVim) — every plugin is chosen on purpose,
one file per feature, and the whole config stays readable enough to
learn from.vim remains available outside this repo as a fallback. The
legacy ~/.vimrc (11 lines: number, mouse, hlsearch, incsearch, wrap,
autoindent, cursorline) lives on conceptually in lua/config/options.lua.~/.config/nvim/
init.lua -> requires config.options, config.keymaps, config.autocmds, config.lazy
lua/config/options.lua -> vimrc migration + IDE defaults
lua/config/keymaps.lua -> all user keymaps (leader = <Space>)
lua/config/autocmds.lua -> yank-hl, resize, no-autocomment, transparency re-apply
lua/config/lazy.lua -> lazy.nvim bootstrap, spec = { import = "plugins" }
lua/plugins/sidebar.lua -> nvim-tree (toggleable file explorer)
lua/plugins/completion.lua -> blink.cmp + LuaSnip (toggleable autocomplete)
lua/plugins/search.lua -> telescope + fzf-native, flash, hlslens, which-key
lua/plugins/lsp.lua -> mason + native vim.lsp.config/enable + fidget + conform + nvim-lint
lua/plugins/treesitter.lua -> syntax + indent, polyglot parsers
lua/plugins/ui.lua -> lualine, bufferline, alpha dashboard, indent-blankline
(dashboard: 8 shortcut buttons, random tip-of-day footer,
boot reveal + neon header cycling when nightshadeNeon is active)
lua/plugins/git.lua -> gitsigns + lazygit
lua/plugins/editing.lua -> Comment, autopairs, surround, todo-comments
lua/plugins/terminal.lua -> toggleterm + vim-tmux-navigator + persistence
lua/plugins/theme.lua -> reads ~/.config/omaterm/nvim.theme, default nightshadeNeon
colors/nightshadeNeon.lua -> house colorscheme (#ff10f0 #39ff14 #00ffff #ff3131 #ffffff on #000000)
after/plugin/transparency.lua -> startup transparency trigger
after/syntax/uxntal.vim -> ported from ~/.vim/pack/plugins/start/uxntal.vim
after/ftdetect/uxntal.vim -> ported uxntal filetype detection
after/ftdetect/gemtext.vim -> belt-and-braces .gmi detection (syntax itself
ships with Neovim; nightshadeNeon styles its
Heading/LinkURL/Quote/List groups)
Leader is Space, tapped in sequence (e.g. <leader>ff = Space, f, f).
Pressing Space and waiting shows which-key with every option.
| Feature | Keys | Notes |
|---|---|---|
| Sidebar toggle | <C-n>, <leader>e, focus <leader>o |
nvim-tree, 32 cols left |
| Autocomplete toggle | <leader>ua |
flips vim.g.navi_completion_enabled, blink.cmp enabled() respects it |
| Search in file | /, n/N centered, <Esc> clears |
ignorecase+smartcase, hlslens counts, s flash-jump |
| Project find/grep | <leader>ff files, <leader>fg grep, <leader>fb buffers, <leader>/ buffer-fuzzy |
Telescope + ripgrep + fd |
| Save/quit | <C-s> / <leader>w, <leader>q |
VSCode muscle memory |
| Splits | <leader>\|, <leader>-, <C-h/j/k/l> |
tmux-aware via vim-tmux-navigator |
| Buffers | <S-h> / <S-l>, <leader>bd |
bufferline |
| LSP | gd gr K <leader>rn <leader>ca [d ]d |
attached via LspAttach autocmd |
| Format toggle | <leader>uf |
conform.nvim, default ON |
| Git | <leader>gg lazygit, <leader>gp/gb, [h/]h |
gitsigns gutter |
| Terminal | <leader>tt or <C-\>, <Esc><Esc> exits term mode |
toggleterm |
| Session | <leader>qs restore |
persistence.nvim |
| Relative numbers | <leader>un toggles |
default ON with number |
neovim>=0.11, git, ripgrep, fd-find (binary fd; shim fdfind if needed), node, python3, make/gcc (telescope-fzf-native, treesitter), Nerd Font.NaviVim/install.sh, which installs the
upstream release tarball (user-space ~/.local by default,
PREFIX=/usr/local as root for system-wide/ISO use; privilege escalation
prefers doas, falling back to sudo).tmux, lazygit, language servers via :Mason (lua_ls, pyright, ts_ls, rust_analyzer, gopls, clangd, bashls, jsonls, yamlls), formatters (stylua, shfmt, black/isort, prettier), linters (flake8, shellcheck)./etc/skel/.config/nvim (copy of this config). Theme override: /etc/skel/.config/omaterm/nvim.theme.
install.sh --system (run as root from the distro installer) handles the whole
system install: tarball to /usr/local, skel seed, editor/vi alternatives,
EDITOR/VISUAL via /etc/profile.d, and a deterministic Lazy! restore
from lazy-lock.json as a build-time smoke test. User mode (./install.sh)
rolls forward with Lazy! sync — commit the updated lockfile.~/.vim/pack/plugins/start/uxntal.vim AND after/syntax|ftdetect/uxntal.vim in sync.nvim-treesitter/* stays on branch = "master" (legacy configs API; migrating to main needs a config rewrite). All other 0.10-era pins are dropped now that NaviVim requires 0.11+.# install / sync plugins (headless)
nvim --headless "+Lazy! sync" +qa
# health
nvim --headless "+checkhealth" +qa
# LSP servers UI
nvim "+Mason"
# smoke test toggles (manual)
nvim -c "NvimTreeToggle" -c "Telescope find_files"
Test matrix before shipping: open .py .js .ts .lua .c .md .tal files, toggle sidebar (<C-n>), toggle completion (<leader>ua then type in insert mode), / search + Esc, :Telescope live_grep, :checkhealth clean (except optional clipboard warnings outside tmux).
lua/plugins/*.lua file + keymaps with desc (which-key discoverable).<leader>u* or documented key and persist via vim.g.navi_*.vim-tmux-navigator fallback to <C-w> maps).ColorScheme autocmd in config/autocmds.lua + startup trigger. Add new float groups there, not inline.plugins/theme.lua + omaterm/nvim.theme, never hardcoded colorscheme elsewhere.stylua (2-space, 120 col per stylua.toml) on Lua edits.nvim-dap + nvim-dap-ui for debugging (Python/JS/C first).nvim-treesitter from master to main branch (new API).snacks.picker or fzf-lua evaluation if Telescope feels slow on low-end hardware.tmux.conf with C-h/j/k/l passthrough + session-restore + statusline theme sync.:NaviVimWelcome command linking to the handbook.