Ruby
Ruby 支持通过Ruby 扩展提供。
- Tree-sitters
- 语言服务器
- 调试适配器:
rdbg
Ruby 扩展还提供对 ERB 文件的支持。
语言服务器
Ruby 有多种语言服务器可用。Zed 支持以下两种:
它们都具有重叠的功能集,例如自动补全、诊断、代码操作等,由您决定使用哪一个。请注意,您不能同时使用两者。
除了这两种语言服务器,Zed 还支持:
- rubocop,它是一个 Ruby 的静态代码分析器和 Linter。在底层,Zed 也将其用作语言服务器,但其功能与 solargraph 和 ruby-lsp 互补。
- sorbet,它是一个 Ruby 的静态类型检查器,具有自定义的渐进式类型系统。
- steep,它是一个 Ruby 的静态类型检查器,利用 Ruby Signature (RBS)。
- Herb,它是一个用于 ERB 文件的语言服务器。
配置语言服务器时,使用“dev: Open Language Server Logs”命令打开 LSP 日志窗口会有帮助。然后,您可以选择相应的语言实例以查看任何已记录的信息。
配置语言服务器
Ruby 扩展同时提供 solargraph 和 ruby-lsp 语言服务器支持。
语言服务器激活
对于所有支持的 Ruby 语言服务器(solargraph、ruby-lsp、rubocop、sorbet 和 steep),Ruby 扩展遵循以下激活序列:
- 如果在您的项目的
Gemfile中找到了语言服务器,它将通过bundle exec使用。 - 如果在
Gemfile中未找到,Ruby 扩展将在您的系统PATH中查找可执行文件。 - 如果在这两个位置都未找到语言服务器,Ruby 扩展将自动将其安装为全局 gem(注意:这不会安装到您当前的 Ruby gemset)。
您可以通过在设置中将 use_bundler 设置为 false 来跳过第 1 步并强制使用系统可执行文件
{
"lsp": {
"<SERVER_NAME>": {
"settings": {
"use_bundler": false
}
}
}
}
使用 solargraph
solargraph 在 Ruby 扩展中默认启用。
使用 ruby-lsp
要切换到 ruby-lsp,请将以下内容添加到您的 settings.json 中
{
"languages": {
"Ruby": {
"language_servers": ["ruby-lsp", "!solargraph", "!rubocop", "..."]
}
}
}
这将禁用 solargraph 和 rubocop,并启用 ruby-lsp。
使用 rubocop
Ruby 扩展还提供对 rubocop 语言服务器的支持,用于检测违规和自动更正。
要启用它,请将以下内容添加到您的 settings.json 中
{
"languages": {
"Ruby": {
"language_servers": ["ruby-lsp", "rubocop", "!solargraph", "..."]
}
}
}
或者,您可以通过将以下内容添加到您的 settings.json 中来禁用 ruby-lsp 并启用 solargraph 和 rubocop
{
"languages": {
"Ruby": {
"language_servers": ["solargraph", "rubocop", "!ruby-lsp", "..."]
}
}
}
设置 solargraph
Solargraph 默认禁用格式化和诊断。我们可以通过将以下内容添加到您的 settings.json 中来告诉 Zed 启用它们
{
"lsp": {
"solargraph": {
"initialization_options": {
"diagnostics": true,
"formatting": true
}
}
}
}
配置
Solargraph 从项目根目录中名为 .solargraph.yml 的文件读取其配置。有关此文件的更多信息,请参阅 Solargraph 配置文档。
设置 ruby-lsp
您可以将 Ruby LSP 配置传递给 initialization_options,例如:
{
"languages": {
"Ruby": {
"language_servers": ["ruby-lsp", "!solargraph", "..."]
}
},
"lsp": {
"ruby-lsp": {
"initialization_options": {
"enabledFeatures": {
// "someFeature": false
}
}
}
}
}
LSP settings 和 initialization_options 也可以是项目特定的。例如,要将 standardrb/standard 用作特定项目的格式化器和 Linter,请将此添加到项目仓库中的 .zed/settings.json 中
{
"lsp": {
"ruby-lsp": {
"initialization_options": {
"formatter": "standard",
"linters": ["standard"]
}
}
}
}
设置 rubocop LSP
Rubocop 默认禁用不安全的自动更正。我们可以通过将以下内容添加到您的 settings.json 中来告诉 Zed 启用它
{
"languages": {
"Ruby": {
// Use ruby-lsp as the primary language server and rubocop as the secondary.
"language_servers": ["ruby-lsp", "rubocop", "!solargraph", "..."]
}
},
"lsp": {
"rubocop": {
"initialization_options": {
"safeAutocorrect": false
}
},
"ruby-lsp": {
"initialization_options": {
"enabledFeatures": {
"diagnostics": false
}
}
}
}
}
设置 Sorbet
Sorbet 是一个流行的 Ruby 静态类型检查器,包含一个语言服务器。
要启用 Sorbet,请在您的 settings.json 中将 \"sorbet\" 添加到 Ruby 的 language_servers 列表中。如果 Sorbet 是您的主要 LSP,或者如果您计划将其与其他 LSP 一起用于特定功能(例如类型检查),您可能需要禁用其他语言服务器。
{
"languages": {
"Ruby": {
"language_servers": [
"ruby-lsp",
"sorbet",
"!rubocop",
"!solargraph",
"..."
]
}
}
}
有关安装 Sorbet、在项目中设置它以及配置其行为的所有方面,请参阅官方 Sorbet 文档。
设置 Steep
Steep 是一个 Ruby 静态类型检查器,它使用 RBS 文件来定义类型。
要启用 Steep,请在您的 settings.json 中将 \"steep\" 添加到 Ruby 的 language_servers 列表中。您可能需要根据所需的设置调整顺序或禁用其他 LSP。
{
"languages": {
"Ruby": {
"language_servers": [
"ruby-lsp",
"steep",
"!solargraph",
"!rubocop",
"..."
]
}
}
}
设置 Herb
Herb 默认对 HTML+ERB 语言启用。
将 Tailwind CSS 语言服务器与 Ruby 一起使用
可以在 Ruby 和 ERB 文件中使用 Tailwind CSS 语言服务器。
为此,您需要配置语言服务器,使其知道在 Ruby/ERB 文件中查找 CSS 类,方法是将以下内容添加到您的 settings.json 中
{
"languages": {
"Ruby": {
"language_servers": ["tailwindcss-language-server", "..."]
}
},
"lsp": {
"tailwindcss-language-server": {
"settings": {
"experimental": {
"classRegex": ["\\bclass:\\s*['\"]([^'\"]*)['\"]"]
}
}
}
}
}
通过这些设置,您将在 ERB 文件中的 HTML 属性中以及在 class: 键之后的 Ruby/ERB 字符串中获得 Tailwind CSS 类的补全。示例:
# Ruby file:
def method
div(class: "pl-2 <completion here>") do
p(class: "mt-2 <completion here>") { "Hello World" }
end
end
# ERB file:
<%= link_to "Hello", "/hello", class: "pl-2 <completion here>" %>
<a href="/hello" class="pl-2 <completion here>">Hello</a>
运行测试
要在您的 Ruby 项目中运行测试,您可以在本地 .zed/tasks.json 配置文件中设置自定义任务。这些任务可以定义为与不同的测试框架(如 Minitest、RSpec、quickdraw 和 tldr)一起使用。下面是一些如何在编辑器中设置这些任务来运行测试的示例。
Minitest 与 Rails
[
{
"label": "test $ZED_RELATIVE_FILE -n /$ZED_CUSTOM_RUBY_TEST_NAME/",
"command": "bin/rails",
"args": [
"test",
"$ZED_RELATIVE_FILE",
"-n",
"\"$ZED_CUSTOM_RUBY_TEST_NAME\""
],
"cwd": "$ZED_WORKTREE_ROOT",
"tags": ["ruby-test"]
}
]
Minitest
普通的 minitest 不支持按行号运行测试,只支持按名称运行,所以我们需要使用 $ZED_CUSTOM_RUBY_TEST_NAME 代替
[
{
"label": "-Itest $ZED_RELATIVE_FILE -n /$ZED_CUSTOM_RUBY_TEST_NAME/",
"command": "bundle",
"args": [
"exec",
"ruby",
"-Itest",
"$ZED_RELATIVE_FILE",
"-n",
"\"$ZED_CUSTOM_RUBY_TEST_NAME\""
],
"cwd": "$ZED_WORKTREE_ROOT",
"tags": ["ruby-test"]
}
]
RSpec
[
{
"label": "test $ZED_RELATIVE_FILE:$ZED_ROW",
"command": "bundle",
"args": ["exec", "rspec", "\"$ZED_RELATIVE_FILE:$ZED_ROW\""],
"cwd": "$ZED_WORKTREE_ROOT",
"tags": ["ruby-test"]
}
]
类似的任务语法可用于其他测试框架,例如 quickdraw 或 tldr。
调试
Ruby 扩展提供了一个用于调试 Ruby 代码的调试适配器。Zed 在 UI 和 debug.json 中将适配器命名为 rdbg,在底层,它使用 debug gem。该扩展使用与语言服务器相同的激活逻辑。
示例
调试 Ruby 脚本
[
{
"label": "Debug current file",
"adapter": "rdbg",
"request": "launch",
"script": "$ZED_FILE",
"cwd": "$ZED_WORKTREE_ROOT"
}
]
调试 Rails 服务器
[
{
"label": "Debug Rails server",
"adapter": "rdbg",
"request": "launch",
"command": "./bin/rails",
"args": ["server"],
"cwd": "$ZED_WORKTREE_ROOT",
"env": {
"RUBY_DEBUG_OPEN": "true"
}
}
]
格式化器
erb-formatter
要格式化 ERB 模板,您可以使用 erb-formatter 格式化器。此格式化器使用 erb-formatter gem 来格式化 ERB 模板。
{
"HTML+ERB": {
"formatter": {
"external": {
"command": "erb-formatter",
"arguments": ["--stdin-filename", "{buffer_path}"]
}
}
}
}