dotfiles/nvim/after/ftplugin/python.lua
2026-06-02 08:20:14 +02:00

75 lines
1.7 KiB
Lua

local utils = require("utils")
local opt = vim.opt
opt.wrap = false
opt.sidescroll = 5
opt.sidescrolloff = 2
opt.colorcolumn = "100"
opt.tabstop = 4 -- Number of visual spaces per TAB
opt.softtabstop = 4 -- Number of spaces in tab when editing
opt.shiftwidth = 4 -- Number of spaces to use for autoindent
opt.expandtab = true -- Expand tab to spaces so that tabs are spaces
-- when we run `:compiler ruff`, then followed by `:make`,
-- Nvim will run ruff in the current directory. By default, `--preview` option is used.
-- The following option is used to customize the option passed to ruff.
vim.g.ruff_makeprg_params = ""
local get_proj_root = function()
local project_marker = { ".git", "pyproject.toml" }
local project_root = vim.fs.root(0, project_marker)
return project_root
end
local get_py_env = function()
local project_root = get_proj_root()
if project_root == nil then
return
end
local venv_name = utils.get_virtual_env()
if venv_name ~= "" then
return "plain_venv"
end
-- check if this is uv-managed project
local uv_lock_path = vim.fs.joinpath(project_root, "uv.lock")
if vim.fn.filereadable(uv_lock_path) == 1 then
return "uv"
end
return ""
end
local py_env = get_py_env()
if vim.fn.exists(":AsyncRun") == 2 then
local py_cmd = "python"
if py_env == "uv" then
py_cmd = "uv run python"
end
local rhs = string.format(":<C-U>AsyncRun %s -u %%<CR>", py_cmd)
vim.keymap.set("n", "<F9>", rhs, {
buffer = true,
silent = true,
})
end
-- format current file
local py_fmt_cmd = "!black"
if py_env == "uv" then
py_fmt_cmd = "!uv run black"
end
local rhs = string.format("<cmd>silent %s %%<CR>", py_fmt_cmd)
vim.keymap.set("n", "<space>f", rhs, {
buffer = true,
silent = true,
})