Any advice on picking a Python language server for emacs? - eviltoast

Hi, folks!

I’d like to set up my emacs with lsp-mode and lsp-ui, but I am finding myself in some analysis paralysis. Ruling out the Palantir language server because it’s deprecated and because it’s Palantir, that still leaves me with five language server recommendations from lsp-mode.

Anybody have any opinions they’d like to share? Any really bad experiences I should avoid? How do I configure your favorite? (Feel free to assume I know very little about configuring emacs.)

If it makes a difference, I am a poetry user and a religious mypy --strict user.

Thanks in advance!

  • Fred@programming.dev
    link
    fedilink
    English
    arrow-up
    2
    ·
    2 months ago

    I’m using pylsp (python-language-server). My reason being a process of elimination. I also use mypy for type-checking, so even without considering the danger of allowing MS to entrench itself into my tooling, it didn’t make much sense to use a tool built around pyright.

    The ruff-lsp seems to only do the things that ruff is good at: linting, code formatting, auto-fix of certain issues, and I wanted more.

    Since I saw that pylsp uses Jedi under the hood, and offered a mypy plugin, I felt that pylsp offer a superset of the features that the Jedi LSP has. In the end I’m happy with pylsp, and never tried Jedi LSP.

    However: with the mypy plugin for pylsp, the memory usage kept growing to ridiculous amounts and getting killed, so I ended up disabling it. I had a look in their bug tracker Instead, I’m using flymake that triggers mypy on save, and that seems to work well. (I have a few changes on top of com4/flymake-mypy.el, because it leaves behind plenty of temporary files.)

    That offers me:

    • jump to definition (using Jedi under the hood)
    • rename symbol (and then Jedi goes and rename uses of that symbol)
    • smart completion (eg. offers only variables in scope, or after a . only the instance members, etc.)
    • short documentation on hover
    • squiggly lines for errors found by flake8 or mypy
    • and a few more that I don’t really notice

    One thing I struggled with: where do you install the LSP? Using pipx for a user installation, or in a per-project venv? I did the latter, which works for me because I work on a small number of projects. That also means that mypy finds all the relevant third-party libraries in that venv. I wrote a bit of elisp that allow emacs to find the right mypy binary to check code.