编辑器

此文件包含社区驱动的关于如何在 VS Code 以外的编辑器中设置 Ruby LSP 的说明。 对于 VS Code,请使用官方的 Ruby LSP 扩展

由于语言服务器协议的实现不完整,例如动态功能注册或 文件监视,一些 Ruby LSP 功能可能不可用或受到限制。

如果您希望启用或禁用功能或配置语言服务器的其他方面,请参阅 初始化选项

启动语言服务器的命令可能取决于您使用的编辑器和版本管理器的组合。为了正常工作,Ruby LSP 必须使用您正在使用的项目使用的 Ruby 版本以及设置正确的 Bundler 环境来启动。

如果您通常在 Ruby 环境已激活的 shell 会话中的终端启动编辑器,那么您可能只需使用 ruby-lsp 作为命令即可。

如果您看到与找不到正确的 gem 或无法找到 ruby-lsp 可执行文件相关的问题,那么您可能需要确保在尝试运行 ruby-lsp 可执行文件之前,版本管理器已正确配置环境。如何执行此操作将取决于您使用的版本管理器。以下是一些示例

如果您的版本管理器公开了一个命令以在当前 Ruby 的上下文中运行可执行文件,请使用该命令

  • mise x -- ruby-lsp
  • shadowenv exec -- ruby-lsp

如果您的版本管理器创建了执行自动版本切换的 gem 可执行文件垫片,请使用这些垫片

  • ~/.rbenv/shims/ruby-lsp
  • ~/.asdf/shims/ruby-lsp

如果您的版本管理器未提供以上任何一种,请激活环境并运行可执行文件

  • chruby $(cat .ruby-version) && ruby-lsp

这些策略将确保使用正确的 Ruby 版本、GEM_HOMEGEM_PATH 调用 ruby-lsp 可执行文件,这对于与您的项目正确集成至关重要。

所有初始化选项

每个 LSP 客户端都可以在启动时控制 LSP 的各种能力。 以下 JSON 字典包含所有可用的初始化选项。 通常,编辑器 LSP 客户端将使用其配置语言(JSON、Lua、ELisp 等)中的字典配置 LSP 服务器。

{
  "initializationOptions": {
    "enabledFeatures": {
      "codeActions": true,
      "codeLens": true,
      "completion": true,
      "definition": true,
      "diagnostics": true,
      "documentHighlights": true,
      "documentLink": true,
      "documentSymbols": true,
      "foldingRanges": true,
      "formatting": true,
      "hover": true,
      "inlayHint": true,
      "onTypeFormatting": true,
      "selectionRanges": true,
      "semanticHighlighting": true,
      "signatureHelp": true,
      "typeHierarchy": true,
      "workspaceSymbol": true
    },
    "featuresConfiguration": {
      "inlayHint": {
        "implicitHashValue": true,
        "implicitRescue": true
      }
    },
    "indexing": {
      "excludedPatterns": ["path/to/excluded/file.rb"],
      "includedPatterns": ["path/to/included/file.rb"],
      "excludedGems": ["gem1", "gem2", "etc."],
      "excludedMagicComments": ["compiled:true"]
    },
    "formatter": "auto",
    "linters": [],
    "experimentalFeaturesEnabled": false
  }
}

Emacs Eglot

Eglot 默认运行 solargraph 服务器。要使用 ruby-lsp 进行设置,您需要将其放入您的 init 文件中

(with-eval-after-load 'eglot
 (add-to-list 'eglot-server-programs '((ruby-mode ruby-ts-mode) "ruby-lsp")))

当您运行 eglot 命令时,它将为您运行 ruby-lsp 进程。

Neovim

注意:确保您正在使用 Neovim 0.10 或更新版本。

nvim-lspconfig

nvim-lspconfig 插件支持 Ruby LSP。

可以使用设置 LSP 时使用 init_options 键配置 Ruby LSP。

此配置风格的一个很好的示例是启用 Ruby LSP 的 Standard 附加组件,以启用格式化和拉取式诊断。以下代码片段为格式化和拉取式诊断 linting 启用了 standard

local lspconfig = require('lspconfig')
lspconfig.ruby_lsp.setup({
  init_options = {
    formatter = 'standard',
    linters = { 'standard' },
  },
})

Mason

您可以使用 mason.nvim 以及 mason-lspconfig.nvim

local capabilities = vim.lsp.protocol.make_client_capabilities()
local mason_lspconfig = require("mason-lspconfig")
local servers = {
  ruby_lsp = {},
}

mason_lspconfig.setup {
  ensure_installed = vim.tbl_keys(servers),
}

mason_lspconfig.setup_handlers {
  function(server_name)
    require("lspconfig")[server_name].setup {
      capabilities = capabilities,
      on_attach = on_attach,
      settings = servers[server_name],
      filetypes = (servers[server_name] or {}).filetypes,
    }
  end
}

使用 Mason 管理 Ruby LSP 的安装可能会导致错误

Mason 将 Ruby LSP 安装在您所有 Ruby 共享的文件夹中。一些 Ruby LSP 依赖项是 C 扩展,并且当它们链接到 Ruby 时,它们依赖于 Ruby ABI 以特定的方式查找和操作。当使用共享文件夹时,这会导致问题。

有关更多信息,请参阅 此问题

其他设置(可选)

rubyLsp/workspace/dependencies 是一个自定义方法,目前仅在 VS Code 插件中支持。以下代码片段添加了 ShowRubyDeps 命令以在快速修复列表中显示依赖项。

local function add_ruby_deps_command(client, bufnr)
  vim.api.nvim_buf_create_user_command(bufnr, "ShowRubyDeps", function(opts)
    local params = vim.lsp.util.make_text_document_params()
    local showAll = opts.args == "all"

    client.request("rubyLsp/workspace/dependencies", params, function(error, result)
      if error then
        print("Error showing deps: " .. error)
        return
      end

      local qf_list = {}
      for _, item in ipairs(result) do
        if showAll or item.dependency then
          table.insert(qf_list, {
            text = string.format("%s (%s) - %s", item.name, item.version, item.dependency),
            filename = item.path
          })
        end
      end

      vim.fn.setqflist(qf_list)
      vim.cmd('copen')
    end, bufnr)
  end,
  {nargs = "?", complete = function() return {"all"} end})
end

require("lspconfig").ruby_lsp.setup({
  on_attach = function(client, buffer)
    add_ruby_deps_command(client, buffer)
  end,
})

LazyVim LSP

截至 v12.33.0,Ruby LSP 是 Ruby 的默认 LSP。

为确保选择正确的 Ruby 版本,我们建议禁用 mason 选项,并将您的 Ruby 版本管理器的相应命令指定为绝对路径。 例如

return {
  {
    "neovim/nvim-lspconfig",
    opts = {
      servers = {
        ruby_lsp = {
          mason = false,
          cmd = { vim.fn.expand("~/.asdf/shims/ruby-lsp") },
        },
      },
    },
  },
}

Sublime Text LSP

要使用 Sublime Text 的 LSP 配置 Ruby LSP,请将以下配置添加到您的 LSP 客户端配置中

"clients": {
  "ruby-lsp": {
    "enabled": true,
    "command": [
      "ruby-lsp"
    ],
    "selector": "source.ruby",
    "initializationOptions": {
      "enabledFeatures": {
        "diagnostics": false
      },
      "experimentalFeaturesEnabled": true
    }
  }
}

重新启动 LSP 或 Sublime Text,当打开 ruby 文件时,ruby-lsp 将自动激活。

Zed

设置 Ruby LSP

Zed 在 Ruby 扩展的 v0.0.2 版本中添加了对 Ruby LSP 作为替代语言服务器的支持

有关限制的讨论,请参阅 https://github.com/zed-industries/zed/issues/4834。

RubyMine

您可以通过以下插件将 Ruby LSP 与 RubyMine(或 IntelliJ IDEA Ultimate)一起使用。

请注意,当与 RubyMine 一起使用时,可能会存在功能重叠,因为 IDE 提供了与 Ruby LSP 提供的功能相似的功能。

Ruby LSP 插件

Kate

Kate 的 LSP 客户端插件默认配置为使用 Solargraph 进行 Ruby。 要将其与 Ruby LSP 一起使用,您可以在 LSP 客户端插件的“用户服务器设置”中覆盖特定的配置项,如下所示

{
  "servers": {
    "ruby": {
      "command": ["ruby-lsp"],
      "url": "https://github.com/Shopify/ruby-lsp"
    }
  }
}

Kate 将为任何与 rootIndicationFileNames 匹配的 Ruby 项目在后台启动 Ruby LSP 服务器的实例。如果启动 Ruby LSP 成功,则激活 LSP 客户端菜单中的条目。否则,可以在“输出”窗口中检查错误输出。