configuring-languages.md

  1---
  2title: Language Server and Tree-sitter Config - Zed
  3description: Configure language support in Zed with Tree-sitter for syntax highlighting and LSP for diagnostics, completion, and formatting.
  4---
  5
  6# Configuring Supported Languages
  7
  8Zed's language support is built on two technologies:
  9
 101. **Tree-sitter** handles syntax highlighting and structure-based features like the outline panel.
 112. **Language Server Protocol (LSP)** provides semantic features: code completion, diagnostics, go-to-definition, and refactoring.
 12
 13This page covers language-specific settings, file associations, language server configuration, formatting, linting, and syntax highlighting.
 14
 15For a list of supported languages, see [Supported Languages](./languages.md). To add support for new languages, see [Language Extensions](./extensions/languages.md).
 16
 17## Language-specific Settings
 18
 19Zed allows you to override global settings for individual languages. These custom configurations are defined in your `settings.json` file under the `languages` key.
 20
 21Here's an example of language-specific settings:
 22
 23```json [settings]
 24"languages": {
 25  "Python": {
 26    "tab_size": 4,
 27    "formatter": "language_server",
 28    "format_on_save": "on"
 29  },
 30  "JavaScript": {
 31    "tab_size": 2,
 32    "formatter": {
 33      "external": {
 34        "command": "prettier",
 35        "arguments": ["--stdin-filepath", "{buffer_path}"]
 36      }
 37    }
 38  }
 39}
 40```
 41
 42You can customize a wide range of settings for each language, including:
 43
 44- [`tab_size`](./reference/all-settings.md#tab-size): The number of spaces for each indentation level
 45- [`formatter`](./reference/all-settings.md#formatter): The tool used for code formatting
 46- [`format_on_save`](./reference/all-settings.md#format-on-save): Whether to automatically format code when saving
 47- [`enable_language_server`](./reference/all-settings.md#enable-language-server): Toggle language server support
 48- [`hard_tabs`](./reference/all-settings.md#hard-tabs): Use tabs instead of spaces for indentation
 49- [`preferred_line_length`](./reference/all-settings.md#preferred-line-length): The recommended maximum line length
 50- [`soft_wrap`](./reference/all-settings.md#soft-wrap): How to wrap long lines of code
 51- [`show_completions_on_input`](./reference/all-settings.md#show-completions-on-input): Whether or not to show completions as you type
 52- [`show_completion_documentation`](./reference/all-settings.md#show-completion-documentation): Whether to display inline and alongside documentation for items in the completions menu
 53- [`colorize_brackets`](./reference/all-settings.md#colorize-brackets): Whether to use tree-sitter bracket queries to detect and colorize the brackets in the editor (also known as "rainbow brackets")
 54
 55These settings allow you to maintain specific coding styles across different languages and projects.
 56
 57## File Associations
 58
 59Zed automatically detects file types based on their extensions, but you can customize these associations to fit your workflow.
 60
 61To set up custom file associations, use the [`file_types`](./reference/all-settings.md#file-types) setting in your `settings.json`:
 62
 63```json [settings]
 64"file_types": {
 65  "C++": ["c"],
 66  "TOML": ["MyLockFile"],
 67  "Dockerfile": ["Dockerfile*"]
 68}
 69```
 70
 71This configuration tells Zed to:
 72
 73- Treat `.c` files as C++ instead of C
 74- Recognize files named "MyLockFile" as TOML
 75- Apply Dockerfile syntax to any file starting with "Dockerfile"
 76
 77You can use glob patterns for more flexible matching, allowing you to handle complex naming conventions in your projects.
 78
 79## Working with Language Servers
 80
 81Language servers are a crucial part of Zed's intelligent coding features, providing capabilities like auto-completion, go-to-definition, and real-time error checking.
 82
 83### What are Language Servers?
 84
 85Language servers implement the Language Server Protocol (LSP), which standardizes communication between the editor and language-specific tools. This allows Zed to support advanced features for multiple programming languages without implementing each feature separately.
 86
 87Some key features provided by language servers include:
 88
 89- Code completion
 90- Error checking and diagnostics
 91- Code navigation (go to definition, find references)
 92- Code actions (Rename, extract method)
 93- Hover information
 94- Workspace symbol search
 95
 96### Managing Language Servers
 97
 98Zed simplifies language server management for users:
 99
1001. Automatic Download: When you open a file with a matching file type, Zed automatically downloads the appropriate language server. Zed may prompt you to install an extension for known file types.
101
1022. Storage Location:
103
104   - macOS: `~/Library/Application Support/Zed/languages`
105   - Linux: `$XDG_DATA_HOME/zed/languages`, `$FLATPAK_XDG_DATA_HOME/zed/languages`, or `$HOME/.local/share/zed/languages`
106
1073. Automatic Updates: Zed keeps your language servers up-to-date, ensuring you always have the latest features and improvements.
108
109### Choosing Language Servers
110
111Some languages in Zed offer multiple language server options. You might have multiple extensions installed that bundle language servers targeting the same language, potentially leading to overlapping capabilities. To ensure you get the functionality you prefer, Zed allows you to prioritize which language servers are used and in what order.
112
113You can specify your preference using the `language_servers` setting:
114
115```json [settings]
116  "languages": {
117    "PHP": {
118      "language_servers": ["intelephense", "!phpactor", "!phptools", "..."]
119    }
120  }
121```
122
123In this example:
124
125- `intelephense` is set as the primary language server
126- `phpactor` is disabled (note the `!` prefix)
127- `...` expands to the rest of the language servers that are registered for PHP
128
129This configuration allows you to tailor the language server setup to your specific needs, ensuring that you get the most suitable functionality for your development workflow.
130
131### Toolchains
132
133Some language servers need to be configured with a current "toolchain", which is an installation of a specific version of a programming language compiler or/and interpreter, which can possibly include a full set of dependencies of a project.
134An example of what Zed considers a toolchain is a virtual environment in Python.
135Not all languages in Zed support toolchain discovery and selection, but for those that do, you can specify the toolchain from a toolchain picker (via {#action toolchain::Select}). To learn more about toolchains in Zed, see [`toolchains`](./toolchains.md).
136
137### Configuring Language Servers
138
139> **Changed in Preview (v0.225).** See [release notes](/releases#0.225).
140
141When configuring language servers in your `settings.json`, autocomplete suggestions include all available LSP adapters recognized by Zed, not only those currently active for loaded languages. This helps you discover and configure language servers before opening files that use them.
142
143Many language servers accept custom configuration options. You can set these in the `lsp` section of your `settings.json`:
144
145```json [settings]
146  "lsp": {
147    "rust-analyzer": {
148      "initialization_options": {
149        "check": {
150          "command": "clippy"
151        }
152      }
153    }
154  }
155```
156
157This example configures the Rust Analyzer to use Clippy for additional linting when saving files.
158
159#### Nested objects
160
161When configuring language server options in Zed, it's important to use nested objects rather than dot-delimited strings. This is particularly relevant when working with more complex configurations. Let's look at a real-world example using the TypeScript language server:
162
163Suppose you want to configure the following settings for TypeScript:
164
165- Enable strict null checks
166- Set the target ECMAScript version to ES2020
167
168Here's how you would structure these settings in Zed's `settings.json`:
169
170```json [settings]
171"lsp": {
172  "typescript-language-server": {
173    "initialization_options": {
174      // These are not supported (VSCode dotted style):
175      // "preferences.strictNullChecks": true,
176      // "preferences.target": "ES2020"
177      //
178      // These is correct (nested notation):
179      "preferences": {
180        "strictNullChecks": true,
181        "target": "ES2020"
182      },
183    }
184  }
185}
186```
187
188#### Possible configuration options
189
190Depending on how a particular language server is implemented, they may depend on different configuration options, both specified in the LSP.
191
192- [initializationOptions](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#version_3_17_0)
193
194Sent once during language server startup, requires server's restart to reapply changes.
195
196For example, rust-analyzer and clangd rely on this way of configuring only.
197
198```json [settings]
199  "lsp": {
200    "rust-analyzer": {
201      "initialization_options": {
202        "checkOnSave": false
203      }
204    }
205  }
206```
207
208- [Configuration Request](https://microsoft.github.io/language-server-protocol/specifications/lsp/3.17/specification/#workspace_configuration)
209
210May be queried by the server multiple times.
211Most of the servers would rely on this way of configuring only.
212
213```json [settings]
214"lsp": {
215  "tailwindcss-language-server": {
216    "settings": {
217      "tailwindCSS": {
218        "emmetCompletions": true,
219      },
220    }
221  }
222}
223```
224
225Apart of the LSP-related server configuration options, certain servers in Zed allow configuring the way binary is launched by Zed.
226
227Language servers are automatically downloaded or launched if found in your path, if you wish to specify an explicit alternate binary you can specify that in settings:
228
229```json [settings]
230  "lsp": {
231    "rust-analyzer": {
232      "binary": {
233        // Whether to fetch the binary from the internet, or attempt to find locally.
234        "ignore_system_version": false,
235        "path": "/path/to/langserver/bin",
236        "arguments": ["--option", "value"],
237        "env": {
238          "FOO": "BAR"
239        }
240      }
241    }
242  }
243```
244
245### Enabling or Disabling Language Servers
246
247You can toggle language server support globally or per-language:
248
249```json [settings]
250  "languages": {
251    "Markdown": {
252      "enable_language_server": false
253    }
254  }
255```
256
257This disables the language server for Markdown files, which can be useful for performance in large documentation projects. You can configure this globally in your `~/.config/zed/settings.json` or inside a `.zed/settings.json` in your project directory.
258
259## Formatting and Linting
260
261Zed provides support for code formatting and linting to maintain consistent code style and catch potential issues early.
262
263### Configuring Formatters
264
265Zed supports both built-in and external formatters. See [`formatter`](./reference/all-settings.md#formatter) docs for more. You can configure formatters globally or per-language in your `settings.json`:
266
267```json [settings]
268"languages": {
269  "JavaScript": {
270    "formatter": {
271      "external": {
272        "command": "prettier",
273        "arguments": ["--stdin-filepath", "{buffer_path}"]
274      }
275    },
276    "format_on_save": "on"
277  },
278  "Rust": {
279    "formatter": "language_server",
280    "format_on_save": "on"
281  }
282}
283```
284
285This example uses Prettier for JavaScript and the language server's formatter for Rust, both set to format on save.
286
287To disable formatting for a specific language:
288
289```json [settings]
290"languages": {
291  "Markdown": {
292    "format_on_save": "off"
293  }
294}
295```
296
297### Setting Up Linters
298
299Linting in Zed is typically handled by language servers. Many language servers allow you to configure linting rules:
300
301```json [settings]
302"lsp": {
303  "eslint": {
304    "settings": {
305      "codeActionOnSave": {
306        "rules": ["import/order"]
307      }
308    }
309  }
310}
311```
312
313This configuration sets up ESLint to organize imports on save for JavaScript files.
314
315To run linter fixes automatically on save:
316
317```json [settings]
318"languages": {
319  "JavaScript": {
320    "formatter": {
321      "code_action": "source.fixAll.eslint"
322    }
323  }
324}
325```
326
327### Integrating Formatting and Linting
328
329Zed allows you to run both formatting and linting on save. Here's an example that uses Prettier for formatting and ESLint for linting JavaScript files:
330
331```json [settings]
332"languages": {
333  "JavaScript": {
334    "formatter": [
335      {
336        "code_action": "source.fixAll.eslint"
337      },
338      {
339        "external": {
340          "command": "prettier",
341          "arguments": ["--stdin-filepath", "{buffer_path}"]
342        }
343      }
344    ],
345    "format_on_save": "on"
346  }
347}
348```
349
350### Troubleshooting
351
352If you encounter issues with formatting or linting:
353
3541. Check Zed's log file for error messages (Use the command palette: `zed: open log`)
3552. Ensure external tools (formatters, linters) are correctly installed and in your PATH
3563. Verify configurations in both Zed settings and language-specific config files (e.g., `.eslintrc`, `.prettierrc`)
357
358## Syntax Highlighting and Themes
359
360Zed offers customization options for syntax highlighting and themes, allowing you to tailor the visual appearance of your code.
361
362### Customizing Syntax Highlighting
363
364Zed uses Tree-sitter grammars for syntax highlighting. Override the default highlighting using the `theme_overrides` setting.
365
366This example makes comments italic and changes the color of strings:
367
368```json [settings]
369"theme_overrides": {
370  "One Dark": {
371    "syntax": {
372      "comment": {
373        "font_style": "italic"
374      },
375      "string": {
376        "color": "#00AA00"
377      }
378    }
379  }
380}
381```
382
383### Selecting and Customizing Themes
384
385Change your theme:
386
3871. Use the theme selector ({#kb theme_selector::Toggle})
3882. Or set it in your `settings.json`:
389
390```json [settings]
391"theme": {
392  "mode": "dark",
393  "dark": "One Dark",
394  "light": "GitHub Light"
395}
396```
397
398Create custom themes by creating a JSON file in `~/.config/zed/themes/`. Zed will automatically detect and make available any themes in this directory.
399
400### Using Theme Extensions
401
402Zed supports theme extensions. Browse and install theme extensions from the Extensions panel ({#kb zed::Extensions}).
403
404To create your own theme extension, refer to the [Developing Theme Extensions](./extensions/themes.md) guide.
405
406## Using Language Server Features
407
408### Semantic Tokens
409
410Semantic tokens provide richer syntax highlighting by using type and scope information from language servers. Enable them with the `semantic_tokens` setting:
411
412```json [settings]
413"semantic_tokens": "combined"
414```
415
416- `"off"` — Tree-sitter highlighting only (default)
417- `"combined"` — LSP semantic tokens overlaid on tree-sitter
418- `"full"` — LSP semantic tokens replace tree-sitter entirely
419
420You can customize token colors and styles through `global_lsp_settings.semantic_token_rules` in your settings.
421
422→ [Semantic Tokens documentation](./semantic-tokens.md)
423
424### Inlay Hints
425
426Inlay hints provide additional information inline in your code, such as parameter names or inferred types. Configure inlay hints in your `settings.json`:
427
428```json [settings]
429"inlay_hints": {
430  "enabled": true,
431  "show_type_hints": true,
432  "show_parameter_hints": true,
433  "show_other_hints": true
434}
435```
436
437For language-specific inlay hint settings, refer to the documentation for each language.
438
439### Code Actions
440
441Code actions provide quick fixes and refactoring options. Access code actions using the `editor: Toggle Code Actions` command or by clicking the lightbulb icon that appears next to your cursor when actions are available.
442
443### Go To Definition and References
444
445Use these commands to navigate your codebase:
446
447- `editor: Go to Definition` (<kbd>f12|f12</kbd>)
448- `editor: Go to Type Definition` (<kbd>cmd-f12|ctrl-f12</kbd>)
449- `editor: Find All References` (<kbd>shift-f12|shift-f12</kbd>)
450
451### Rename Symbol
452
453To rename a symbol across your project:
454
4551. Place your cursor on the symbol
4562. Use the `editor: Rename Symbol` command (<kbd>f2|f2</kbd>)
4573. Enter the new name and press Enter
458
459These features depend on the capabilities of the language server for each language.
460
461When renaming a symbol that spans multiple files, Zed will open a preview in a multibuffer. This allows you to review all the changes across your project before applying them. To confirm the rename, simply save the multibuffer. If you decide not to proceed with the rename, you can undo the changes or close the multibuffer without saving.
462
463### Hover Information
464
465Use the `editor: Hover` command to display information about the symbol under the cursor. This often includes type information, documentation, and links to relevant resources.
466
467### Workspace Symbol Search
468
469The {#action project_symbols::Toggle} command allows you to search for symbols (functions, classes, variables) across your entire project. This is useful for quickly navigating large codebases.
470
471### Code Completion
472
473Zed provides intelligent code completion suggestions as you type. You can manually trigger completion with the `editor: Show Completions` command. Use <kbd>tab|tab</kbd> or <kbd>enter|enter</kbd> to accept suggestions.
474
475### Diagnostics
476
477Language servers provide real-time diagnostics (errors, warnings, hints) as you code. View all diagnostics for your project using the {#action diagnostics::Deploy} command.