docs/editors/settings.md
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 section provides instructions on where to place these settings
as per the editor.
configurationThe configuration setting allows you to configure editor-specific Ruff behavior. This can be done
in one of the following ways:
ruff.toml or pyproject.toml file that
contains the configuration. User home directory and environment variables will be expanded.!!! 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 setting controls the precedence if both an
editor-provided configuration (configuration) and a project level configuration file are present.
In an editor, Ruff supports three sources of configuration, prioritized as follows (from highest to lowest):
lineLength or
lint.select defined in the editorruff.configuration: Settings provided via the
configuration field (either a path to a configuration file or an inline
configuration object)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 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"
}
}
}
}
}
}
}
```
configurationPreferenceThe 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"
}
}
}
}
}
```
excludeA list of file patterns to exclude from linting and formatting. See the documentation 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/**"]
}
}
}
}
}
```
lineLengthThe 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
}
}
}
}
}
```
fixAllWhether 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
}
}
}
}
}
```
organizeImportsWhether 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
}
}
}
}
}
```
showSyntaxErrorsNew in Ruff v0.5.0
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
}
}
}
}
}
```
logLevelThe 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"
}
}
}
}
}
```
logFilePath 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"
}
}
}
}
}
```
codeActionEnable or disable code actions provided by the server.
disableRuleComment.enableWhether 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.enableWhether 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
}
}
}
}
}
}
}
```
lintSettings 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
}
}
}
}
}
}
```
selectRules to enable by default. See the documentation.
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"]
}
}
}
}
}
}
```
extendSelectRules to enable in addition to those in lint.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"]
}
}
}
}
}
}
```
ignoreRules to disable by default. See the documentation.
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"]
}
}
}
}
}
}
```
formatSettings 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"
}
}
}
}
}
}
```
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.
enableWhether to enable the Ruff extension. Modifying this setting requires restarting VS Code to take effect.
Default value: true
Type: bool
Example usage:
{
"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:
{
"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:
{
"ruff.ignoreStandardLibrary": false
}
importStrategyStrategy for loading the ruff executable.
fromEnvironment finds Ruff in the environment, falling back to the bundled versionuseBundled uses the version bundled with the extensionDefault value: "fromEnvironment"
Type: "fromEnvironment" | "useBundled"
Example usage:
{
"ruff.importStrategy": "useBundled"
}
interpreterA 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 setting:
ruff executable when
ruff.importStrategy is set to fromEnvironment.ruff-lsp server.Default value: []
Type: string[]
Example usage:
{
"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:
{
"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:
{
"ruff.lint.run": "onSave"
}
nativeServerWhether to use the native language server, 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. 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 based on the following conditions:
true: Same as onfalse: Same as offDefault value: "auto"
Type: "on" | "off" | "auto" | true | false
Example usage:
{
"ruff.nativeServer": "on"
}
pathA 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 setting.
Default value: []
Type: string[]
Example usage:
{
"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:
{
"ruff.showNotifications": "onWarning"
}
trace.serverThe trace level for the language server. Refer to the LSP specification for more information.
Default value: "off"
Type: "off" | "messages" | "verbose"
Example usage:
{
"ruff.trace.server": "messages"
}