3 unstable releases

new 0.1.1 Mar 23, 2025
0.1.0 Mar 21, 2025
0.0.0 Mar 20, 2025

#125 in Development tools

Download history 107/week @ 2025-03-16

107 downloads per month

CC0 license

460KB
18K SLoC

C 12K SLoC // 0.0% comments Rust 6.5K SLoC

just-lsp

CI crates.io dependency status

just-lsp is a server implementation of the language server protocol for just, the command runner.

Screenshot 2025-03-19 at 2 19 48 PM

Installation

You can install the server using the cargo package manager:

cargo install just-lsp

Features

The server implements a decent amount of the language server protocol specification. This section aims to document some of them.

textDocument/completion

Completions are provided to you as you type. We currently show recipes, built-in functions, and constants.

textDocument/definition

You're able to go to a recipe definition from an identifier.

textDocument/documentHighlight

Like references, but highlights them inside the document.

textDocument/foldingRange

Code folding for recipes.

textDocument/hover

You can request hover information for syntactic elements like recipes, built-in functions, constants, etc. and see information about them.

textDocument/publishDiagnostics

We try to publish useful diagnostics. Some of them include checks for non-existent aliases, dependencies, and syntax errors.

textDocument/references

All references to an identifier can be shown. This includes aliases, dependencies, recipes, and more.

textDocument/rename

Workspace-wide symbol renaming is supported.

Development

I use Neovim to work on this project, and I load the development build of this server to test out my changes instantly. This section describes a development setup using Neovim as the LSP client, for other clients you would need to look up their respective documentation.

First, clone the repository:

git clone https://github.com/terror/just-lsp

Build the project:

cd just-lsp
cargo build

Add this to your editor configuration:

local lsp = require('lspconfig')

local configs = require('lspconfig.configs')

if not configs.just_lsp then
  configs.just_lsp = {
    default_config = {
      cmd = { '/path/to/just-lsp/target/debug/just-lsp' },
      filetypes = { 'just' },
      root_dir = function(fname)
        return lsp.util.find_git_ancestor(fname)
      end,
      settings = {},
    },
  }
end

local on_attach = function(client)
  -- Add your implementation here
end

local capabilities = {} -- Define what functionality the LSP client is able to handle

lsp.just_lsp.setup({
  on_attach = on_attach,
  capabilities = capabilities,
})

n.b. You'll need to replace /path/to/just-lsp/target/debug/just-lsp with the actual absolute path to the binary.

on_attach is a function that gets called after an LSP client gets attached to a buffer, mine just sets up a few mappings:

local on_attach = function(client)
  client.server_capabilities.semanticTokensProvider = nil

  map('n', '<leader>ar', '<cmd>lua vim.lsp.buf.rename()<CR>')
  map('n', '<leader>s', '<cmd>lua vim.lsp.buf.format({ async = true })<CR>')
  map('n', 'K', '<cmd>lua vim.lsp.buf.hover()<CR>')
  map('n', 'gd', '<cmd>lua vim.lsp.buf.definition()<CR>')
  map('n', 'gi', '<cmd>lua vim.lsp.buf.implementation()<CR>')
  map('n', 'gr', '<cmd>lua vim.lsp.buf.references()<CR>')
end

...and capabilities is a table defining what functionality the LSP client is able to handle, I use default capabilities provided by cmp-nvim-lsp:

local capabilities = require('cmp_nvim_lsp').default_capabilities()

n.b. This will require you to have the nvim-lspconfig (and optionally cmp-nvim-lsp) plugin installed.

Prior Art

Check out just, the command runner.

Dependencies

~11–22MB
~303K SLoC