Ruby
Ruby 支持通过 Ruby 扩展提供。
- Tree-sitters
- 语言服务器
Ruby 扩展还提供对 ERB 文件的支持。
语言服务器
有多个可用于 Ruby 的语言服务器。 Zed 支持以下两个
它们都具有自动完成、诊断、代码操作等重叠的功能集,您可以自行决定要使用哪一个。 请注意,您不能同时使用两者。
除了这两个语言服务器之外,Zed 还支持 rubocop,它是 Ruby 的静态代码分析器和 linter。 在底层,它也被 Zed 用作语言服务器,但其功能是对 solargraph 和 ruby-lsp 的补充。
配置语言服务器时,使用“debug: open language server logs”命令打开 LSP 日志窗口会很有帮助。 然后,您可以选择相应的语言实例以查看任何记录的信息。
配置语言服务器
Ruby 扩展提供 solargraph
和 ruby-lsp
语言服务器支持。
使用 solargraph
默认情况下,Ruby 扩展中启用了 solargraph
。
使用 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
Zed 目前不会自动安装 Solargraph。 要使用 Solargraph,您需要安装 gem。 Zed 只会在您的 PATH
上查找名为 solargraph
的可执行文件。
您可以使用以下命令手动安装 gem
gem install solargraph
或者,如果您的项目使用 Bundler,您可以将 Solargraph gem 添加到您的 Gemfile
gem 'solargraph', group: :development
默认情况下,Solargraph 禁用了格式化和诊断。 我们可以通过将以下内容添加到您的 settings.json
来告诉 Zed 启用它们
{
"lsp": {
"solargraph": {
"initialization_options": {
"diagnostics": true,
"formatting": true
}
}
}
}
默认情况下,Solargraph 使用 bundle exec
在 bundle 的上下文中运行。 要禁用它,您可以使用 use_bundler
配置选项
{
"lsp": {
"solargraph": {
"settings": {
"use_bundler": false
}
}
}
}
配置
Solargraph 从项目根目录中的名为 .solargraph.yml
的文件读取其配置。 有关此文件的更多信息,请参阅 Solargraph 配置文档。
设置 ruby-lsp
Zed 目前不会自动安装 Ruby LSP。 要使用 Ruby LSP,您需要安装 gem。 Zed 只会在您的 PATH
上查找名为 ruby-lsp
的可执行文件。
您可以使用以下命令手动安装 gem
gem install ruby-lsp
Ruby LSP 使用 Zed 尚不支持的基于拉取的诊断。 我们可以通过将以下内容添加到您的 settings.json
来告诉 Zed 禁用它
{
"languages": {
"Ruby": {
"language_servers": ["ruby-lsp", "!solargraph", "..."]
}
},
"lsp": {
"ruby-lsp": {
"initialization_options": {
"enabledFeatures": {
// This disables diagnostics
"diagnostics": false
}
}
}
}
}
LSP settings
和 initialization_options
也可以是项目特定的。 例如,要使用 standardrb/standard 作为特定项目的格式化程序和 linter,请将其添加到您的项目 repo 中的 .zed/settings.json
{
"lsp": {
"ruby-lsp": {
"initialization_options": {
"formatter": "standard",
"linters": ["standard"]
}
}
}
}
默认情况下,Ruby LSP 不使用 bundle exec
在 bundle 的上下文中运行。 要启用它,您可以使用 use_bundler
配置选项
{
"lsp": {
"ruby-lsp": {
"settings": {
"use_bundler": true
}
}
}
}
设置 rubocop
LSP
Zed 目前不会自动安装 rubocop
。 要使用 rubocop
,您需要安装 gem。 Zed 只会在您的 PATH
上查找名为 rubocop
的可执行文件。
您可以使用以下命令手动安装 gem
gem install rubocop
默认情况下,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
}
}
}
}
}
默认情况下,rubocop
使用 bundle exec
在 bundle 的上下文中运行。 要禁用它,您可以使用 use_bundler
配置选项
{
"lsp": {
"rubocop": {
"settings": {
"use_bundler": false
}
}
}
}
将 Tailwind CSS 语言服务器与 Ruby 结合使用
可以在 Ruby 和 ERB 文件中使用 Tailwind CSS 语言服务器。
为此,您需要配置语言服务器,使其知道在哪里查找 Ruby/ERB 文件中的 CSS 类,方法是将以下内容添加到您的 settings.json
{
"languages": {
"Ruby": {
"language_servers": ["tailwindcss-language-server", "..."]
}
},
"lsp": {
"tailwindcss-language-server": {
"settings": {
"includeLanguages": {
"erb": "html",
"ruby": "html"
},
"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)一起使用。 以下是一些关于如何设置这些任务以从编辑器中运行测试的示例。
带有 Rails 的 Minitest
[
{
"label": "test $ZED_RELATIVE_FILE -n /$ZED_SYMBOL/",
"command": "bin/rails test $ZED_RELATIVE_FILE -n /$ZED_SYMBOL/",
"tags": ["ruby-test"]
}
]
注意:由于引号的处理方式,我们不能在此处使用 args
。
Minitest
普通的 minitest 不支持按行号运行测试,仅支持按名称运行测试,因此我们需要使用 $ZED_SYMBOL
代替
[
{
"label": "-Itest $ZED_RELATIVE_FILE -n /$ZED_SYMBOL/",
"command": "bundle exec ruby",
"args": ["-Itest", "$ZED_RELATIVE_FILE", "-n /$ZED_SYMBOL/"],
"tags": ["ruby-test"]
}
]
RSpec
[
{
"label": "test $ZED_RELATIVE_FILE:$ZED_ROW",
"command": "bundle exec rspec",
"args": ["\"$ZED_RELATIVE_FILE:$ZED_ROW\""],
"tags": ["ruby-test"]
}
]
quickdraw
[
{
"label": "test $ZED_RELATIVE_FILE:$ZED_ROW",
"command": "bundle exec qt",
"args": ["\"$ZED_RELATIVE_FILE:$ZED_ROW\""],
"tags": ["ruby-test"]
}
]
tldr
[
{
"label": "test $ZED_RELATIVE_FILE:$ZED_ROW",
"command": "bundle exec tldr",
"args": ["\"$ZED_RELATIVE_FILE:$ZED_ROW\""],
"tags": ["ruby-test"]
}
]