Ruby

Ruby 支持通过 Ruby 扩展提供。

Ruby 扩展还提供对 ERB 文件的支持。

语言服务器

有多个可用于 Ruby 的语言服务器。 Zed 支持以下两个

它们都具有自动完成、诊断、代码操作等重叠的功能集,您可以自行决定要使用哪一个。 请注意,您不能同时使用两者。

除了这两个语言服务器之外,Zed 还支持 rubocop,它是 Ruby 的静态代码分析器和 linter。 在底层,它也被 Zed 用作语言服务器,但其功能是对 solargraph 和 ruby-lsp 的补充。

配置语言服务器时,使用“debug: open language server logs”命令打开 LSP 日志窗口会很有帮助。 然后,您可以选择相应的语言实例以查看任何记录的信息。

配置语言服务器

Ruby 扩展提供 solargraphruby-lsp 语言服务器支持。

使用 solargraph

默认情况下,Ruby 扩展中启用了 solargraph

使用 ruby-lsp

要切换到 ruby-lsp,请将以下内容添加到您的 settings.json

{
  "languages": {
    "Ruby": {
      "language_servers": ["ruby-lsp", "!solargraph", "!rubocop", "..."]
    }
  }
}

这将禁用 solargraphrubocop 并启用 ruby-lsp

使用 rubocop

Ruby 扩展还为 rubocop 语言服务器提供支持,用于攻击检测和自动更正。

要启用它,请将以下内容添加到您的 settings.json

{
  "languages": {
    "Ruby": {
      "language_servers": ["ruby-lsp", "rubocop", "!solargraph", "..."]
    }
  }
}

或者,相反,您可以通过将以下内容添加到您的 settings.json 来禁用 ruby-lsp 并启用 solargraphrubocop

{
  "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 settingsinitialization_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"]
  }
]