VS Code-ish, but in Neovim.
A lightweight Neovim distribution that recreates part of the VS Code
experience: the sidebar, tab bar, status bar, and clickable git gutter. Built
on mini.nvim with the built-in
vim.pack for plugin management. No plugin managers, language servers, or UI
frameworks, just sensible defaults.
Editor chrome
- Sidebar filepicker (
<C-b>): docked-leftmini.filesexplorer with single-click open and a Save / Discard / Cancel modal for pending changes. - Tab bar: one tab per buffer, filetype icons, VS Code-style dirty dot, click-to-switch.
- Status bar: git branch + diff on the left, diagnostics / position / indent / encoding / language on the right. Branch, diff, and sidebar icon are clickable.
- Dark+ colorscheme via
vscode.nvim; all chrome highlights derive from the live theme.
Git
- Theme-colored gutter diff signs (
mini.diff): click to preview a hunk, right-click to discard. - Full-file diff view (HEAD vs working) via statusline click or
:lua require("diff_gutter").open_file_diff(0);qto leave. <leader>gg(or click the branch) openslazygitin a floating terminal.
Editing
- VS Code keybindings as a preset: Ctrl+C/X/V/Z/Y, Ctrl+S, line move/duplicate, comment toggle, find/replace, and more. Full table in docs/navigation.md.
- Smart Tab / Enter / Backspace, auto-pairs, comments, completion (
mini.*). - Quick Open (
mini.pick+fff.nvim):<C-p>files,<C-S-p>command palette,<C-S-f>find in files,<C-Tab>buffers.
Buffers
<C-w>closes the current tab (with a Save / Discard / Cancel modal on unsaved changes).<leader>bn/<leader>bpcycle tabs.
Isolation
- Runs in its own scope (
$NVIM_APPNAME=vsvim): config, data, and state live under~/.config/vsvim, never touching~/.config/nvim.
- Neovim 0.12+,
curl,git lazygit(optional, for<leader>ggand the statusline branch click)
git clone <this-repo> vsvim
cd vsvim
./install.shSymlinks a vsvim launcher into ~/.local/bin (or /usr/local/bin as root),
so repo edits take effect immediately. Flags: --copy (frozen install),
--uninstall, --help. Then run vsvim instead of nvim.
No git needed. Downloads the latest release tarball, extracts it, and runs
the bundled install.sh --copy:
tmp=$(mktemp -d) && curl -fsSL https://github.com/nathabonfim59/vsvim/releases/latest/download/vsvim-latest.tar.gz | tar -xz -C "$tmp" && sh "$tmp"/vsvim-*/install.sh --copy && rm -rf "$tmp"vsvim --version # print the installed version
vsvim update # check for and install a newer releasevsvim update behaves according to install mode:
- Symlink install (default): runs
git pull --ff-onlyin the repo and refreshes the install links. No download, no version comparison. --copyinstall: queries the latest GitHub release, compares the remote version against the one baked into the launcher, and if newer downloads thevsvim-X.Y.Z.tar.gztarball, verifies its SHA256, and reinstalls into the same prefix/bindir/configdir recorded at install time.
Releases are cut by pushing a vX.Y.Z tag, which triggers
.github/workflows/release.yml to build the
tarball (with the version baked into VERSION) and publish a GitHub Release.
On first launch vsvim asks for a preset, saved to
~/.config/vsvim/keybindings.json:
- vsvim (default): VS Code shortcuts plus leader-based pickers.
- vim: plain Vim defaults. fff.nvim stays reachable via
:FindFiles,:LiveGrep,:GrepWord.
Re-pick by deleting (or editing) that file. See docs/presets.md.
vsvim preset reference (vim preset leaves defaults untouched):
| Key | Action |
|---|---|
<C-b> |
Toggle sidebar filepicker |
<C-p> |
Quick open files |
<C-S-p> |
Command palette |
<C-S-f> |
Find in files |
<C-Tab> |
Buffer picker |
<C-w> |
Close current tab |
<leader>sf |
Search [F]iles |
<leader>sg |
Search [G]rep |
<leader>sw |
Search [W]ord under cursor |
<leader>gg |
Open lazygit (floating terminal) |
<leader>bn |
Next editor tab |
<leader>bp |
Previous editor tab |
<leader>bd |
Close current editor tab |
Per-module docs in docs/:
editing keybindings · sidebar · tabline · statusline · git & hunks · modal · tui · presets · plugins · options
MIT