elixir.md

  1---
  2title: Elixir
  3description: "Configure Elixir language support in Zed, including language servers, formatting, and debugging."
  4---
  5
  6# Elixir
  7
  8Elixir support is available through the [Elixir extension](https://github.com/zed-extensions/elixir).
  9
 10- Tree-sitter:
 11  - [elixir-lang/tree-sitter-elixir](https://github.com/elixir-lang/tree-sitter-elixir)
 12  - [phoenixframework/tree-sitter-heex](https://github.com/phoenixframework/tree-sitter-heex)
 13- Language servers:
 14  - [elixir-lang/expert](https://github.com/elixir-lang/expert)
 15  - [elixir-lsp/elixir-ls](https://github.com/elixir-lsp/elixir-ls)
 16  - [elixir-tools/next-ls](https://github.com/elixir-tools/next-ls)
 17  - [lexical-lsp/lexical](https://github.com/lexical-lsp/lexical)
 18
 19## Choosing a language server
 20
 21The Elixir extension offers language server support for `expert`, `elixir-ls`, `next-ls`, and `lexical`.
 22
 23`elixir-ls` is enabled by default.
 24
 25### Expert
 26
 27Configure language servers in Settings ({#kb zed::OpenSettings}) under Languages > Elixir, or add to your settings file:
 28
 29```json [settings]
 30  "languages": {
 31    "Elixir": {
 32      "language_servers": ["expert", "!elixir-ls", "!next-ls", "!lexical", "..."]
 33    },
 34    "HEEX": {
 35      "language_servers": ["expert", "!elixir-ls", "!next-ls", "!lexical", "..."]
 36    }
 37  }
 38```
 39
 40### Next LS
 41
 42Configure language servers in Settings ({#kb zed::OpenSettings}) under Languages > Elixir, or add to your settings file:
 43
 44```json [settings]
 45  "languages": {
 46    "Elixir": {
 47      "language_servers": ["next-ls", "!expert", "!elixir-ls", "!lexical", "..."]
 48    },
 49    "HEEX": {
 50      "language_servers": ["next-ls", "!expert", "!elixir-ls", "!lexical", "..."]
 51    }
 52  }
 53```
 54
 55### Lexical
 56
 57Configure language servers in Settings ({#kb zed::OpenSettings}) under Languages > Elixir, or add to your settings file:
 58
 59```json [settings]
 60  "languages": {
 61    "Elixir": {
 62      "language_servers": ["lexical", "!expert", "!elixir-ls", "!next-ls", "..."]
 63    },
 64    "HEEX": {
 65      "language_servers": ["lexical", "!expert", "!elixir-ls", "!next-ls", "..."]
 66    }
 67  }
 68```
 69
 70## Setting up `elixir-ls`
 71
 721. Install `elixir`:
 73
 74```sh
 75brew install elixir
 76```
 77
 782. Install `elixir-ls`:
 79
 80```sh
 81brew install elixir-ls
 82```
 83
 843. Restart Zed
 85
 86> If `elixir-ls` is not running in an elixir project, check the error log via the command palette action `zed: open log`. If you find an error message mentioning: `invalid LSP message header "Shall I install Hex? (if running non-interactively, use \"mix local.hex --force\") [Yn]`, you might need to install [`Hex`](https://hex.pm). You run `elixir-ls` from the command line and accept the prompt to install `Hex`.
 87
 88### Formatting with Mix
 89
 90If you prefer to format your code with [Mix](https://hexdocs.pm/mix/Mix.html), configure it as an external formatter. Formatting will occur on file save.
 91
 92Configure formatting in Settings ({#kb zed::OpenSettings}) under Languages > Elixir, or add to your settings file:
 93
 94```json [settings]
 95{
 96  "languages": {
 97    "Elixir": {
 98      "format_on_save": "on",
 99      "formatter": {
100        "external": {
101          "command": "mix",
102          "arguments": ["format", "--stdin-filename", "{buffer_path}", "-"]
103        }
104      }
105    }
106  }
107}
108```
109
110### Additional workspace configuration options
111
112You can pass additional elixir-ls workspace configuration options via `lsp` settings in your settings file ([how to edit](../configuring-zed.md#settings-files)).
113
114The following example disables dialyzer:
115
116```json [settings]
117  "lsp": {
118    "elixir-ls": {
119      "settings": {
120        "dialyzerEnabled": false
121      }
122    }
123  }
124```
125
126See [ElixirLS configuration settings](https://github.com/elixir-lsp/elixir-ls#elixirls-configuration-settings) for more options.
127
128### HEEx
129
130Zed also supports HEEx templates. HEEx is a mix of [EEx](https://hexdocs.pm/eex/1.12.3/EEx.html) (Embedded Elixir) and HTML, and is used in Phoenix LiveView applications.
131
132- Tree-sitter: [phoenixframework/tree-sitter-heex](https://github.com/phoenixframework/tree-sitter-heex)
133
134#### Using the Tailwind CSS Language Server with HEEx
135
136To get all features (autocomplete, linting, and hover docs) from the [Tailwind CSS language server](https://github.com/tailwindlabs/tailwindcss-intellisense/tree/HEAD/packages/tailwindcss-language-server#readme) in HEEx files, add the following to your settings file ([how to edit](../configuring-zed.md#settings-files)):
137
138```json [settings]
139{
140  "lsp": {
141    "tailwindcss-language-server": {
142      "settings": {
143        "includeLanguages": {
144          "phoenix-heex": "html"
145        },
146        "experimental": {
147          "classRegex": ["class=\"([^\"]*)\"", "class='([^']*)'"]
148        }
149      }
150    }
151  }
152}
153```
154
155With these settings, you will get completions for Tailwind CSS classes in HEEx template files. Examples:
156
157```heex
158<%!-- Standard class attribute --%>
159<div class="flex items-center <completion here>">
160  <p class="text-lg font-bold <completion here>">Hello World</p>
161</div>
162
163<%!-- With Elixir expression --%>
164<div class={"flex #{@custom_class} <completion here>"}>
165  Content
166</div>
167
168<%!-- With Phoenix function --%>
169<div class={class_list(["flex", "items-center", "<completion here>"])}>
170  Content
171</div>
172```