Skip to content

Python Pro Extra

lang.python-pro is the explicit power-user Python stack. It keeps project policy in pyproject.toml, ruff.toml, pyrightconfig.json, and virtualenv metadata, then wires Blak to the current best Neovim-facing tools.

Enable this instead of lang.python. The basic extra stays on Pyright with Black/isort so stable users do not get a surprise LSP or formatter swap.

Enable it

-- ~/.config/blak/lua/blak/user.lua
return {
extras = {
enabled = {
"lang.python-pro",
},
},
}

Or enable it from Neovim:

:BlakExtras enable lang.python-pro
:BlakExtras disable lang.python

If both Python extras are enabled, lang.python-pro removes the basic extra’s default pyright, Black/isort formatter, and nvim-lint Ruff entry when they are still unchanged. Disabling lang.python is still cleaner.

Because this extra adds a plugin, run:

:BlakExtras sync

What it adds

SurfaceContribution
Treesitterpython, requirements
Masonruff, debugpy (basedpyright is installed through the LSP server list)
LSPbasedpyright, ruff
Formattingruff_organize_imports, then ruff_format, for python
Pluginlinux-cultist/venv-selector.nvim
Keymap<leader>cv opens :VenvSelect

basedpyright handles Python language intelligence and type diagnostics. Ruff’s native language server handles lint diagnostics and code actions, while Conform uses Ruff’s import organizer and formatter for save-time formatting.

Virtualenvs

Open a Python file, then use:

<leader>cv

VenvSelect searches common virtualenv locations with fd, updates the active Python LSP configuration, and sets environment variables for child processes inside Neovim. Blak configures it to use the built-in Snacks picker.

Configure BasedPyright

Project config should live in pyproject.toml or pyrightconfig.json. Editor settings still work under lsp.servers.basedpyright:

return {
extras = {
enabled = { "lang.python-pro" },
},
lsp = {
servers = {
basedpyright = {
settings = {
basedpyright = {
analysis = {
diagnosticMode = "workspace",
},
},
},
},
},
},
}

Configure Ruff

Put lint and format policy in pyproject.toml, ruff.toml, or .ruff.toml. Use lsp.servers.ruff.init_options.settings only for editor-specific settings:

return {
extras = {
enabled = { "lang.python-pro" },
},
lsp = {
servers = {
ruff = {
init_options = {
settings = {
configurationPreference = "filesystemFirst",
},
},
},
},
},
}

Use Black and isort instead

If a project still wants the classic Black/isort path, override the Python formatter entry and install the tools:

return {
extras = {
enabled = { "lang.python-pro" },
},
mason = {
ensure_installed = { "black", "isort" },
},
format = {
formatters_by_ft = {
python = { "isort", "black" },
},
},
}

Debug and test adapters

debugpy is installed for Python debugging, but Blak keeps the DAP UI and test runner as separate explicit extras. Enable debug.dap when you want debug keymaps and add nvim-dap-python in plugins.specs:

return {
extras = {
enabled = { "lang.python-pro", "debug.dap" },
},
plugins = {
specs = {
{
"mfussenegger/nvim-dap-python",
ft = "python",
dependencies = { "mfussenegger/nvim-dap" },
config = function()
require("dap-python").setup("debugpy-adapter")
end,
},
},
},
}

Use test.neotest plus neotest-python when you want an in-editor Python test runner.

Install and verify

:BlakToolsInstall
:BlakTreesitterInstall
:BlakDoctor

Open a Python file and check :LspInfo for basedpyright and ruff.