finds.dev← search

// the find

mattn/efm-langserver

★ 1,546 · Go · MIT · updated Mar 2026

General purpose Language Server

efm-langserver is a generic LSP server that wraps arbitrary command-line tools — linters, formatters, anything that produces error output — and exposes them over the Language Server Protocol. It's for editor users who want LSP diagnostics and formatting from tools that don't ship their own language server. Particularly useful for niche or legacy languages where dedicated LSPs don't exist.

The YAML config format is genuinely well-designed: tool definitions are reusable anchors you compose per-language, which keeps configs DRY when you want both eslint and prettier on the same filetype. Support for both file-based config and DidChangeConfiguration means it works cleanly with editors that manage config dynamically (Neovim's built-in LSP). The `efmls-configs-nvim` ecosystem means you don't have to hand-write lint-formats for common tools. Being a single static binary with no runtime dependencies makes it easy to drop into dotfiles or CI.

The `lint-formats` string parsing is a reimplementation of Vim's errorformat mini-language, which is arcane and poorly documented outside of Vim contexts — getting it right for a new tool requires trial and error. There's no built-in way to chain tools where the output of one feeds the next; you get parallel tools per language, not pipelines. The config schema has grown organically and some options (like `lint-offset-columns`, `lint-category-map`) are underdocumented — you find out what they do by reading source or issues. At 1.5k stars for a project this mature and useful, it's clearly a Vim/Neovim power-user tool that most developers discover only after hitting the limits of their editor's native formatting story.

View on GitHub →

// want more like this?

We dig through GitHub every week and send a few repos picked for what you actually care about — each with an honest take like this one.

Get finds in your inbox → Search again →