配置支持的语言

Zed 为其支持的每种编程语言提供了强大的自定义选项。本指南将引导您了解各种方式,以根据您的偏好和项目要求定制您的编码体验。

Zed 的语言支持基于两种主要技术

  1. Tree-sitter:处理语法高亮和基于结构的功能,例如大纲面板。
  2. 语言服务器协议 (LSP):提供语义功能,例如代码补全和诊断。

这些组件协同工作以提供 Zed 的语言功能。

在本指南中,我们将介绍

  • 特定语言设置
  • 文件关联
  • 使用语言服务器
  • 格式化和 linting 配置
  • 自定义语法高亮和主题
  • 高级语言功能

阅读本指南后,您应该了解如何在 Zed 中配置和自定义支持的语言。

有关 Zed 支持的语言及其特定配置的完整列表,请参阅我们的支持的语言页面。要进一步探索,您可以开发自己的扩展程序,以添加对其他语言的支持或增强现有功能。有关创建语言扩展程序的更多信息,请参阅我们的语言扩展程序指南。

特定语言设置

Zed 允许您为单个语言覆盖全局设置。这些自定义配置在您的settings.json文件中定义,位于languages键下。

以下是特定语言设置的示例

"languages": {
  "Python": {
    "tab_size": 4,
    "formatter": "language_server",
    "format_on_save": "on"
  },
  "JavaScript": {
    "tab_size": 2,
    "formatter": {
      "external": {
        "command": "prettier",
        "arguments": ["--stdin-filepath", "{buffer_path}"]
      }
    }
  }
}

您可以为每种语言自定义各种设置,包括

这些设置允许您在不同语言和项目中保持特定的编码风格。

文件关联

Zed 自动根据文件扩展名检测文件类型,但您可以自定义这些关联以适应您的工作流程。

要设置自定义文件关联,请在您的settings.json中使用file_types设置

"file_types": {
  "C++": ["c"],
  "TOML": ["MyLockFile"],
  "Dockerfile": ["Dockerfile*"]
}

此配置告诉 Zed

  • .c文件视为 C++ 而不是 C
  • 将名为“MyLockFile”的文件识别为 TOML
  • 将 Dockerfile 语法应用于任何以“Dockerfile”开头的文件

您可以使用 glob 模式进行更灵活的匹配,从而在项目中处理复杂的命名约定。

使用语言服务器

语言服务器是 Zed 智能编码功能的重要组成部分,提供自动补全、转到定义和实时错误检查等功能。

什么是语言服务器?

语言服务器实现了语言服务器协议 (LSP),该协议标准化了编辑器和特定语言工具之间的通信。这使得 Zed 能够支持多种编程语言的高级功能,而无需单独实现每个功能。

语言服务器提供的一些关键功能包括

  • 代码补全
  • 错误检查和诊断
  • 代码导航(转到定义、查找引用)
  • 代码操作(重命名、提取方法)
  • 悬停信息
  • 工作区符号搜索

管理语言服务器

Zed 简化了用户的语言服务器管理

  1. 自动下载:当您打开具有匹配文件类型的文件时,Zed 会自动下载相应的语言服务器。Zed 可能会提示您为已知文件类型安装扩展程序。

  2. 存储位置

    • macOS:~/Library/Application Support/Zed/languages
    • Linux:$XDG_DATA_HOME/zed/languages$FLATPAK_XDG_DATA_HOME/zed/languages$HOME/.local/share/zed/languages
  3. 自动更新:Zed 会保持您的语言服务器最新,确保您始终拥有最新的功能和改进。

选择语言服务器

Zed 中的某些语言提供多个语言服务器选项。您可能安装了多个扩展程序,它们捆绑了针对相同语言的语言服务器,这可能导致功能重叠。为了确保您获得首选的功能,Zed 允许您确定使用哪些语言服务器以及以何种顺序使用。

您可以使用language_servers设置指定您的偏好

  "languages": {
    "PHP": {
      "language_servers": ["intelephense", "!phpactor", "..."]
    }
  }

在此示例中

  • intelephense被设置为主语言服务器
  • phpactor被禁用(注意!前缀)
  • ...扩展为为 PHP 注册的其他语言服务器

此配置允许您根据您的特定需求调整语言服务器设置,确保您获得最适合您开发工作流程的功能。

工具链

一些语言服务器需要配置当前“工具链”,即特定版本的编程语言编译器和/或解释器的安装,其中可能包含项目的完整依赖项集。Zed 认为工具链的一个示例是 Python 中的虚拟环境。并非 Zed 中的所有语言都支持工具链发现和选择,但对于支持的语言,您可以从工具链选择器(通过toolchain: select)指定工具链。要了解有关 Zed 中工具链的更多信息,请参阅toolchains

配置语言服务器

许多语言服务器接受自定义配置选项。您可以在settings.jsonlsp部分中设置这些选项

  "lsp": {
    "rust-analyzer": {
      "initialization_options": {
        "check": {
          "command": "clippy"
        }
      }
    }
  }

此示例配置 Rust Analyzer 在保存文件时使用 Clippy 进行额外的 linting。

嵌套对象

在 Zed 中配置语言服务器选项时,使用嵌套对象而不是点分隔字符串非常重要。这对于处理更复杂的配置尤其重要。让我们看一个使用 TypeScript 语言服务器的实际示例

假设您要为 TypeScript 配置以下设置

  • 启用严格的空值检查
  • 将目标 ECMAScript 版本设置为 ES2020

以下是您如何在 Zed 的settings.json中构建这些设置

"lsp": {
  "typescript-language-server": {
    "initialization_options": {
      // These are not supported (VSCode dotted style):
      // "preferences.strictNullChecks": true,
      // "preferences.target": "ES2020"
      //
      // These is correct (nested notation):
      "preferences": {
        "strictNullChecks": true,
        "target": "ES2020"
      },
    }
  }
}

可能的配置选项

根据特定语言服务器的实现方式,它们可能依赖于 LSP 中指定的不同配置选项。

在语言服务器启动期间发送一次,需要服务器重新启动才能重新应用更改。

例如,rust-analyzer 和 clangd 仅依赖于这种配置方式。

  "lsp": {
    "rust-analyzer": {
      "initialization_options": {
        "checkOnSave": false
      }
    }
  }

服务器可以多次查询。大多数服务器将仅依赖于这种配置方式。

"lsp": {
  "tailwindcss-language-server": {
    "settings": {
      "tailwindCSS": {
        "emmetCompletions": true,
      },
    }
  }
}

除了与 LSP 相关的服务器配置选项外,Zed 中的某些服务器允许配置 Zed 启动二进制文件的方式。

如果 Zed 在您的路径中找到语言服务器,则会自动下载或启动它们。如果您希望指定一个明确的替代二进制文件,您可以在设置中指定

  "lsp": {
    "rust-analyzer": {
      "binary": {
        // Whether to fetch the binary from the internet, or attempt to find locally.
        "ignore_system_version": false,
        "path": "/path/to/langserver/bin",
        "arguments": ["--option", "value"],
        "env": {
          "FOO": "BAR"
        }
      }
    }
  }

启用或禁用语言服务器

您可以全局或按语言切换语言服务器支持

  "languages": {
    "Markdown": {
      "enable_language_server": false
    }
  }

这会禁用 Markdown 文件的语言服务器,这对于大型文档项目的性能很有用。您可以在~/.config/zed/settings.json中全局配置此设置,或在项目目录中的.zed/settings.json中配置。

格式化和 Linting

Zed 支持代码格式化和 linting,以保持一致的代码风格并尽早发现潜在问题。

配置格式化程序

Zed 支持内置和外部格式化程序。有关更多信息,请参阅formatter文档。您可以在settings.json中全局或按语言配置格式化程序

"languages": {
  "JavaScript": {
    "formatter": {
      "external": {
        "command": "prettier",
        "arguments": ["--stdin-filepath", "{buffer_path}"]
      }
    },
    "format_on_save": "on"
  },
  "Rust": {
    "formatter": "language_server",
    "format_on_save": "on"
  }
}

此示例使用 Prettier 格式化 JavaScript,使用语言服务器的格式化程序格式化 Rust,两者都设置为保存时格式化。

要禁用特定语言的格式化

"languages": {
  "Markdown": {
    "format_on_save": "off"
  }
}

设置 Linting 工具

Zed 中的 Linting 通常由语言服务器处理。许多语言服务器允许您配置 Linting 规则

"lsp": {
  "eslint": {
    "settings": {
      "codeActionOnSave": {
        "rules": ["import/order"]
      }
    }
  }
}

此配置设置 ESLint 在保存 JavaScript 文件时组织导入。

要在保存时自动运行 Linting 修复

"languages": {
  "JavaScript": {
    "formatter": {
      "code_action": "source.fixAll.eslint"
    }
  }
}

集成格式化和 Linting

Zed 允许您在保存时同时运行格式化和 Linting。以下是一个示例,它使用 Prettier 进行格式化,使用 ESLint 进行 JavaScript 文件的 Linting

"languages": {
  "JavaScript": {
    "formatter": [
      {
        "code_action": "source.fixAll.eslint"
      },
      {
        "external": {
          "command": "prettier",
          "arguments": ["--stdin-filepath", "{buffer_path}"]
        }
      }
    ],
    "format_on_save": "on"
  }
}

故障排除

如果您遇到格式化或 Linting 问题

  1. 检查 Zed 的日志文件以获取错误消息(使用命令面板:zed: open log
  2. 确保外部工具(格式化程序、Linting 工具)已正确安装并在您的 PATH 中
  3. 验证 Zed 设置和特定语言配置文件(例如,.eslintrc.prettierrc)中的配置

语法高亮和主题

Zed 提供语法高亮和主题的自定义选项,允许您根据需要调整代码的视觉外观。

自定义语法高亮

Zed 使用 Tree-sitter 语法进行语法高亮。使用theme_overrides设置覆盖默认高亮。

此示例使注释倾斜并更改字符串的颜色

"theme_overrides": {
  "One Dark": {
    "syntax": {
      "comment": {
        "font_style": "italic"
      },
      "string": {
        "color": "#00AA00"
      }
    }
  }
}

选择和自定义主题

更改您的主题

  1. 使用主题选择器(cmd-k cmd-t|ctrl-k ctrl-t
  2. 或在您的settings.json中设置
"theme": {
  "mode": "dark",
  "dark": "One Dark",
  "light": "GitHub Light"
}

通过在~/.config/zed/themes/中创建 JSON 文件来创建自定义主题。Zed 将自动检测并提供此目录中的任何主题。

使用主题扩展

Zed 支持主题扩展。从扩展面板(cmd-shift-x|ctrl-shift-x)浏览和安装主题扩展。

要创建自己的主题扩展,请参阅开发主题扩展指南。

使用语言服务器功能

内联提示

内联提示在您的代码中提供额外的内联信息,例如参数名称或推断类型。在您的settings.json中配置内联提示

"inlay_hints": {
  "enabled": true,
  "show_type_hints": true,
  "show_parameter_hints": true,
  "show_other_hints": true
}

有关特定语言的内联提示设置,请参阅每种语言的文档。

代码操作

代码操作提供快速修复和重构选项。使用editor: Toggle Code Actions命令或在操作可用时单击光标旁边出现的灯泡图标来访问代码操作。

转到定义和引用

使用这些命令导航您的代码库

  • editor: Go to Definition (f12|f12)
  • editor: Go to Type Definition (cmd-f12|ctrl-f12)
  • editor: Find All References (shift-f12|shift-f12)

重命名符号

要在整个项目中重命名符号

  1. 将光标放在符号上
  2. 使用editor: Rename Symbol命令(f2|f2
  3. 输入新名称并按 Enter

这些功能取决于每种语言的语言服务器的功能。

当重命名跨多个文件的符号时,Zed 将在多缓冲区中打开预览。这允许您在应用更改之前查看整个项目中的所有更改。要确认重命名,只需保存多缓冲区。如果您决定不继续重命名,您可以撤消更改或关闭多缓冲区而不保存。

悬停信息

使用editor: Hover命令显示光标下符号的信息。这通常包括类型信息、文档和相关资源的链接。

workspace: Open Symbol命令允许您在整个项目中搜索符号(函数、类、变量)。这对于快速导航大型代码库非常有用。

代码补全

Zed 在您键入时提供智能代码补全建议。您可以使用editor: Show Completions命令手动触发补全。使用tab|tabenter|enter接受建议。

诊断

语言服务器在您编码时提供实时诊断(错误、警告、提示)。使用diagnostics: Toggle命令查看项目的所有诊断。