语言 / LSP 配置

特定的语言设置和语言服务器的设置在 languages.toml 文件中进行配置。

languages.toml 文件

有三个可能的 languages.toml 文件。第一个被编译进 Helix,在 Helix 仓库可看到。这提供了语言和语言服务器的默认配置。

你可以在 配置目录 中定义自己的 languages.toml,它会覆盖内置语言配置中的值。例如,禁用 Rust 的自动 LSP 代码格式化:

# in <config_dir>/helix/languages.toml

[[language]]
name = "rust"
auto-format = false

也可以在项目目录的 .helix 文件夹下创建 languages.toml 文件来覆盖语言配置。其设置将与配置目录中的语言配置和内置配置合并。

语言配置

每种语言都是通过在 languages.toml 文件中添加 [[Language]] 来配置的。例如:

[[language]]
name = "mylang"
scope = "source.mylang"
injection-regex = "^mylang$"
file-types = ["mylang", "myl"]
comment-token = "#"
indent = { tab-width = 2, unit = "  " }
language-server = { command = "mylang-lsp", args = ["--stdio"] }
formatter = { command = "mylang-formatter" , args = ["--stdin"] }

支持以下配置键:

描述
name语言的名称
scopesource.js 的字符串,它标识了语言。目前我们尽量把 scope name 匹配常用的 TextMate 语法和 Linguist 库;通常是 source.<name>text.<name> 形式(以防标记语言)
injection-regex针对语言名称进行测试的正则模式,用来确定这个语言是否应该使用 language injection
file-types语言的文件类型,比如 ["yml", "yaml"];支持拓展名和完整的文件名
shebangsshebang 行的解释器,比如 ["sh", "bash"]
roots一组用于搜索标记文件,以找到工作空间的根目录比如 Cargo.lockyarn.lock
auto-format是否保存文件是自动格式化
diagnostic-severity用于显示的最低程度的诊断;允许的值有 Error, Warning, Info, Hint
comment-token用于注释的标记
indent使用什么样的缩进;子键有 tab-widthunit
language-server所运行的语言服务器,见下文
config语言服务器配置
grammar使用的 tree-sitter 语法;默认为 name 的值
formatter格式化程序,定义之后优先于 lsp 使用;它必须从 stdin 输入源文件,从 stdout 写出成格式化之后的文件
max-line-length一行的最大长度,用于 :reflow 命令

语言服务器配置

language-server 键采用以下键:

按键描述
command要执行的语言服务器二进制文件的名称,二进制文件必须位于 $PATH
args传递给语言服务器二进制文件的参数列表
timeout向语言服务器发出请求可能需要的最长时间,以秒为单位,默认为 20
language-id传递给语言服务器的语言名称:某些语言服务器支持多种语言,并使用此字段来确定缓冲区中提供的是哪种语言

顶级 config 键用于配置 LSP 初始化选项。 config 中的 format 子表用于将额外的格式化选项传递给 文档格式化请求。例如,对于 typescript:

[[language]]
name = "typescript"
auto-format = true
# pass format options according to https://github.com/typescript-language-server/typescript-language-server#workspacedidchangeconfiguration omitting the "[language].format." prefix.
config = { format = { "semicolons" = "insert", "insertSpaceBeforeFunctionParenthesis" = true } }

Tree-sitter 语法配置

语言的 tree-sitter 语法来源在 languages.toml 中的 [[grammar]] 中指定。例如:

[[grammar]]
name = "mylang"
source = { git = "https://github.com/example/mylang", rev = "a250c4582510ff34767ec3b7dcdd3c24e8c8aa68" }

语法配置采用以下键:

描述
nametree-sitter 语法的名字
source获取语法的方法,一个具有下面定义模式的表

其中,source 是来自 git 语法仓库的表:

Description 描述
git克隆语法的远程 git URL
rev获取的修订(commit hash 或 tag)
subpath语法目录中应构建的路径。一些语法库托管多个语法,例如 tree-sitter-typescripttree-sitter-ocaml 子目录。此键用于指向 hx --grammar build 编译到正确的路径;省略时,使用根目录

选择语法

在使用 hx --grammar fetch hx --grammar build 时,你可以使用顶级的 use-grammars 键来控制获取和构建哪些语法。

# Note: this key must come **before** the [[language]] and [[grammar]] sections
use-grammars = { only = [ "rust", "c", "cpp" ] }
# or
use-grammars = { except = [ "yaml", "json" ] }

如果省略,则获取并构建所有语法。