-- Copy file path to clipboard vim.api.nvim_create_user_command("CopyPath", function(context) local full_path = vim.fn.glob("%:p") local file_path = nil if context["args"] == "nameonly" then file_path = vim.fn.fnamemodify(full_path, ":t") end -- get the file path relative to project root if context["args"] == "relative" then local project_marker = { ".git", "pyproject.toml" } local project_root = vim.fs.root(0, project_marker) if project_root == nil then vim.print("can not find project root") return end file_path = string.gsub(full_path, project_root, "") end if context["args"] == "absolute" then file_path = full_path end vim.fn.setreg("+", file_path) vim.print("Filepath copied to clipboard!") end, { bang = false, nargs = 1, force = true, desc = "Copy current file path to clipboard", complete = function() return { "nameonly", "relative", "absolute" } end, }) -- JSON format part of or the whole file vim.api.nvim_create_user_command("JSONFormat", function(context) local range = context["range"] local line1 = context["line1"] local line2 = context["line2"] if range == 0 then -- the command is invoked without range, then we assume whole buffer local cmd_str = string.format("%s,%s!python -m json.tool", line1, line2) vim.fn.execute(cmd_str) elseif range == 2 then -- the command is invoked with some range local cmd_str = string.format("%s,%s!python -m json.tool", line1, line2) vim.fn.execute(cmd_str) else vim.api.nvim_err_write(string.format("unsupported range: %s", range)) end end, { desc = "Format JSON string", range = "%", })