Ruby

Ruby 支持通过Ruby 扩展提供。

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 扩展同时提供 solargraphruby-lsp 语言服务器支持。

语言服务器激活

对于所有支持的 Ruby 语言服务器(solargraphruby-lsprubocopsorbetsteep),Ruby 扩展遵循以下激活序列:

  1. 如果在您的项目的 Gemfile 中找到了语言服务器,它将通过 bundle exec 使用。
  2. 如果在 Gemfile 中未找到,Ruby 扩展将在您的系统 PATH 中查找可执行文件。
  3. 如果在这两个位置都未找到语言服务器,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", "..."]
    }
  }
}

这将禁用 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

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

类似的任务语法可用于其他测试框架,例如 quickdrawtldr

调试

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