# Settings

The Ruff Language Server provides a set of configuration options to customize its behavior
along with the ability to use an existing `pyproject.toml` or `ruff.toml` file to configure the
linter and formatter. This is done by providing these settings while initializing the server.
VS Code provides a UI to configure these settings, while other editors may require manual
configuration. The [setup](./setup.md) section provides instructions on where to place these settings
as per the editor.

## Top-level

### `configuration`

The `configuration` setting allows you to configure editor-specific Ruff behavior. This can be done
in one of the following ways:

1. **Configuration file path:** Specify the path to a `ruff.toml` or `pyproject.toml` file that
    contains the configuration. User home directory and environment variables will be expanded.
1. **Inline JSON configuration:** Directly provide the configuration as a JSON object.

!!! note "Added in Ruff `0.9.8`"

    The **Inline JSON configuration** option was introduced in Ruff `0.9.8`.

The default behavior, if `configuration` is unset, is to load the settings from the project's
configuration (a `ruff.toml` or `pyproject.toml` in the project's directory), consistent with when
running Ruff on the command-line.

The [`configurationPreference`](#configurationpreference) setting controls the precedence if both an
editor-provided configuration (`configuration`) and a project level configuration file are present.

#### Resolution order {: #configuration_resolution_order }

In an editor, Ruff supports three sources of configuration, prioritized as follows (from highest to
lowest):

1. **Specific settings:** Individual settings like [`lineLength`](#linelength) or
    [`lint.select`](#select) defined in the editor
1. [**`ruff.configuration`**](#configuration): Settings provided via the
    [`configuration`](#configuration) field (either a path to a configuration file or an inline
    configuration object)
1. **Configuration file:** Settings defined in a `ruff.toml` or `pyproject.toml` file in the
    project's directory (if present)

For example, if the line length is specified in all three sources, Ruff will use the value from the
[`lineLength`](#linelength) setting.

**Default value**: `null`

**Type**: `string`

**Example usage**:

_Using configuration file path:_

=== "VS Code"

    ```json
    {
        "ruff.configuration": "~/path/to/ruff.toml"
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          configuration = "~/path/to/ruff.toml"
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "configuration": "~/path/to/ruff.toml"
            }
          }
        }
      }
    }
    ```

_Using inline configuration:_

=== "VS Code"

    ```json
    {
        "ruff.configuration": {
            "lint": {
                "unfixable": ["F401"],
                "extend-select": ["TID251"],
                "flake8-tidy-imports": {
                    "banned-api": {
                        "typing.TypedDict": {
                            "msg": "Use `typing_extensions.TypedDict` instead",
                        }
                    }
                }
            },
            "format": {
                "quote-style": "single"
            }
        }
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          configuration = {
            lint = {
              unfixable = {"F401"},
              ["extend-select"] = {"TID251"},
              ["flake8-tidy-imports"] = {
                ["banned-api"] = {
                  ["typing.TypedDict"] = {
                    msg = "Use `typing_extensions.TypedDict` instead"
                  }
                }
              }
            },
            format = {
              ["quote-style"] = "single"
            }
          }
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "configuration": {
                "lint": {
                  "unfixable": ["F401"],
                  "extend-select": ["TID251"],
                  "flake8-tidy-imports": {
                    "banned-api": {
                      "typing.TypedDict": {
                        "msg": "Use `typing_extensions.TypedDict` instead"
                      }
                    }
                  }
                },
                "format": {
                  "quote-style": "single"
                }
              }
            }
          }
        }
      }
    }
    ```

### `configurationPreference`

The strategy to use when resolving settings across VS Code and the filesystem. By default, editor
configuration is prioritized over `ruff.toml` and `pyproject.toml` files.

- `"editorFirst"`: Editor settings take priority over configuration files present in the workspace.
- `"filesystemFirst"`: Configuration files present in the workspace takes priority over editor
    settings.
- `"editorOnly"`: Ignore configuration files entirely i.e., only use editor settings.

**Default value**: `"editorFirst"`

**Type**: `"editorFirst" | "filesystemFirst" | "editorOnly"`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.configurationPreference": "filesystemFirst"
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          configurationPreference = "filesystemFirst"
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "configurationPreference": "filesystemFirst"
            }
          }
        }
      }
    }
    ```

### `exclude`

A list of file patterns to exclude from linting and formatting. See [the
documentation](https://docs.astral.sh/ruff/settings/#exclude) for more details.

**Default value**: `null`

**Type**: `string[]`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.exclude": ["**/tests/**"]
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          exclude = ["**/tests/**"]
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "exclude": ["**/tests/**"]
            }
          }
        }
      }
    }
    ```

### `lineLength`

The line length to use for the linter and formatter.

**Default value**: `null`

**Type**: `int`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.lineLength": 100
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          lineLength = 100
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "lineLength": 100
            }
          }
        }
      }
    }
    ```

### `fixAll`

Whether to register the server as capable of handling `source.fixAll` code actions.

**Default value**: `true`

**Type**: `bool`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.fixAll": false
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          fixAll = false
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "fixAll": false
            }
          }
        }
      }
    }
    ```

### `organizeImports`

Whether to register the server as capable of handling `source.organizeImports` code actions.

**Default value**: `true`

**Type**: `bool`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.organizeImports": false
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          organizeImports = false
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "organizeImports": false
            }
          }
        }
      }
    }
    ```

### `showSyntaxErrors`

_New in Ruff [v0.5.0](https://astral.sh/blog/ruff-v0.5.0#changes-to-e999-and-reporting-of-syntax-errors)_

Whether to show syntax error diagnostics.

**Default value**: `true`

**Type**: `bool`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.showSyntaxErrors": false
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          showSyntaxErrors = false
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "showSyntaxErrors": false
            }
          }
        }
      }
    }
    ```

### `logLevel`

The log level to use for the server.

**Default value**: `"info"`

**Type**: `"trace" | "debug" | "info" | "warn" | "error"`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.logLevel": "debug"
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          logLevel = "debug"
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "logLevel": "debug"
            }
          }
        }
      }
    }
    ```

### `logFile`

Path to the log file to use for the server.

If not set, logs will be written to stderr.

**Default value**: `null`

**Type**: `string`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.logFile": "~/path/to/ruff.log"
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          logFile = "~/path/to/ruff.log"
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "logFile": "~/path/to/ruff.log"
            }
          }
        }
      }
    }
    ```

## `codeAction`

Enable or disable code actions provided by the server.

### `disableRuleComment.enable`

Whether to display Quick Fix actions to disable rules via `noqa` suppression comments.

**Default value**: `true`

**Type**: `bool`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.codeAction.disableRuleComment.enable": false
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          codeAction = {
            disableRuleComment = {
              enable = false
            }
          }
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "codeAction": {
                "disableRuleComment": {
                  "enable": false
                }
              }
            }
          }
        }
      }
    }
    ```

### `fixViolation.enable`

Whether to display Quick Fix actions to autofix violations.

**Default value**: `true`

**Type**: `bool`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.codeAction.fixViolation.enable": false
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          codeAction = {
            fixViolation = {
              enable = false
            }
          }
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "codeAction": {
                "fixViolation": {
                  "enable": false
                }
              }
            }
          }
        }
      }
    }
    ```

## `lint`

Settings specific to the Ruff linter.

### `enable` {: #lint_enable }

Whether to enable linting. Set to `false` to use Ruff exclusively as a formatter.

**Default value**: `true`

**Type**: `bool`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.lint.enable": false
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          lint = {
            enable = false
          }
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "lint": {
                "enable": false
              }
            }
          }
        }
      }
    }
    ```

### `preview` {: #lint_preview }

Whether to enable Ruff's preview mode when linting.

**Default value**: `null`

**Type**: `bool`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.lint.preview": true
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          lint = {
            preview = true
          }
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "lint": {
                "preview": true
              }
            }
          }
        }
      }
    }
    ```

### `select`

Rules to enable by default. See [the documentation](https://docs.astral.sh/ruff/settings/#lint_select).

**Default value**: `null`

**Type**: `string[]`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.lint.select": ["E", "F"]
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          lint = {
            select = {"E", "F"}
          }
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "lint": {
                "select": ["E", "F"]
              }
            }
          }
        }
      }
    }
    ```

### `extendSelect`

Rules to enable in addition to those in [`lint.select`](#select).

**Default value**: `null`

**Type**: `string[]`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.lint.extendSelect": ["W"]
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          lint = {
            extendSelect = {"W"}
          }
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "lint": {
                "extendSelect": ["W"]
              }
            }
          }
        }
      }
    }
    ```

### `ignore`

Rules to disable by default. See [the documentation](https://docs.astral.sh/ruff/settings/#lint_ignore).

**Default value**: `null`

**Type**: `string[]`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.lint.ignore": ["E4", "E7"]
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          lint = {
            ignore = {"E4", "E7"}
          }
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "lint": {
                "ignore": ["E4", "E7"]
              }
            }
          }
        }
      }
    }
    ```

## `format`

Settings specific to the Ruff formatter.

### `preview` {: #format_preview }

Whether to enable Ruff's preview mode when formatting.

**Default value**: `null`

**Type**: `bool`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.format.preview": true
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          format = {
            preview = true
          }
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "format": {
                "preview": true
              }
            }
          }
        }
      }
    }
    ```

### `backend` {: #format_backend }

The backend to use for formatting files. Following options are available:

- `"internal"`: Use the built-in Ruff formatter
- `"uv"`: Use uv for formatting (requires uv >= 0.8.13)

For `internal`, the formatter version will match the selected Ruff version while for `uv`, the
formatter version may differ.

**Default value**: `"internal"`

**Type**: `"internal" | "uv"`

**Example usage**:

=== "VS Code"

    ```json
    {
        "ruff.format.backend": "uv"
    }
    ```

=== "Neovim"

    ```lua
    vim.lsp.config('ruff', {
      init_options = {
        settings = {
          format = {
            backend = "uv"
          }
        }
      }
    })
    ```

=== "Zed"

    ```json
    {
      "lsp": {
        "ruff": {
          "initialization_options": {
            "settings": {
              "format": {
                "backend": "uv"
              }
            }
          }
        }
      }
    }
    ```

## VS Code specific

Additionally, the Ruff extension provides the following settings specific to VS Code. These settings
are not used by the language server and are only relevant to the extension.

### `enable`

Whether to enable the Ruff extension. Modifying this setting requires restarting VS Code to take effect.

**Default value**: `true`

**Type**: `bool`

**Example usage**:

```json
{
    "ruff.enable": false
}
```

### `format.args`

!!! warning "Deprecated"

    This setting is only used by [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp) which is
    deprecated in favor of the native language server. Refer to the [migration
    guide](migration.md) for more information.

_**This setting is not used by the native language server.**_

Additional arguments to pass to the Ruff formatter.

**Default value**: `[]`

**Type**: `string[]`

**Example usage**:

```json
{
    "ruff.format.args": ["--line-length", "100"]
}
```

### `ignoreStandardLibrary`

!!! warning "Deprecated"

    This setting is only used by [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp) which is
    deprecated in favor of the native language server. Refer to the [migration
    guide](migration.md) for more information.

_**This setting is not used by the native language server.**_

Whether to ignore files that are inferred to be part of the Python standard library.

**Default value**: `true`

**Type**: `bool`

**Example usage**:

```json
{
    "ruff.ignoreStandardLibrary": false
}
```

### `importStrategy`

Strategy for loading the `ruff` executable.

- `fromEnvironment` finds Ruff in the environment, falling back to the bundled version
- `useBundled` uses the version bundled with the extension

**Default value**: `"fromEnvironment"`

**Type**: `"fromEnvironment" | "useBundled"`

**Example usage**:

```json
{
    "ruff.importStrategy": "useBundled"
}
```

### `interpreter`

A list of paths to Python interpreters. Even though this is a list, only the first interpreter is
used.

This setting depends on the [`ruff.nativeServer`](#nativeserver) setting:

- If using the native server, the interpreter is used to find the `ruff` executable when
    [`ruff.importStrategy`](#importstrategy) is set to `fromEnvironment`.
- Otherwise, the interpreter is used to run the `ruff-lsp` server.

**Default value**: `[]`

**Type**: `string[]`

**Example usage**:

```json
{
    "ruff.interpreter": ["/home/user/.local/bin/python"]
}
```

### `lint.args`

!!! warning "Deprecated"

    This setting is only used by [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp) which is
    deprecated in favor of the native language server. Refer to the [migration
    guide](migration.md) for more information.

_**This setting is not used by the native language server.**_

Additional arguments to pass to the Ruff linter.

**Default value**: `[]`

**Type**: `string[]`

**Example usage**:

```json
{
    "ruff.lint.args": ["--config", "/path/to/pyproject.toml"]
}
```

### `lint.run`

!!! warning "Deprecated"

    This setting is only used by [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp) which is
    deprecated in favor of the native language server. Refer to the [migration
    guide](migration.md) for more information.

_**This setting is not used by the native language server.**_

Run Ruff on every keystroke (`onType`) or on save (`onSave`).

**Default value**: `"onType"`

**Type**: `"onType" | "onSave"`

**Example usage**:

```json
{
    "ruff.lint.run": "onSave"
}
```

### `nativeServer`

Whether to use the native language server, [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp) or
automatically decide between the two based on the Ruff version and extension settings.

- `"on"`: Use the native language server. A warning will be displayed if deprecated settings are
    detected.
- `"off"`: Use [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp). A warning will be displayed if
    settings specific to the native server are detected.
- `"auto"`: Automatically select between the native language server and
    [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp) based on the following conditions:
    1. If the Ruff version is >= `0.5.3`, use the native language server unless any deprecated
        settings are detected. In that case, show a warning and use
        [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp) instead.
    1. If the Ruff version is < `0.5.3`, use [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp). A
        warning will be displayed if settings specific to the native server are detected.
- `true`: Same as `on`
- `false`: Same as `off`

**Default value**: `"auto"`

**Type**: `"on" | "off" | "auto" | true | false`

**Example usage**:

```json
{
    "ruff.nativeServer": "on"
}
```

### `path`

A list of path to `ruff` executables.

The first executable in the list which is exists is used. This setting takes precedence over the
[`ruff.importStrategy`](#importstrategy) setting.

**Default value**: `[]`

**Type**: `string[]`

**Example usage**:

```json
{
    "ruff.path": ["/home/user/.local/bin/ruff"]
}
```

### `showNotifications`

!!! warning "Deprecated"

    This setting is only used by [`ruff-lsp`](https://github.com/astral-sh/ruff-lsp) which is
    deprecated in favor of the native language server. Refer to the [migration
    guide](migration.md) for more information.

Setting to control when a notification is shown.

**Default value**: `"off"`

**Type**: `"off" | "onError" | "onWarning" | "always"`

**Example usage**:

```json
{
    "ruff.showNotifications": "onWarning"
}
```

### `trace.server`

The trace level for the language server. Refer to the [LSP
specification](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#traceValue)
for more information.

**Default value**: `"off"`

**Type**: `"off" | "messages" | "verbose"`

**Example usage**:

```json
{
    "ruff.trace.server": "messages"
}
```
