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```