languages/<id>.toml. The definition says which files belong to the language, how to highlight them, and which language server and debug adapter provide code intelligence and debugging. Everything a language server offers (completion, navigation, diagnostics, refactorings) then works through the same editor features for every language.
How language support works
Each open file gets its language from the definitions, checked in this order:- A per-file Override File Type (in the context menu of a file in the project tree or of an editor tab).
- An exact file name (
Dockerfile,go.mod) or a file name pattern. - The extension, longest match first (
.html.erbbefore.erb). - The first line: a shebang such as
#!/usr/bin/env python3, or a pattern such as<?php. - Otherwise the file is plain text.
- Highlighting is instant: it comes from a CodeMirror mode in the editor, or from the bundled tree-sitter grammar when the language has no mode.
- Structure (outline, folding and the symbols in the project index) comes from a bundled tree-sitter grammar and needs no setup.
- Code intelligence comes from one or more language servers (LSP). The IDE starts them when you open a file, using the nearest folder that contains one of the server’s root markers (
Cargo.toml,package.json,pom.xml, …) as the workspace root. - Debugging comes from a debug adapter (DAP).
Language servers and debug adapters run programs from your machine, so they start only in projects you trust.
Several servers for one language
A language can list more than one server:- Alternatives (shown as
a → bin the table below): only the first one that is installed runs. Python, for example, uses basedpyright, and falls back to pyright, ty or pyrefly only when basedpyright is missing. In Settings › Languages & Frameworks › Language Servers you can pick one of them or set the choice to Automatic (the first one available). - Additions (shown as
+ b): run next to the main server, usually only in projects that use them. Ruff joins basedpyright in projects with a Ruff configuration; oxlint joins vtsls in projects with an oxlint configuration; the Angular and Laravel servers join in Angular and Laravel projects.
Installing language servers and debuggers
OpenIDEA does not bundle language servers. When you open a file whose server is missing, a notification says that the server is not installed and offers Install, which installs it and restarts code insight for that language. You can also manage every tool on one page:1
Open the Language Servers page
Open Settings › Languages & Frameworks › Language Servers (
⌘, / Ctrl+Alt+S, then search for “Language
Servers”), or run the Language Servers… action from Find Action… (⌘⇧A / Ctrl+Shift+A).2
Find the tool
Filter by tool or language. Each entry shows whether the tool is installed by the IDE, found on your
PATH, set to
a custom executable, or missing.3
Install or point to your own copy
Click Install (or Reinstall) to let the IDE install it, or set Executable to a binary you installed
yourself.
sudo. It installs tools into its own tools folder in the local data directory (see Data directories and logs), using the method that fits each tool:
When the IDE looks for a server, it checks the executable you set in settings first, then its own tools folder, then your
PATH. Servers that the IDE cannot install (for example sourcekit-lsp, which comes with the Swift toolchain, or the Godot editor’s own server) show an install hint instead.
Configuring a server
Selecting a language server on the Language Servers page shows its settings, which are stored underlanguageServers.<name> in your settings (globally or per project):
- turn the server off, or choose which of several alternatives runs;
- Executable: the program to start;
- Startup: Arguments, Environment variables and Initialization options (changing these restarts the server);
- Workspace Configuration: the answer to the server’s
workspace/configurationrequests, applied without a restart.
Support matrix
The table lists every built-in language definition. Server and debugger names in bold can be installed from the IDE; the others you install yourself (the install hint in the IDE says how). “Highlighting” and “Tree-sitter” mark instant highlighting and the bundled grammar for outline and folding.
Notes:
- C, C++, Objective-C, Swift:
lldb-dapcomes with LLVM or Xcode. C and C++ can also be debugged with CodeLLDB or GDB 14+; see C and C++. - Ruby:
rdbgcomes from thedebuggem. - GDScript: the language server and debugger are the Godot editor itself; see Godot.
- Arduino: needs Arduino IDE 2 (Arduino Language Server, Arduino CLI and clangd).
- Vue: the Vue server and vtsls run together; vtsls handles the TypeScript part.
Run, test and debug
Run configurations are detected from the build files in your project. The table shows what is detected for each ecosystem; see Run configurations, Testing and Debugging for how to use them.
Running, testing (with a test tree and Rerun Failed Tests) and debugging are tested end to end on sample projects for TypeScript, Python, Rust, Go, Java, Kotlin and PHP; debugging is also tested for C and C++. Code intelligence is tested with each of these languages’ real servers (TypeScript, Python, Rust, Go, Java, Kotlin, PHP).
Changing or adding a language
- To change a built-in definition, put a file with the same
idin thelanguagesfolder of the configuration directory; it replaces the built-in one at the next start. See Add a language for the format. - Plugins can add languages, with their own servers and debuggers. See Language features.