conform.nvim icon indicating copy to clipboard operation
conform.nvim copied to clipboard

bug: ruff LSP format is not applied

Open ahmedelgabri opened this issue 8 months ago • 3 comments

Neovim version (nvim -v)

0.11.1

Operating system/version

macOS 15.5

Read debugging tips

Add the debug logs

  • [x] I have set log_level = vim.log.levels.DEBUG and pasted the log contents below.

Log file

Log file: /Users/ahmed/.local/state/nvim/conform.log
          2025-05-30 16:48:21[DEBUG] Run CWD: /Users/ahmed/Sites/personal/dev/file.py
          2025-05-30 16:48:21[DEBUG] ruff_fix exited with code 0
          2025-05-30 16:48:21[INFO] Run ruff_organize_imports on /Users/ahmed/Sites/personal/dev/file.py
          2025-05-30 16:48:21[DEBUG] Run command: { "/Users/ahmed/.local/bin/ruff", "check", "--fix", "--force-exclude", "--select=I001", "--exit-zero", "--no-cache", "--stdin-filename", "/Users/ahmed/Sites/personal/dev/file.py", "-" }
          2025-05-30 16:48:21[DEBUG] Run CWD: /Users/ahmed/Sites/personal/dev/ai-explorations
          2025-05-30 16:48:21[DEBUG] ruff_organize_imports exited with code 0
          2025-05-30 16:48:21[INFO] Run trim_whitespace on /Users/ahmed/Sites/personal/dev/file.py
          2025-05-30 16:48:21[INFO] Run trim_newlines on /Users/ahmed/Sites/personal/dev/file.py

Formatters for this buffer:
LSP: ruff
ruff_fix ready (python) /Users/ahmed/.local/bin/ruff
ruff_organize_imports ready (python) /Users/ahmed/.local/bin/ruff
trim_whitespace ready (*) 
trim_newlines ready (*) 

Other formatters:
alejandra ready (nix) /etc/profiles/per-user/ahmed/bin/alejandra
deno_fmt unavailable: Command 'deno' not found
goimports unavailable: Command 'goimports' not found
injected unavailable: Condition failed
jq ready (json) /run/current-system/sw/bin/jq
prettier ready (typescriptreact, graphql, less, scss, vue, json, markdown.mdx, jsonc, css, javascript, markdown, yaml, html, mdx, typescript.tsx, javascript.jsx, javascriptreact, typescript) /etc/profiles/per-user/ahmed/bin/prettier
shfmt ready (zsh) /etc/profiles/per-user/ahmed/bin/shfmt
statix ready (nix) /etc/profiles/per-user/ahmed/bin/statix
stylua ready (lua) /etc/profiles/per-user/ahmed/bin/stylua
taplo ready (toml) /etc/profiles/per-user/ahmed/bin/taplo

Describe the bug

I'm setting formatters for python as follows, because I'm using ruff as an LSP already. But when I save a file the LSP formatting doesn't run.

python = { 'ruff_fix', 'ruff_organize_imports', lsp_format = 'first' },

:=require('conform').list_formatters(0) doesn't show LSP in the list, but :ConformInfo shows it as enabled, but the logs doesn't show anything about formatting.

If I run vim.lsp.buf.format() it works, also require("conform").format({ bufnr = 0 }) works and I see this in the log file

2025-05-30 16:57:45[DEBUG] Running LSP formatter on /Users/ahmed/Sites/personal/dev/file.py
2025-05-30 16:57:45[DEBUG] Running formatters on /Users/ahmed/Sites/personal/dev/file.py: { "ruff_fix", "ruff_organize_imports", "trim_whitespace", "trim_newlines" }

What is the severity of this bug?

minor (annoyance)

Steps To Reproduce

  1. nvim -u repro.lua file.py
  2. save the file
  3. file is not formatted

Expected Behavior

  1. nvim -u repro.lua file.py
  2. save the file
  3. file is formatted

This is the output when running vim.lsp.buf.format() or require("conform").format({ bufnr = 0 })

import datetime


def foo():
    return datetime.time()


print(foo())

Minimal example file

import datetime












def foo():
























    return datetime.time()





















print(foo())

Minimal init.lua

-- DO NOT change the paths and don't remove the colorscheme
local root = vim.fn.fnamemodify("./.repro", ":p")

-- set stdpaths to use .repro
for _, name in ipairs({ "config", "data", "state", "cache" }) do
	vim.env[("XDG_%s_HOME"):format(name:upper())] = root .. "/" .. name
end

-- bootstrap lazy
local lazypath = root .. "/plugins/lazy.nvim"
if not vim.loop.fs_stat(lazypath) then
	vim.fn.system({
		"git",
		"clone",
		"--filter=blob:none",
		"--single-branch",
		"https://github.com/folke/lazy.nvim.git",
		lazypath,
	})
end

vim.opt.runtimepath:prepend(lazypath)

-- install plugins
local plugins = {
	"folke/tokyonight.nvim",
	{
		"stevearc/conform.nvim",
		config = function()
			require("conform").setup({
				log_level = vim.log.levels.DEBUG,
				formatters_by_ft = {
					-- python = { lsp_format = "first" }, -- this also doesn't work
					python = { "ruff_fix", "ruff_organize_imports", lsp_format = "first" },
				},
			})
		end,
	},
	{
		"https://github.com/neovim/nvim-lspconfig",
		config = function()
			vim.lsp.config("*", {
				root_markers = { ".git" },
			})

			vim.lsp.config("ruff", {
				init_options = {
					settings = {
						configurationPreference = "filesystemFirst",
						fixAll = true,
						organizeImports = true,
						lint = {
							enable = true,
							preview = true,
						},
						format = {
							preview = true,
						},
					},
				},
			})

			vim.lsp.enable("ruff")
		end,
	},
}

require("lazy").setup(plugins, {
	root = root .. "/plugins",
})

vim.cmd.colorscheme("tokyonight")

Additional context

No response

ahmedelgabri avatar May 30 '25 15:05 ahmedelgabri

If you want to use ruff format then you need to add ruff_format into your formatters_by_ft.

SavingFrame avatar Jun 03 '25 15:06 SavingFrame

@SavingFrame, yes, I'm aware of this, but the plugin also supports LSP formatting, so technically, the LSP format should work because it's working for some of them but not all.

ahmedelgabri avatar Jun 03 '25 21:06 ahmedelgabri

I think it's a more general issue where lsp_format options are getting completely ignored right now, no matter where you specify them.

calops avatar Oct 13 '25 09:10 calops