🌐
GitHub
github.com › astral-sh › ruff-lsp
GitHub - astral-sh/ruff-lsp: A Language Server Protocol implementation for Ruff. · GitHub
[language-server.ruff] command = "ruff-lsp" [[language]] name = "python" language-servers = [ "ruff" ] auto-format = true · Upon successful installation, you should see errors surfaced directly in your editor: As of v23.10, Helix supports the use of multiple language servers for a given language. This enables, for example, the use of ruff-lsp alongside a language server like pyright:
Starred by 1.5K users
Forked by 49 users
Languages   Python 99.5% | Just 0.5%
🌐
Astral
docs.astral.sh › ruff › editors › setup
Setup | Ruff
[[language]] name = "python" language-servers = ["ruff", "pylsp"] ... Support for multiple language servers for a language is only available in Helix version 23.10 and later. If you want to, as an example, turn on auto-formatting, add auto-format = true:
Discussions

Ruff v0.4.5: Ruff's language server is now in beta!
I sometimes work in some pretty big python code bases and you can really feel pyright shrugging through all files in real time. I wonder if there are any gains there More on reddit.com
🌐 r/neovim
52
155
May 23, 2024
What are the best linters and language servers for python?
Also consider basedpyright, which is a fork of pyright where they try to achieve feature parity with pylance More on reddit.com
🌐 r/Python
60
107
March 11, 2025
python - Configure Visual Studio Code using settings.json to use Ruff instead of Pylint, Pylance, etc - Stack Overflow
I believe Pylance could be also uninstalled, but for now I am still evaluating benefits of using Ruff language server vs. Pylance. Note: My answer is based on that I was facing an identical challenge, and this is what I ended up with as a "good working configuration" for Python development ... More on stackoverflow.com
🌐 stackoverflow.com
python-lsp-ruff vs ruff confused on what I need, even after reading docs.
I would recommend trying pyright + ruff , this bundle has performed well in my environment. [[language]] name = "python" language-servers = [ "pyright", "ruff" ] [language-server.pyright.config.python.analysis] typeCheckingMode = "basic" # if you choose `ruff-lsp` [language-server.ruff] command = "ruff-lsp" [language-server.ruff.config.settings] args = ["--ignore", "E501"] # if you choose `ruff` itself [language-server.ruff] command = "ruff" args = ["server"] More on reddit.com
🌐 r/HelixEditor
10
4
March 19, 2025
🌐
Medium
jack-hodkinson.medium.com › integrating-the-ruff-language-server-4f6b0d126ebd
Integrating the ruff language server | by Jack Hodkinson | Medium
July 15, 2024 - Ruff is a python code formatter and linter. You can use it as a drop-in replacement for black for code formatting. You can pip install it and run it from the command line via ruff format example.py.
🌐
GitHub
github.com › python-lsp › python-lsp-ruff
GitHub - python-lsp/python-lsp-ruff: Linter plugin for pylsp based on ruff. · GitHub
Configuration options can be passed to the python-language-server. If a pyproject.toml file is present in the project, python-lsp-ruff will ignore specific options (see below). The plugin follows python-lsp-server's configuration. This example configuration using for neovim shows the possible ...
Starred by 218 users
Forked by 24 users
Languages   Python
🌐
Reddit
reddit.com › r/neovim › ruff v0.4.5: ruff's language server is now in beta!
r/neovim on Reddit: Ruff v0.4.5: Ruff's language server is now in beta!
May 23, 2024 -

Ruff Server is now in beta! In case you didn't know, ruff server is an lsp for python that is also a rewrite of ruff-lsp in rust which was originally written in python I believe. What excites me the most about their blog post regarding the new release is the last bullet point...

Supporting more general language server features: We plan to expand the server's capabilities beyond linting, formatting, and diagnostics.

I hope this means that we might see a highly performant, high quality alternative to the other python lsps.

Update:

Forgot links somehow -_- blogpost: https://astral.sh/blog/ruff-v0.4.5 github: https://github.com/astral-sh/ruff/tree/main/crates/ruff_server#setup

🌐
Astral
astral.sh › blog › ruff-v0.4.5
Ruff v0.4.5: Ruff's language server is now written in Rust
May 22, 2024 - Unlike Pylance or Jedi, which are general-purpose language servers for Python, Ruff’s language server facilitates linting, formatting, and automatic fixes within editors, like VS Code or Neovim.
🌐
PyPI
pypi.org › project › ruff-lsp
ruff-lsp · PyPI
A Language Server Protocol implementation for Ruff.
      » pip install ruff-lsp
    
Published   Feb 10, 2025
Version   0.0.62
🌐
GitHub
github.com › astral-sh › ruff › blob › main › crates › ruff_server › README.md
ruff/crates/ruff_server/README.md at main · astral-sh/ruff
An extremely fast Python linter and code formatter, written in Rust. - ruff/crates/ruff_server/README.md at main · astral-sh/ruff
Author   astral-sh
Find elsewhere
🌐
GitHub
github.com › astral-sh › ruff-vscode
GitHub - astral-sh/ruff-vscode: A Visual Studio Code extension with support for the Ruff linter. · GitHub
In general, we recommend configuring Ruff via pyproject.toml or ruff.toml so that your configuration is shared between the VS Code extension and the command-line tool, and between all contributors to the project. Unless you're using the Python-based language server, you can configure some common settings in VS Code directly, like ruff.lineLength (to configure the line length for the linter and formatter) or ruff.lint.select (to configure the enabled lint rules):
Starred by 1.6K users
Forked by 75 users
Languages   TypeScript 57.8% | Python 38.7% | JavaScript 2.3% | Just 1.2%
🌐
Zed
zed.dev › docs › languages › python
Python | Python
Unlike basedpyright, all options can be configured in either of these locations, so the choice of where to put your Ruff configuration comes down to whether you want it to be shared between projects but specific to Zed (in which case you should use language server settings), or specific to one project but common to all Ruff invocations (in which case you should use ruff.toml). Here's an example of using language server settings in Zed's settings.json to disable all Ruff lints in Zed (while still using Ruff as a formatter):
🌐
DeepWiki
deepwiki.com › astral-sh › ruff › 7.1-language-server-architecture
Language Server Architecture | astral-sh/ruff | DeepWiki
February 7, 2026 - Sources: crates/ty_python_semantic/src/semantic_model.rs24-428 crates/ty_python_semantic/src/types/ide_support.rs22-757 · The type checker uses Salsa for incremental computation, ensuring that only changed files are re-analyzed. When a file changes: ... Both servers use the lsp-types and lsp-server crates to implement the LSP protocol.
🌐
Astral
docs.astral.sh › ruff › editors › features
Features | Ruff
The server dynamically refreshes the diagnostics when a configuration file is changed in the workspace, whether it's a pyproject.toml, ruff.toml, or .ruff.toml file. The server relies on the file watching capabilities of the editor to detect changes to these files. If an editor does not support file watching, the server will not be able to detect changes to the configuration file and thus will not refresh the diagnostics. Provide code formatting for your Python code.
🌐
Satyrn
satyrn.app › blog › ruff-integration
Integrating the ruff language server - Satyrn
Ruff is a python code formatter and linter. You can use it as a drop-in replacement for black for code formatting. You can pip install it and run it from the command line via ruff format example.py.
🌐
PyPI
pypi.org › project › python-lsp-ruff
python-lsp-ruff · PyPI
Configuration options can be passed to the python-language-server. If a pyproject.toml file is present in the project, python-lsp-ruff will ignore specific options (see below). The plugin follows python-lsp-server's configuration. This example configuration using for neovim shows the possible ...
      » pip install python-lsp-ruff
    
Published   Apr 01, 2026
Version   2.3.1
🌐
Reddit
reddit.com › r/python › what are the best linters and language servers for python?
r/Python on Reddit: What are the best linters and language servers for python?
March 11, 2025 -

All of the different language servers, linters, and formatters available for Python can be very confusing. There is significant overlap between tools and it's hard to know what is what- this is my attempt to sort through it all.

Below is what I have been able to figure out, corrections and additions added as I see them from the comments.

Ruff is a fast linter / code formatter. It has overtaken Black and Flake8 as the best / most popular linter although not as thourough as Pylint. Rust.

JEDI is a static analysis tool that supports autocompletion, goto, and refactoring. It works with several langauge servers. Similar functionality to Pyright. Python.

Pyright is a language server maintained by Microsoft. It supports type checking (primary function), goto, autocomplete, similar to JEDI. It is written in TypeScript. Pylance is a Microsoft product that builds on Pyright and adds additional feataures to VS Code. TypeScript.

Basedpyright is a fork of Pyright to add Pylance functionality to Pyright for non-Microsoft editors. Mostly TypeScript with Python additions.

MyPy is one of the original static type checkers (2012, but still actively maintained). Python.

PyLSP/Python LSP Server is a language server implementation that interfaces with other libraries like JEDI to provide various LSP functionality. Python.

Pylint is a static code analyser and very thorough (and slow) linter. It can be used alongside other analysis tools like Ruff or Black, and mypy or pyright. Python.

In addition to the above, some commercial IDEs like PyCharm use their own proprietary linters and type checkers.

I use the Helix editor and by default it will use Ruff, JEDI, and pylsp together. I was confused why it used more than one language server/library, which was the motivation for looking into all of this.

Top answer
1 of 1
4

I was in the similar situation, and I had this configuration in the Visual Studio Code's settings.json for Python:

{
//...
"[python]": {
    "editor.formatOnSaveMode": "file",
    "editor.formatOnType": false,
    // For formatting with YAPF install extension: https://marketplace.visualstudio.com/items?itemName=eeyore.yapf
    // Then use 'eeyore.yapf' as below for editor.defaultFormatter:
    "editor.defaultFormatter": "eeyore.yapf"
  },
/...
}

In addition to the above configuration, I had been using following Visual Studio Code extensions installed:

  1. Python by Microsoft
  2. Pylance by Microsoft, note that this one is installed automatically with (1)
  3. Python Debugger by Microsoft, note that this one is installed automatically with (1)
  4. isort by Microsoft
  5. Flake8 by Microsoft
  6. Pylint by Microsoft
  7. yapf by EeyoreLee

After I decided to try Ruff (via the Visual Studio Code extension) for both linting and formatting, I ended up with these configurations and extensions:

  1. Visual Studio Code settings.json file

     //...
     // Python language environment
     "[python]": {
       "editor.formatOnSaveMode": "file",
       "editor.formatOnType": false,
       // For formatting with YAPF install extension: https://marketplace.visualstudio.com/items?itemName=eeyore.yapf
       // Then use 'eeyore.yapf' as below for editor.defaultFormatter:
       // "editor.defaultFormatter": "eeyore.yapf",
       // For formatting with Ruff install extension: https://marketplace.visualstudio.com/items?itemName=charliermarsh.ruff
       // Then use 'charliermarsh.ruff' as below for editor.defaultFormatter:
       "editor.formatOnSave": true,
       "editor.codeActionsOnSave": {
         "source.fixAll": "explicit",
         "source.organizeImports": "explicit"
       },
       "editor.defaultFormatter": "charliermarsh.ruff",
     },
     "ruff.nativeServer": "on",
    
     // Python Language Server
     //"python.languageServer": "Pylance",
    
     // Pylint extension: https://marketplace.visualstudio.com/items?itemName=ms-python.pylint
     // "pylint.enabled": true,
     // "pylint.lintOnChange": true,
     // "pylint.path" : ["${interpreter}", "-m", "pylint"],
     // "pylint.interpreter": [], // Defaults to extension using the path to the selected Python interpreter
    
     // Flake8 extension: https://marketplace.visualstudio.com/items?itemName=ms-python.flake8
     // "flake8.args": [
     //   "--verbose",
     //   "--max-line-length",
     //   "160",
     //   "--max-complexity",
     //   "10",
     //   "--ignore=E266,E501,C901"
     // ],
     // "flake8.severity": { "convention": "Information", "error": "Error", "fatal": "Error", "refactor": "Hint", "warning": "Warning", "info": "Information" },
     //...
    
  2. For each project individually, creating .ruff.toml to further configure Ruff behavior and enable/disable rules from other tools implemented in Ruff:

    target-version = "py313"
    line-length = 160
    indent-width = 2
    extend-exclude = [".vscode", ".idea", "__pycache__", ".python-version", ".ruff.toml", "ruff.toml", "setup.cfg", "pyproject.toml"]
    
    [format]
    indent-style = "space"
    line-ending = "lf"
    docstring-code-format = true
    docstring-code-line-length = 120
    
    [lint]
    # D - Enable all `pydocstyle` rules, limiting to those that adhere to the Pep257 convention enabled via `convention = "pep257"` below
    select = ["E501", "I", "D"]
    ignore = ["D203","D204","D211","D212","D400","D406","D407","E266","C901"]
    
    [lint.pylint]
    # Maximum number of arguments for function / method
    max-args = 20
    # Maximum number of boolean expressions in a if statement
    max-bool-expr = 10
    # Maximum number of branch for function / method body
    max-branches = 100
    # Maximum number of locals for function / method body
    max-locals = 15
    # Maximum number of nested blocks for function / method body
    max-nested-blocks = 5
    # Maximum number of positional arguments allowed for a function or method definition
    max-positional-args = 10
    # Maximum number of public methods for a class (see R0904).
    max-public-methods = 30
    # Maximum number of return statements allowed for a function or method body
    max-returns = 10
    # Maximum number of statements in function / method body
    max-statements = 1000
    
    [lint.pydocstyle]
    convention = "pep257"
    
    [lint.mccabe]
    max-complexity = 10
    
  3. I uninstalled all Visual Studio Code extensions [4-7] in the above list. I believe Pylance could be also uninstalled, but for now I am still evaluating benefits of using Ruff language server vs. Pylance.

Note: My answer is based on that I was facing an identical challenge, and this is what I ended up with as a "good working configuration" for Python development in Visual Studio Code. The driving idea is to reduce number of plugins in Visual Studio Code for each individual tool, since Ruff covers many of the rules from other tools natively.

🌐
Astral
docs.astral.sh › ruff › editors › settings
Settings | Ruff
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.
🌐
DEV Community
dev.to › jackhodkinson › integrating-the-ruff-language-server-13pa
Integrating the ruff language server - DEV Community
July 15, 2024 - Ruff is a python code formatter and linter. You can use it as a drop-in replacement for black for code formatting. You can pip install it and run it from the command line via ruff format example.py.