A repository-local, pinned Neovim configuration derived from a LazyVim prototype. LazyVim is not a runtime dependency. The current target is Linux x86_64.
The production installer supports Linux x86-64 and intentionally exits if
nvim is already on PATH. It installs the official binary distribution
by merging its bin, lib, and share payload directly into ~/.local.
Thus ~/.local/bin/nvim is the actual upstream executable, not a wrapper or
symlink. Configuration and runtime data use the normal XDG user directories.
The script prints every resolved destination before it writes; this matters
when the shell explicitly sets XDG variables.
./install.sh
./verify.shThe host needs curl, git, tar, gzip, sha256sum, and a C compiler.
The compiler builds the pinned Tree-sitter grammars; nothing is installed
globally.
The installer refuses an existing Neovim configuration by default. If Neovim is no longer installed but an old configuration remains, preserve it and install with:
./install.sh --backup-configThis moves the old Neovim configuration, data, state, and cache directories to
timestamped siblings before installing. Keeping the old plugin and parser data
out of the new installation is necessary for a reproducible result. It does
not bypass the existing-nvim safety check.
For isolated repository testing, use ./bin/nvim and verify it with
./verify.sh --test. The test launcher redirects HOME and the XDG data paths
to test_home while retaining access to the host Wayland clipboard.
Edit only config/nvim in this repository. To deploy those files to an
installed copy, run:
./bin/sync-configThe command accepts only an installation marked as managed by this repository,
backs up the previous complete config under the XDG cache directory, and then
deploys an exact replacement. Use ./bin/sync-config --test to refresh the
isolated test copy. Config sync deliberately changes configuration only.
When adding a plugin or changing a pinned plugin commit, synchronize the plugin checkouts before deploying the matching configuration:
./bin/sync-plugins
./bin/sync-config
./verify.shUse --test with both synchronization commands for the isolated test copy.
sync-plugins reads the repository's authoritative manifest and fetches only
the exact commits recorded there. It does not run Lazy update or select newer
versions. Parser-list changes still require the parser installation procedure.
These synchronization commands are development tools, not the distribution
mechanism for a frozen release.
The optional interface features are controlled independently in
config/nvim/lua/frozen/settings/features.lua. The default bindings are:
\ff: find files in the project\fg: search text in the project\xx: show diagnostics for the current buffer; Enter jumps to a diagnosticK: show the richest available hover information from the symbol, its definition, or its type definitiongd: navigate to the definition's existing tab, or open it in a new tab;\cppreviews its signature and documentation in a compact float\ba: all normal listed buffers\bb: displayed file buffers; Enter navigates to their existing tab/window\bo: orphaned file buffers; Enter loads one in the originating editor window\bm: modified file buffers; each entry states whether Enter navigates or loads\tr: name the current real Neovim tab; an empty name restores its automatic label- In the file explorer,
tswitches to an existing tab displaying the file or opens a new tab;Ctrl-sandCtrl-vopen horizontal and vertical splits
Inside any buffer menu's result-list mode, t navigates to an existing tab or
opens a new one, Ctrl-s/Ctrl-v open splits, and d safely deletes the
selected buffer. The menus open in result-list mode; / or i focuses the
search input. Enter or Escape finishes searching and returns to the list
without opening anything, after which Enter, t, d, or a split command
performs the selected action. The top tab line contains real Neovim tabpages only;
buffer names are not substituted for tabs. The bottom status line reports the
number of modified buffers and how many of those are currently orphaned.
The file and text-search menus start in their search input. Enter or Escape
finishes typing and moves to the result list without opening anything. In the
list, Enter opens the result normally, t navigates to an existing tab showing
that file or opens a new tab, and Ctrl-s/Ctrl-v open splits. The diagnostics
menu is limited to the current buffer and retains its normal Enter-to-location
behavior.
The tab line uses the full terminal width and shortens every tab name as the number of tabs grows. It keeps all tabs visible while each name can retain at least four display cells; only under tighter space pressure may it elide distant tabs. The selected tab uses a different highlight from the other tabs.
- Neovim 0.12.4 official Linux x86_64 tarball
- tree-sitter CLI 0.26.8 official Linux x86_64 binary
- ripgrep 15.1.0 official static Linux x86-64 binary, kept in Neovim's private
data directory so it does not replace a system
rg - lazy.nvim at an immutable commit
- every prototype plugin URL and immutable commit in
config/nvim/lua/frozen/plugins.lua - blink.cmp v1.10.2 and its verified prebuilt x86-64 GNU/Linux fuzzy matcher
The external tools are private and separated by when they are needed:
~/.local/share/nvim/frozen-nvim/
├── runtime-bin/rg
└── install-bin/tree-sitter
lua/frozen/tools.lua prepends runtime-bin only to Neovim's process
environment, so plugins find the pinned rg. Child processes, including
:terminal, inherit that private rg; the parent shell does not. The installer
temporarily exposes install-bin only while compiling parsers, so the private
Tree-sitter CLI is not visible during normal Neovim use. Neither tool can
satisfy or conflict with RPM/deb package dependencies. Blink's matcher and the
compiled parsers are shared libraries loaded directly and never enter PATH.
./uninstall.shThe installer records every file merged from the official Neovim archive. The uninstaller requires that ownership manifest and removes only those files, plus this installation's plugins, parsers, private tools, and installer cache. It also removes the installer's private runtime state. It retains configuration, unrelated Neovim data, Neovim state, and Neovim cache by default. To remove all Neovim configuration/data/state/cache too:
./uninstall.sh --purgePurge refuses a configuration without this repository's ownership marker.
Timestamped directories created by --backup-config are never deleted or
automatically restored.
The checksums in versions.env are published by the respective GitHub releases. Plugin source archives are not yet vendored, so a first install still requires GitHub availability.
config/nvim/lua/frozen/plugins.lua is authoritative. The installer reads that
Lua file directly and checks out each commit before starting the configured
editor. It does not run Lazy sync, consult a LazyVim-generated lockfile, or
allow a distribution to select plugin revisions. lazy.nvim remains only the
runtime plugin loader. All active runtime configuration lives under
config/nvim/lua/frozen; see MIGRATION.md for the prototype migration status.
The official Neovim 0.12.4 x86_64 tarball requires glibc 2.34. Linux distributions with an older glibc, musl-based distributions, and non-x86_64 systems are not currently supported. Arm64 Linux (including Raspberry Pi and Jetson/DGX ARM systems) and macOS require separately pinned upstream artifacts and checksums; they must also compile or install native parsers for their own architecture instead of reusing x86_64 .so files.
Mason is not used. Language servers are installed separately and their
executables must be on PATH when Neovim starts. This keeps the frozen editor
independent of Mason's moving registry while allowing distro packages, npm,
pip, cargo, upstream binaries, or archived binaries to provide each server.
The configuration knows the following servers. At startup it enables a server
only when its command is on PATH, so installing a server and restarting
Neovim is sufficient. Missing servers cause no editor errors.
| Language | LSP configuration | Default command |
|---|---|---|
| C/C++ | clangd |
clangd |
| Python | basedpyright |
basedpyright-langserver |
| Rust | rust_analyzer |
rust-analyzer |
| Dart | dartls |
dart (included in the Dart or Flutter SDK) |
| JavaScript/TypeScript | ts_ls |
typescript-language-server |
| HTML | html |
vscode-html-language-server |
| JSON | jsonls |
vscode-json-language-server |
| YAML | yamlls |
yaml-language-server |
| TOML | taplo |
taplo |
| XML | lemminx |
lemminx |
| Lua | lua_ls |
lua-language-server |
Here, "default command" means the command supplied by nvim-lspconfig. Install
the server by any suitable method and ensure that command resolves on PATH.
Server-specific
arguments such as --stdio remain in the repository's LSP configuration; they
do not belong in the symlink.
If an installed executable has to be exposed under the default command name, run:
./bin/link-lspThe helper asks for the desired command name and the executable's absolute
path, then creates a symlink in ~/.local/bin. It refuses to overwrite an
existing file or shadow a command already on PATH. Ensure ~/.local/bin is on
PATH before starting Neovim.
Known-working language-server versions can be recorded as they are tested, but
the editor does not reject other versions. To add another language, add its
nvim-lspconfig server name and executable to the table in
config/nvim/lua/frozen/plugin_specs/lsp.lua. A nonstandard command name can
be selected with that server's cmd setting.
For the three immediate target languages:
- The Dart or Flutter SDK supplies both the
dartcommand and Dart language server. A Dart project needspubspec.yamlfor project-root detection. - Install
clangdfor C/C++. For accurate include paths and compiler flags, make the build producecompile_commands.jsonin the project root or itsbuilddirectory. - With rustup,
rustup component add rust-analyzer rust-srcsupplies the Rust server and standard-library sources.
Open a source file and run :LspInfo to confirm attachment. Diagnostics,
completion, rename (\\cr), and code actions (\\ca) use the attached server.
- Neovim release and checksums: https://github.com/neovim/neovim/releases/tag/v0.12.4
- Neovim XDG paths: https://neovim.io/doc/user/starting.html#standard-path
- LazyVim prototype configuration: https://www.lazyvim.org/configuration/lazy.nvim
- nvim-treesitter requirements: https://github.com/nvim-treesitter/nvim-treesitter
- tree-sitter release and checksums: https://github.com/tree-sitter/tree-sitter/releases/tag/v0.26.8
- Dart SDK and language tooling: https://dart.dev/tools
- clangd installation and project setup: https://clangd.llvm.org/installation
- rust-analyzer installation: https://rust-analyzer.github.io/book/installation.html