If you are updating from previous versions, please make sure to run :Lazy sync and :Mason to update everything.
Update: Aug 16, 2026 :snake:
- New: Python testing with
neotest+pytest— run and debug tests without leaving the editor (<leader>n…)- New: Structural editing via treesitter textobjects — select, jump and swap by function, class and argument (
vif,dac,]f,<leader>sa)- New: Persian / RTL support —
:Persianor<leader>rtl, with auto-detection for prose files- New:
trouble.nvimworkspace diagnostics, sticky context header, and scope indent guides- New: Python cheat sheet in Persian, opened with
<leader>hp- Fix: removed a stray
pyrightsetup that ran alongsidepyrefly, causing duplicate diagnostics and hovers on every Python buffer- Fix:
dockerls/yamllswere registered twice, the second time withoutcapabilities, degrading completion- Fix: autosave used
wall, rewriting every open buffer on eachTextChangedand letting the formatter reformat background buffers mid-keystroke
Update: Jul 6, 2026
- Switching to
PyreflyinsteadMypy- Minor bug fixes and tested with Neovim v0.12.4
Update: May 26, 2026 :sparkles:
- New:
<C>-pfuzzy file finder.
- Searches all files under the Git project root, sorted by proximity to the currently open file.
- Fix:
neo-treeauto opening on focus
To enable copy/yank & paste over SSH using OSC52, add the following snippet to the end of your init.lua:
-- OSC52 clipboard integration for remote
-- Only enable when in a TTY session (e.g., SSH)
if vim.env.SSH_CONNECTION then
local ok, osc52 = pcall(require, "vim.ui.clipboard.osc52")
if ok then
vim.g.clipboard = {
name = "osc52",
copy = {
["+"] = osc52.copy("+"),
["*"] = osc52.copy("*"),
},
paste = {
["+"] = osc52.paste("+"),
["*"] = osc52.paste("*"),
},
}
end
end
⚠️ Note: Your terminal emulator must support OSC52 clipboard sequences.
This is a starter configuration for Neovim, featuring a curated selection of the most useful plugins for Python, Rust and JavaScript development. It's lightweight and highly customizable, suitable for both beginners and advanced users.


A basic set of key mappings is included and located in lua/keymaps.lua. You can review and customize these mappings to align with your personal preferences.
Before proceeding, ensure you meet the following requirements:
Neovim Version: v0.11.0+ (tested through v0.12.4)
Operating System: Rocky Linux 9.4, PopOS 22.04, Debian 12.9, Android with termux
⚠️ Neovim 0.11 is a hard requirement. On 0.10 and earlier,
mason-lspconfigv2 fails to load (it callsvim.lsp.enable, added in 0.11) andvenv-selectorraises on startup — the practical symptom is that no LSP attaches to your Python buffers at all. Check withnvim --versionbefore filing an issue.
Ensure the following dependencies are installed for a seamless experience:
Ripgrep (for Telescope and fzf file search):
sudo dnf install ripgrep
fzf (fuzzy finder binary required by the <C-p> file search):
# Install via package manager (e.g., dnf)
sudo dnf install fzf
# Or install manually from https://github.com/junegunn/fzf
Python venv (for Python-based plugins):
Replace <minor> with your Python minor version:
sudo dnf install python3.<minor>-venv
Clipboard provider (e.g., xclip):
sudo dnf install xclip
Node.js & npm (for LSP support via nvm):
Install nvm from GitHub.
Prettier (for yaml,js,... formatting)
npm install -g prettier
fd-find is also needed for python virtualenv selector:
sudo dnf install fd-find
Python toolchain (for linting, formatting, testing and debugging):
# uv — package/venv manager
curl -LsSf https://astral.sh/uv/install.sh | sh
uv tool install ruff # linter + formatter (replaces black, isort, flake8)
uv tool install pytest # test runner driven by neotest
# inside the project venv, for the debugger
uv pip install debugpy
Language servers themselves (pyrefly, ruff, …) are installed by Mason on
first launch — check with :Mason.
$ cd ~/.config/nvim
$ git clone git@github.com:pykeras/neovim.git .
$ nvim
Check Telescope health:
:checkhealth telescope
Save without formatting:
:noautocmd write
Install formatters, debuggers, etc. (via Mason):
:Mason
Leader Key <leader>:
The leader key is mapped to the spacebar ().
<leader> to see available shortcuts.<leader>y<leader>p<C-h><C-l><C-k><C-j><leader>rl<leader>reEscjj<leader>qo<C-p>.git up to $HOME).fzf binary and ripgrep.The default theme is set to kanagawa-wave; feel free to change it.
tsmtntpBy default if you have .venv in project directory this setup will use that otherwise:
<leader>vs<leader>vcRuns against the virtualenv selected with <leader>vs. If tests fail with
ModuleNotFoundError, select the environment first.
Bindings live under <leader>n… rather than <leader>t…, which is already
shared by themes, terminals, todo-comments and tabular.
<leader>nr<leader>nF<leader>na<leader>nL<leader>ndb stops on breakpoints<leader>nx<leader>no<leader>np<leader>nsOperate on functions, classes and arguments instead of lines. Combine with
v (select), d (delete), c (change) or y (yank) — e.g. dif empties a
function body.
Select
af outer / if bodyac / icaa / iaal / ilai / iia/Move & swap
]f / [f]c / [c]a / [a<leader>sa<leader>sA<leader>xx<leader>xb<leader>xs<leader>xl<leader>xq]d / [d]e / [e<leader>rn semantic, unlike :%s/<leader>oi<leader>farf formatting also runs on saveFor python make sure you run pip install debugpy in the virtualenv detected/selected.
<F2><F3><F4><F5><Leader>b<F6><F7><F8>sSrR<C-s><leader>rdt<leader>ff<leader>fg<leader>tt<leader>tl<leader>e<leader>E<leader>nf<leader>gsKgd<leader>gdv<leader>gds<leader>gdp<leader>ca<C-k><leader>cd<leader>gf<leader>bs<Tab><S-Tab>3bh move buffer left 3 times.3bl move buffer right 5 times.<leader>bx<leader>bxa<leader>num number can be 1 to 9ctrl+/ctrl+/<leader>gp<leader>gb<leader>gl<leader>gfd<leader>u<leader>ss<leader>sl<leader>sd<leader>cc~/Pictures: <leader>csctrl+\<leader>th<leader>tf<leader>tstzRzMzaz=zg<leader>nd<leader>nl<leader>csv<leader>tsvTyping and editing Persian, with Neovim kept out of the way of the terminal's own text rendering.
<leader>rtl or :Persian<C-^> insert mode; no need to leave NeovimTurning it on loads the standard Iranian keyboard layout and disables spell —
there is no Persian dictionary for Neovim, so every word would otherwise be
underlined. Harper, being an English grammar checker, is detached from Persian
buffers for the same reason.
Prose files (.md, .txt, .tex, .org, .rst) switch on automatically when
several of their first lines contain Persian script. The threshold is
deliberate: a Python file with one Persian comment is left alone.
On display, and why rightleft is not used. Neovim's own RTL features are
built for GUI rendering and actively make things worse in a terminal:
arabicshape substitutes presentation-form glyphs and emits them in visual
order, so words render backwards (سلام becomes ﺱﻼﻣ reversed). This config
turns it off globally — it is a global option, not buffer-local, and it has no
effect on Latin text.rightleft reverses the character cells itself, fighting whatever bidi the
terminal implements. On VTE-based terminals (gnome-terminal) it blanks the
line completely.With both off, the buffer keeps its logical byte order and the terminal and font do the shaping and reordering — which is the only combination that produces readable Persian.
⚠️ This means display quality is your terminal's job, not Neovim's. Kitty, WezTerm and Konsole shape and reorder Arabic-script text properly. VTE-based terminals (gnome-terminal, Tilix, Terminator) do not implement bidi at all, so Persian will appear unshaped and in logical rather than visual order no matter how Neovim is configured. If Persian looks wrong, switch terminals before changing any setting here.
<leader>hpA Persian-language reference for the Python workflow above —
environments, testing, debugging and structural editing — lives at
docs/python-cheatsheet.html.
~/.config/nvim/lua/plugins/avante to avante.lua for Ollama.