Skip to main content

RPM Spec File Language Server

CI Status VSCode CI Status Code Coverage Chat on - Matrix

This is a proof of concept implementation of a server implementing the Language Server Protocol for RPM Spec files.

Please share your feature requests with us by opening an issue, creating a discussion or chat with us on matrix in #rpm-spec-language-server:matrix.org.

Supported LSP endpoints

  • autocompletion of macro names, spec sections and preamble keywords

  • jump to macro definition

  • expand macros on hover

  • breadcrumbs/document sections

Requirements

Running the server

  • Install the dependencies via poetry install

  • Launch the server in tcp mode (binds to `127.0.0.1:2087 by default) via poetry run rpm_lsp_server

Alternatively, you can build the python package, install the wheel and run the module directly:

poetry build
pip install --user dist/rpm_spec_language_server-*.whl
python -m rpm_spec_language_server

The server requires the spec.md file. It can either use the locally installed copy from the rpm package or (if the documentation has not been installed) from a locally cached version in ~/.cache/rpm/spec.md. The language server will fetch the spec.md from the upstream github repository if neither of the previous options.

Container Mode

The rpm-spec-language-server is a server that supports an experimental container mode. In this mode, the server is launched inside a container with the package directory mounted into the running container. This allows you to have access to a different distribution than your current one.

The container mode can currently handle only one package open. The RPM spec file must be in the top-level directory. Additionally, the server must communicate via TCP. This means that you might have to reconfigure your lsp-client, if it assumes to communicate via stdio.

To enable the container mode with Podman, proceed as follows:

$ cd ~/path/to/my/package
$ # ensure that the spec file is in the current working directory!
$ podman container runlabel run \
      ghcr.io/dcermak/rpm-spec-lang-server:$distri

where you replace $distri with one of tumbleweed, leap-15.5, leap-15.6, fedora or centos.

To use Docker, get the exact launch command as shown below:

$ docker inspect -f '{{index .Config.Labels "run"}}' \
      ghcr.io/dcermak/rpm-spec-lang-server:$distri | \
      sed -e 's/podman/docker/' -e 's|$IMAGE|ghcr.io/dcermak/rpm-spec-lang-server:$distri|'

In the example above, replace $distri with the desired distribution.

Supported distributions/tags

  • fedora: based on fedora:latest

  • tumbleweed: based on tumbleweed:latest

  • centos: based on centos:stream9

  • leap-15.5: based on leap:15.5

  • leap-15.6: based on leap:15.6

Clients

VSCode

A very simple VSCode client is available in clients/vscode/. Building requires nodejs and the npm package manager:

$ npm install
$ npm run package

Install the created rpm-spec-language-server-$VERSION.vsix and launch the language server in tcp mode.

vis with vis-lspci

Add to your ~/.config/vis/visrc.lua this code:

lsp = require('plugins/vis-lspc')
lsp.ls_map['rpmspec'] = {
    name = 'RPMSpec',
    cmd = 'python3 -mrpm_spec_language_server --stdio'
}

Neovim with built-in LSP client

local lspconfig = require("lspconfig")
local util = require("lspconfig.util")
local configs = require("lspconfig.configs")
configs.rpmspec = {
    default_config = {
      cmd = { 'python3', '-mrpm_spec_language_server', '--stdio' },
      filetypes = { 'spec' },
      single_file_support = true,
      root_dir = util.find_git_ancestor,
      settings = {},
    },
    docs = {
      description = [[
  https://github.com/dcermak/rpm-spec-language-server

  Language server protocol (LSP) support for RPM Spec files.
  ]],
    },
}

lspconfig["rpmspec"].setup({})

Neovim with coc.nvim plugin

Open nvim, run :CocConfig, and merge the following JSON into your configuration

{
    "languageserver": {
        "spec": {
            "command": "rpm_lsp_server",
            "args": ["--stdio"],
            "filetypes": ["spec"]
        }
    }
}

Emacs with lsp-mode.el

lsp-mode has builtin support for the rpm-spec-language-server. All you have to do is to require 'lsp-rpm-spec and launching lsp-mode. With use-package, this can be implemented as follows utilizing rpm-spec-mode:

(use-package lsp-mode
  :ensure t
  :commands (lsp lsp-deferred)
  :hook ((rpm-spec-mode . lsp-deferred)))

(use-package rpm-spec-mode
  :ensure t
  :mode "\\.spec'"
  :config (require 'lsp-rpm-spec))

Emacs with eglot.el

eglot is the builtin LSP Client for Emacs. Support for the rpm-spec-language-server can be added by evaluating the following snippet (e.g. in your init.el or directly in the scratch buffer):

(require 'eglot)
(add-to-list 'eglot-server-programs
               '(rpm-spec-mode . ("localhost" 2087)))

Then start the language server in tcp mode and invoke eglot via M-x eglot.

Release files for rpm-spec-language-server 0.0.2

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for rpm-spec-language-server 0.0.2
File Size Uploaded
rpm_spec_language_server-0.0.2.tar.gz 21.8 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for rpm-spec-language-server 0.0.2
File Interpreter ABI Platform
rpm_spec_language_server-0.0.2-py3-none-any.whl Python 3 none any Details

Total release size: 44.6 kB

Release files / rpm_spec_language_server-0.0.2.tar.gz

Download URL rpm_spec_language_server-0.0.2.tar.gz
Size 21.8 kB
Tags Source
SHA-256 checksum
How to use checksums
86998305c03c0d1396475a735756b699a15433ee4d705733b828ec18091e7073
BLAKE2b-256 checksum
How to use checksums
37b5eab4519a6e646f84ca99a3e1ddf416ce94a88b889e38ed55f5e02ac16ed8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2025.

Transparency log

Release files / rpm_spec_language_server-0.0.2-py3-none-any.whl

Download URL rpm_spec_language_server-0.0.2-py3-none-any.whl
Size 22.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
a6e195ea850dccc183b4708649eb994222e89c476da8da805822dc5ce1ee1e09
BLAKE2b-256 checksum
How to use checksums
5d7d27a0e7338067df6a11138f7b579215fb660e7785805ff3ff5b358692e22c
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.7

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Oct 20, 2025.

Transparency log

Release history Release notifications | RSS feed

This release

0.0.2 This release

2 release files

0.0.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page