Skip to content

Zed

认识 Zed 的配置策略

当你打开一个文件时,Zed 会自动根据Language Support in Zed去下载该语言的 LSP 和 Tree-sitter

  • LSP(语言服务器协议):提供了语义功能,一种语言可具备多个 LSP,可提供的特性:

    • 代码补全
    • 错误检查和诊断
    • 代码导航(转到定义、查找引用)(F12: Go to Definition / Cmd + F12: Go to Type Definition / Shift + F12: Find All References)
    • code actions(重命名、提取方法、source.fixAll
    • 悬停信息
    • 工作区符号搜索
    • Inlay Hints 内嵌提示
    • ...
  • Tree-sitter:提供语法高亮和大纲面板这类基础结构功能

如何识别特殊后缀文件?

通过file_types手动配置

json
{
  "file_types": {
    "Shell Script": [".env.*"],
    "HTML": ["wxml"]
  }
}

因此,你需要知道“一个语言有哪些配置”和“某个 LSP 有哪些配置

配置语言

在全局的languages中配置某个语言

json
"languages": {
  "PHP": {
    ...
  }
}

完整的配置项如下:

  • tab_size 每个缩进级别的空格数

  • formatter (既可以在全局配置、也可以在languages的某个语言配置)

    Details

    方式 1:固定值language_server,代表使用当前 LSP 提供的 format 能力

    json
    {
      "formatter": "language_server"
    }

    方式 2:external (只用 Prettier 推荐这种方式)

    !!! prettier 配置暂未验证成功,需调试

    json
    // prettier之所以要加--stdin-filepath,可能不指定文件就会格式这个工程的文件?
    // {buffer_path}应该属于zed的变量?表明当前文件路径?不像是系统变量,因为在一个目录运行buffer_path肯定不能确定是哪一个文件。
    {
      "formatter": {
        "external": {
          "command": "prettier",
          "arguments": ["--stdin-filepath", "{buffer_path}"]
        }
      }
    }
    json
    // 由于sed命令是直接从标准输入获取内容,而zed默认是将当前缓冲区的文本作为标准输入传,因此不用像prettier那样加--stdin-filepath?
    // 以下等同于:sed -e 's/ *$//'
    {
      "formatter": {
        "external": {
          "command": "sed",
          "arguments": ["-e", "s/ *$//"]
        }
      }
    }

    通过command指定命令,argument指定参数或值。可以执行命令行中能运行的任意命令,命令的标准输出(stdout)将会直接写入当前文件中。

    方式 3:LSP 提供的 code action (只用 ESLint 推荐这种方式)

    json
    {
      "formatter": {
        "code_actions": {
          // Use ESLint's --fix:
          "source.fixAll.eslint": true,
          // Organize imports on save:
          "source.organizeImports": true
        }
      }
    }

    方式四:数组形式结合多个

    json
    {
      "formatter": [
        {"language_server": {"name": "rust-analyzer"}},
        {"external": {
          "command": "sed",
          "arguments": ["-e", "s/ *$//"]
        }
      ]
    }
  • format_on_save

  • enable_language_server

    手动禁用 Markdown 语言文件关联的全部 LSP

    json
    "languages": {
      "Markdown": {
        "enable_language_server": false
      }
    }
  • hard_tabs 使用制表符缩进而不是空格

  • perferred_line_length 建议的最大行长度

  • soft_wrap 如何换行长行代码

  • show_completions_on_input 【新增】是否在输入时显示补全

  • show_completion_documentation【新增】

之前有,但最新文档没提的(推测还能用)

  • code_actions_on_format

  • language_servers

    手动配置 PHP 语言文件关联的 LSP

    json
    "languages": {
      "PHP": {
        "language_servers": ["intelephense", "!phpactor", "..."]
      }
    }
    • intelephense为首要语言服务器
    • phpactor被禁用(!表示禁用)
    • ...表示保留其它默认 LSP 的设置

配置 LSP

TIP

以下 lsp 的配置中,出现了init_optionssettingsinitialization_options等字段,具体取决于每个 lsp 自身的配置方式。

比如配置 emmet,在zed 文档 - Emmet中,查看对应的 lsp 文档,能清楚看到init_options和其配置项的说明。

在 Zed 的文档中,仅提到了settingsinitialization_options,尚不清楚它内部能否自动将initialization_options转化为对于 LSP 所需要的init字段

json
"lsp": {
  "emmet": {
    "init_options": {
      "includeLanguages": {
        // vue-html应该是指template部分,vue覆盖的更全,就是整个vue文件,如果两个都配上没遇到啥问题,就多多益善吧。
        "vue-html": "html",
        "vue": "html"
      }
    }
  },
  "eslint": {
    "settings": {
      "codeActionOnSave": {
        "rules": ["import/order"]
      }
    }
  },
  "typescript-language-server": {
    "initialization_options": {
      // 点分隔配置是不支持的
      // "preferences.strictNullChecks": true,
      // 只能通过对象嵌套的方式
      "preferences": {
        "strictNullChecks": true
      }
    }
  },
  "rust-analyzer": {
    "initialization_options": {
      "checkOnSave": {
        "command": "clippy"
      }
    }
  },
}

配置实操

通用配置

json
{
  // 自动换行 https://zed.dev/docs/configuring-zed#soft-wrap
  "soft_wrap": "editor_width",
  // tabSize https://zed.dev/docs/configuring-zed#tab-size
  "tab_size": 2,
  // 失焦自动保存 https://zed.dev/docs/configuring-zed#autosave
  "autosave": "on_focus_change"
}

项目级别的配置

每个项目的配置可能有差异:

  • 不同项目的缩进不一致
  • 有的项目用 ESLint 格式化,有的项目用 prettier

通过在项目根目录创建.zed/settings.json进行配置(也可以Command + Shift + P,选择zed: open local settings快捷创建)

登录问题

版本:0.149.5+

因为登录才能使用免费的 Zed AI,因此要解决这个问题

需要走代理,

  1. 确保规则模式将zed.dev追加,或是全局模式
  2. 打开 TUN 模式(有些软件没有这个模式)
  3. 修改 zed 配置文件,将proxy字段改为http://127.0.0.1:7897
json
{
  "proxy": "http://127.0.0.1:7897"
}