I’m starting a new Python project and have always used a simple requirements.txt workflow. Recently an LLM suggested configuring a bunch of tools (Pyright, Black, Ruff, MyPy, Debugpy, Tree-sitter, uv, etc.) when using NvChad Neovim configuration, tools I’ve heard of but never used. Should I learn and adopt all of them? What’s a guide you’d recommend that shows a typical setup to start productive Python work?
You can bootstrap this project cleanly with
uvmanaging your Python toolchain, and then wire Ruff, Black, and MyPy viapyproject.tomlplus Neovim/NvChad integration.github+21. Install uv and create the project
On Manjaro, install
uvglobally and create a project‑local environment.snapcraft+1bash
# install uv (snap example; pick your preferred method) sudo pacman -S snapd # if not already installed[web:22] sudo systemctl enable --now snapd.socket[web:22] sudo snap install astral-uv --classic[web:22] # create project mkdir ao3downloader cd ao3downloader # initialize uv-managed project & venv uv init --app . uv venv source .venv/bin/activateThen install your core tooling into the local environment:
bash
uv add ruff black mypyThis keeps all tools version‑pinned inside the project.
2. Configure pyproject.toml for Ruff, Black, MyPy
Use a unified
pyproject.tomlso all tools share line length and Python target.gpxz+2Minimal example for
ao3downloader(adjust versions as needed):text
[project] name = "ao3downloader" version = "0.1.0" description = "AO3 bookmark tracker, downloader, stats, and recommender" requires-python = ">=3.11" [tool.black] line-length = 100 target-version = ["py311"] skip-string-normalization = true [tool.ruff] line-length = 100 target-version = "py311" src = ["ao3downloader", "scripts"] lint.select = ["E", "F", "I", "B"] lint.ignore = [ "E501", # Let Black handle line length.[web:20] ] lint.per-file-ignores = { "tests/**" = ["E402"] } [tool.ruff.format] quote-style = "double" [tool.mypy] python_version = "3.11" strict = true ignore_missing_imports = true mypy_path = ["ao3downloader", "scripts"] plugins = [] [tool.uv] dev-dependencies = [ "ruff", "black", "mypy", ]Run the tools once to verify:
bash
ruff check . black . mypy ao3downloader3. Wire tools into Neovim + NvChad
Use NvChad’s custom config to hook Pyright (for LSP), Ruff, Black, and MyPy.youtube+1github
- Ensure Python plugins are installed inside the project venv:
bash
uv add debugpy # (pyright is an LSP server installed via Mason, not pip)[web:21]
- In Neovim (NvChad):
- Install Pyright LSP and Tree‑sitter:
text
:MasonInstall pyright " LSP for Python[web:21] :TSInstall python " Treesitter parser[web:21]
- Create a custom Python config, e.g.
~/.config/nvim/lua/custom/configs/python.lua, modeled on NvChad Python examples. In that file:youtubegithub
- Configure LSP (pyright) for Python buffers.
- Set format-on-save with Black.
- Register Ruff and MyPy as external tools (e.g., via null‑ls / conform‑nvim depending on your NvChad version) so diagnostics from Ruff & MyPy show in the gutter.githubyoutube+1
- In
~/.config/nvim/lua/custom/plugins.lua, add the plugins / sources for Black, Ruff, MyPy following an NvChad Python template (for example, theNvChad-python-configrepo shows a full setup with Pyright, Black, Ruff, and MyPy plus keymaps and DAP.)youtubegithubAfter that, in your
ao3downloaderdirectory:bash
source .venv/bin/activate # or use uv's `uv run ...` nvim .You should have:
- LSP (Pyright) autocompletion and hover.
- On-save formatting with Black.
- Inline diagnostics from Ruff and MyPy for your AO3 downloader code.
- GitHub - dobval/NvChad-python-config: Custom config of Nvim (NvChad) as a Python IDE.
- Install uv on Manjaro Linux using the Snap Store | Snapcraft
- Configuring Ruff | Ruff
- How to Install kokoro-tts on Manjaro? (Python 3.13 Issues) - Third-Party Software - Manjaro Linux Forum
- How to configure ruff | GPXZ Elevation API
- ruff/docs/configuration.md at main · astral-sh/ruff · GitHub
- https://www.youtube.com/watch?v=4BnVeOUeZxc
- https://www.youtube.com/watch?v=m0OobzFjEKE
- https://www.youtube.com/watch?v=yAQFk3cHJbo
- https://www.youtube.com/watch?v=sSz2eXZ2ELM