- 为自己修改内置语言:在配置目录的
languages文件夹里放一个id相同的文件。它会整体替换内置定义(字段不会合并),所以最好从内置文件复制一份再改。 - 为自己添加语言:在同一个文件夹里放一个使用新
id的文件。 - 把语言提供给别人:放进插件(见 通过插件提供语言),或者加到仓库的
languages/目录。
这个文件夹只在启动时读取一次,修改后需要重启 IDE。无法解析的文件会被跳过,原因写在日志里。
示例
一个完整的定义,包含 tree-sitter 语法、语言服务器和调试器:languages/zig.toml
id 和 name 是必填的;只写这两项时,这类文件至少会在界面上显示正确的语言名。
语言字段
内置的 tree-sitter 语法:
bash、c、cmake、cpp、csharp、css、dart、elixir、gdscript、go、graphql、haskell、hcl、html、java、javascript、json、kotlin、lua、make、markdown、nix、ocaml、ocaml_interface、php、proto、python、ruby、rust、scala、swift、toml、tsx、typescript、xml、yaml、zig。新的语法需要编译进 IDE;没有语法的语言可以改由插件提供高亮和结构(见 语言功能)。
[[framework-ui-modes]]
按顺序第一个找到标记的条目生效。HTML 用它来支持 Angular 模板:
[[language-servers]]
每一项启动一个 LSP 服务器。服务器按顺序列出:普通服务器同时运行;fallback 服务器只有在排在它前面的服务器都缺失时才运行。
大部分配置用户都能在 设置 › 语言和框架 › 语言服务器 里按服务器覆盖(可执行文件、实参、环境变量、初始化选项、工作区配置),无需修改定义文件。
TCP 服务器
有些服务器只监听 TCP 端口,比如 Godot 编辑器内置的服务器。配置connect 后,如果该地址有程序在监听,IDE 直接连接;否则启动 command(已安装时),等它可以接受连接后再连接:参数里有 ${port} 时连接 127.0.0.1:${port}(端口由 IDE 选一个空闲的),否则连接 connect 地址。参数中的 ${root} 是工作区根目录。不是由 IDE 启动的服务器,IDE 也不会关闭它。
[debugger]
配置了
[debugger] 的语言,可以在其文件中设置断点。
formatter
外部格式化工具,在没有语言服务器能格式化该文件、或在设置中选择了它时使用:
通过插件提供语言
插件附带同样格式的文件,并在清单中声明:plugin.toml
language-servers.command、debugger.command)都需要 process:<program> 权限;未获授权的服务器会被忽略,但语言本身仍然可用。内置定义和用户定义优先:插件不能占用它们的 id、扩展名或文件名。插件侧的写法见 语言功能,完整示例见 plugins/official/solidity。
添加内置语言
要把语言加入 OpenIDEA 本身,新增languages/<id>.toml,并在 crates/ide-language/src/registry.rs 的 BUILTIN 表中注册(这些文件在构建时嵌入)。要让它的服务器支持一键安装,还需要在 crates/ide-tools/src/registry.rs 中添加同名条目。