fennel-ls/docs/manual.md
2024-09-07 11:12:32 -04:00

4.2 KiB

Manual

This document goes over how to set up fennel-ls.

Installation

fennel-ls Language Server Binary

On Linux or Mac OS,

$ git clone https://git.sr.ht/~xerool/fennel-ls
$ cd fennel-ls
$ make

will create a bleeding-edge latest git fennel-ls binary for you.

Arch Linux

I think fennel-ls and fennel-ls-git may be in the AUR.

Luarocks

Alternatively, fennel-ls is available in LuaRocks. Luarocks is kind of a pain to support though.

luarocks install fennel-ls

NixOS

If you are using NixOS, you can use the included /flake.nix or /default.nix.

Emacs

prerequisites: You have installed the fennel-ls binary.

For Emacs 30+, eglot will use fennel-ls automatically if its on the $PATH. For older versions:

(with-eval-after-load 'eglot
  (add-to-list 'eglot-server-programs '(fennel-mode . ("fennel-ls"))))

This code tells eglot to connect fennel-ls to your fennel-mode buffers.

Neovim

prerequisites: You have installed the fennel-ls binary. If you're using neovim+lspconfig, use this snippet:

require("lspconfig").fennel_ls.setup()

If you're also using mason and you want to install fennel-ls that way, you can use mason-lspconfig to ensure fennel-ls is installed:

require("mason-lspconfig").setup {
    ensure_installed = {"fennel_ls"}
}

Other editors

It should be possible to set up for other text editors, but the instructions depend on which editor you use. Generally you need to tell your editor:

  • "fennel-ls" is a language server program on the $PATH
  • it should be run for fennel files.

Configuration

fennel-ls can be configured by creating a file named flsproject.fnl in your workspace root. Any setting that isn't provided will be filled in with the defaults, which means that {} is a valid configuration with default settings. You can provide different settings in the same shape as the default settings to override the defaults.

The default flsproject.fnl settings are:

{:fennel-path "./?.fnl;./?/init.fnl;src/?.fnl;src/?/init.fnl"
 :macro-path "./?.fnl;./?/init-macros.fnl;./?/init.fnl;src/?.fnl;src/?/init-macros.fnl;src/?/init.fnl"
 :lua-version "lua54"
 :libraries {:love-2d false
             :tic-80 false}
 :extra-globals ""
 :lints {:unused-definition true
         :unknown-module-field true
         :unnecessary-method true
         :bad-unpack true
         :var-never-set true
         :op-with-no-arguments true
         :multival-in-middle-of-call true}}

extra-globals: Space separated list of allowed global identifiers; in addition to a set of predefined lua globals.

version: One of lua51, lua52, lua53, or lua54.

libraries: This setting controls which extra documentation fennel-ls can load in to your environment. I've only done this for tic-80 for now.

Usage

Fennel-ls cannot tell the difference between a regular file and a macro file. You can ask fennel-ls to treat your file as a macro file if the first line exactly matches ;; fennel-ls: macro-file. Expect this to change at some point in the future when I come up with a better way to specify which files are meant to be macro files.

Features

Feature Locals Fields Builtin Globals Across Files Builtins Macros User globals
Completions [X] [X] [X] [X] [X] [X] [ ]
Hover [X] [X] [X] [X] [X] [X] [ ]
Goto Definition [X] [X] N/A [X] N/A [ ] [ ]
Rename [X] [ ] N/A [ ] N/A [ ] [ ]
Goto Reference [X] [ ] [ ] [ ] [ ] [ ] [ ]

Fennel-ls can report all fennel compiler errors, plus a few custom lints.

CLI Usage

fennel-ls --lint my-file.fnl f2.fnl # prints diagnostics for the files given

This will analyze the given files, and print out all compiler errors and lints, without launching a server.