anakin-language-server

August 27, 2024 ยท View on GitHub

Stand With Ukraine

anakin-language-server

Yet another Jedi Python language server

Requirements

  • Python >= 3.6
  • pygls >= 1.3, <1.4
  • Jedi >= 0.19
  • pyflakes ~= 2.2
  • pycodestyle ~= 2.5
  • yapf ~=0.30

Optional requirements

  • mypy

Implemented features

  • textDocument/completion
  • textDocument/hover
  • textDocument/signatureHelp
  • textDocument/definition
  • textDocument/references
  • textDocument/publishDiagnostics
  • textDocument/documentSymbol
  • textDocument/codeAction (Inline variable)
  • textDocument/formatting
  • textDocument/rangeFormatting
  • textDocument/rename
  • textDocument/documentHighlight

Initialization option

Also one can set VIRTUAL_ENV or CONDA_PREFIX before running anakinls so Jedi will find proper environment. See get_default_environment.

Diagnostics

Diagnostics are published on document open and save.

Diagnostics providers:

  • Jedi

    See get_syntax_errors.

  • pyflakes

  • pycodestyle

    Server restart is needed after changing one of the configuration files.

  • mypy

    Install mypy in the same environment as anakinls and set mypy_enabled configuration option.

Configuration options

Configuration options must be passed under anakinls key in workspace/didChangeConfiguration notification.

Available options:

OptionDescriptionDefault
help_on_hoverUse help instead of infer for textDocument/hover.True
completion_snippet_firstTweak sortText property so snippet completion appear before plain completion.False
completion_fuzzyValue of the fuzzy parameter for complete.False
diagnostic_on_openPublish diagnostics on textDocument/didOpenTrue
diagnostic_on_changePublish diagnostics on textDocument/didChangeFalse
diagnostic_on_savePublish diagnostics on textDocument/didSaveTrue
pyflakes_errorsDiagnostic severity will be set to Error if Pyflakes message class name is in this list. See Pyflakes messages.['UndefinedName']
pycodestyle_configIn addition to project and user level config, specify pycodestyle config file. Same as --config option for pycodestyle.None
mypy_enabledUse mypy to provide diagnostics.False
yapf_style_configEither a style name or a path to a file that contains formatting style settings.'pep8'
jedi_settingsGlobal Jedi settings.
E.g. set it to {"case_insensitive_completion": False} to turn off case insensitive completion
{}

Configuration example

Here is eglot configuration:

(defvar my/lsp-venv nil
  "Name of virtualenv.
Set it in project's dir-locals file.")

(defclass my/eglot-anakinls (eglot-lsp-server) ()
  :documentation
  "Own eglot server class.")

(cl-defmethod eglot-initialization-options ((_server my/eglot-anakinls))
  "Pass initialization param to anakinls."
  `(:venv ,(when my/lsp-venv
             (expand-file-name
              (concat "~/.virtualenvs/" my/lsp-venv)))))

;; Add this server to eglot programs to handle python-mode and run `anakinls'
(add-to-list 'eglot-server-programs
             '(python-mode my/eglot-anakinls "anakinls"))

;; Also treat UnusedVariable as error
(setq-default eglot-workspace-configuration
              '((:anakinls :pyflakes_errors ["UndefinedName" "UnusedVariable"])))

Installation

pip install anakin-language-server

Development

pip install pre-commit
pre-commit install