ty 编辑器集成指南:为 VS Code、Neovim、Zed、PyCharm 等配置 Rust 编写的 Python 语言服务器

发布时间:2026/9/13 7:21:48
ty 编辑器集成指南:为 VS Code、Neovim、Zed、PyCharm 等配置 Rust 编写的 Python 语言服务器 ty 编辑器集成指南为 VS Code、Neovim、Zed、PyCharm 等配置 Rust 编写的 Python 语言服务器【免费下载链接】tyAn extremely fast Python type checker and language server, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/ty2/tyty 是一款用 Rust 编写的极速 Python 类型检查器与语言服务器本文基于仓库中的官方文档 docs/editors.md 编写系统讲解如何将它接入 VS Code、Neovim、Zed、PyCharm、Emacs 以及任意支持 Language Server ProtocolLSP的编辑器。读完本文你将掌握每种编辑器的接入步骤、ty server启动方式以及语言服务器全套配置项诊断范围、内联提示、补全行为、日志与 uv 集成等的用法从而在 IDE 中获得与命令行ty check一致的类型检查能力。前置准备安装 ty 并理解ty server子命令在配置任何编辑器之前需要先确保ty可执行文件可用。仓库中的 docs/installation.md 提供了多种安装方式最常用的是# 全局安装uv uv tool install tylatest # 或使用 pipx pipx install ty # 或无需安装直接运行 uvx ty以开发依赖形式加入项目保证团队版本一致uv add --dev ty uv run tyty 的 CLI 结构在 docs/reference/cli.md 中有完整记录其中与编辑器集成直接相关的是ty server子命令——它用于启动语言服务器进程ty serverty server是 LSP 服务器入口所有编辑器接入本质都是让编辑器以 LSP 客户端身份连接该进程。仓库中的 python/ty/main.py 展示了 Python 分发版如何定位并转发到真正的二进制它调用find_ty_bin()实现在 python/ty/_find_ty.py按sysconfig脚本目录、site-packages 相邻的bin目录、用户 scheme 脚本目录如~/.local/bin等位置依次查找ty可执行文件找不到时抛出TyNotFound。这一点解释了为什么“解释器路径”和“可执行文件路径”会成为编辑器设置中的关键选项详见下文 VS Code 扩展专属设置。VS CodeAstral 团队为 VS Code 维护了官方扩展市场名称astral-sh.ty。安装后扩展会自动禁用 Python 扩展自带的语言服务器避免同时运行两个 Python 语言服务器——实现方式是把python.languageServer默认设为None。如果你只想让 ty 负责类型检查而把悬停提示、自动补全等能力交给其他语言服务器如 Pylance可以在settings.json中显式覆盖这一默认行为同时关闭 ty 的语言服务{ python.languageServer: Pylance, ty.disableLanguageServices: true, }其中ty.disableLanguageServices的完整语义见 docs/reference/editor-settings.md 与下文关闭语言服务一节。NeovimNeovim 的推荐接入方式是官方推荐的 nvim-lspconfig 扩展若不安装扩展也可以手动复制其中lsp/ty.lua的配置。安装扩展后需要启用语言服务器并可选择性补充设置。Neovim 0.11在配置文件中加入-- Optional: Only required if you need to update the language server settings vim.lsp.config(ty, { settings { ty { -- ty language server settings go here } } }) -- Required: Enable the language server vim.lsp.enable(ty)Neovim 0.11注意可能需要安装较旧版本的 nvim-lspconfig 以匹配 API使用传统setup写法require(lspconfig).ty.setup({ settings { ty { -- ty language server settings go here } } })注意两种写法中设置都包裹在settings.ty命名空间下这与下文“设置参考”中各配置项在 Neovim 中的放置位置一致而部分初始化选项则需要放在init_options字段详见初始化选项。Zedty 已内置在 Zed 中无需安装任何扩展不过 Zed 对 Python 的默认主 LSP 是 basedpyright。要启用 ty 并停用 basedpyright在settings.json中把 Python 的语言服务器列表改为只包含ty和ruff未被列出的内置服务器如 basedpyright、pyright、pylsp 会自动停用{ languages: { Python: { language_servers: [ // Enable ty and ruff, // Other built-in servers (basedpyright, pyright, pylsp) // are disabled by being omitted from this list. ty, ruff ] } } }如需覆盖 Zed 使用的ty可执行文件通过lsp.ty.binary指定路径与启动参数{ lsp: { ty: { binary: { path: /home/user/.local/bin/ty, arguments: [server] } } } }这里再次印证了“编辑器以ty server作为 LSP 启动命令”的事实——arguments中的server正是对应 docs/reference/cli.md 中的ty server子命令。PyCharm自 PyCharm 2025.3 版本起可以在设置中启用 ty 的原生支持打开 Settings 对话框进入Python | Tools | ty。勾选Enable复选框。在 Execution mode执行模式中选择如何查找可执行文件Interpreter解释器模式PyCharm 在所选解释器中查找已安装的可执行文件若未安装可点击Install ty为当前解释器安装 ty 包。Path路径模式PyCharm 在$PATH中查找可执行文件若找不到可点击 Browse... 图标手动指定路径。选择需要启用的选项。这一“Interpreter / Path”二选一的设计与 python/ty/_find_ty.py 中按 Python 环境定位二进制sysconfig.get_path(scripts)、用户 scheme 的~/.local/bin等的思路是相互呼应的。EmacsEmacs 29 起内置了 Eglot LSP 客户端可直接把 ty 作为语言服务器接入(with-eval-after-load eglot (add-to-list eglot-server-programs ((python-base-mode :language-id python) . (ty server)))) (add-hook python-base-mode-hook eglot-ensure)若希望通过 Flycheck 查看 ty 的诊断可使用 flycheck-eglot 包它将 Eglot 的诊断桥接到 Flycheck。其他编辑器基于 LSP 的通用接入任何支持 Language Server Protocol 的编辑器都可以接入 ty。启动语言服务器的命令统一为ty server其余步骤如何连接 LSP 服务器、如何传递初始化选项与设置请查阅所用编辑器的 LSP 客户端文档。LSP 客户端通过标准协议与ty server通信因此 ty 的语言服务能力在所有编辑器间是一致的——其完整能力清单见 docs/features/language-server.md。设置参考ty 语言服务器全部配置项本节完整整理 docs/reference/editor-settings.md 中的配置项。设置分为两类普通设置settings运行时可修改通过settings字段下发VS Code 中是ty.*命名空间。初始化选项initialization options静态选项修改后必须重启编辑器才能生效VS Code 中仍以ty.*命名空间暴露但其他编辑器需要放在配置中对应的init_options/initialization_options字段。文中每个配置项给出 VS Code、Neovim0.11 与 0.11 两种写法、Zed 三种编辑器下的示例便于直接复制。configuration编辑器内联配置以对象形式在编辑器内直接配置 ty 的设置。内联设置始终优先于配置文件包括下文configurationFile指定的文件。可配置的全部选项参见 docs/configuration.md。默认值null类型object示例把unresolved-reference规则降级为 warn。 VS Codejson { ty.configuration: { rules: { unresolved-reference: warn } } } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { settings { ty { configuration { rules { [unresolved-reference] warn } } }, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ settings { ty { configuration { rules { [unresolved-reference] warn } } }, }, }) Zedjson { lsp: { ty: { settings: { configuration: { rules: { unresolved-reference: warn } } } } } } configurationFile指定ty.toml配置文件指向一个ty.toml配置文件。设置后 ty 将使用该文件不再自动发现项目中的其他配置文件。路径支持~展开指向用户主目录也支持环境变量如$A或${A}。默认值null类型string注意虽然 ty 配置可以放在pyproject.toml中但此场景下不允许使用pyproject.toml。 VS Codejson { ty.configurationFile: ./.config/ty.toml } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { settings { ty { configurationFile ./.config/ty.toml }, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ settings { ty { configurationFile ./.config/ty.toml }, }, }) Zedjson { lsp: { ty: { settings: { configurationFile: ./.config/ty.toml } } } } 命令行场景下对应的等价选项是ty check --config-file并可借助TY_CONFIG_FILE环境变量设置见 docs/reference/environment.md。disableLanguageServices关闭语言服务是否关闭 ty 语言服务器的语言服务能力如代码补全、悬停、跳转定义等。默认值false类型boolean当你想让 ty 只做类型检查、把补全/悬停/跳转等交给另一个语言服务器时将此设为true——这正是 VS Code 一节中与python.languageServer搭配使用的场景。 VS Codejson { ty.disableLanguageServices: true } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { settings { ty { disableLanguageServices true, }, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ settings { ty { disableLanguageServices true, }, }, }) Zedjson { lsp: { ty: { settings: { disableLanguageServices: true } } } } diagnosticMode诊断范围决定语言服务器报告诊断的范围可取值off完全禁用诊断。当你只想使用补全、悬停、跳转等语言服务、不需要类型诊断时非常有用与disableLanguageServices恰好互补。openFilesOnly只报告当前编辑器中打开的文件。workspace报告工作区中所有文件。默认值openFilesOnly类型off | workspace | openFilesOnly VS Codejson { ty.diagnosticMode: workspace } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { settings { ty { diagnosticMode workspace, }, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ settings { ty { diagnosticMode workspace, }, }, }) Zedjson { lsp: { ty: { settings: { diagnosticMode: workspace } } } } showSyntaxErrors语法错误诊断是否显示语法错误诊断。与其他语言服务器配合使用时很有用——可以让语法错误只来自单一来源避免重复。默认值true类型bool VS Codejson { ty.showSyntaxErrors: false } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { settings { ty { showSyntaxErrors false, }, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ settings { ty { showSyntaxErrors false, }, }, }) Zedjson { lsp: { ty: { settings: { showSyntaxErrors: false } } } } inlayHints内联提示inlay hints控制 ty 在编辑器中提供的内联提示。ty 的 inlay hints 还支持双击将提示的类型注解直接插入源码点击提示的某部分即可跳转到对应定义。variableTypes是否以行内提示显示变量的类型。默认值true类型boolean VS Codejson { ty.inlayHints.variableTypes: false } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { settings { ty { inlayHints { variableTypes false, }, }, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ settings { ty { inlayHints { variableTypes false, }, }, }, }) Zedjson { lsp: { ty: { settings: { inlayHints: { variableTypes: false } } } } } callArgumentNames是否在函数调用处显示参数名的行内提示。默认值true类型boolean VS Codejson { ty.inlayHints.callArgumentNames: false } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { settings { ty { inlayHints { callArgumentNames false, }, }, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ settings { ty { inlayHints { callArgumentNames false, }, }, }, }) Zedjson { lsp: { ty: { settings: { inlayHints: { callArgumentNames: false } } } } } completions补全行为控制 ty 提供的代码补全的工作方式。autoImport补全是否包含自动导入建议即包含当前作用域之外、但环境中可用的符号。默认值true类型boolean VS Codejson { ty.completions.autoImport: true } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { settings { ty { completions { autoImport true, }, }, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ settings { ty { completions { autoImport true, }, }, }, }) Zedjson { lsp: { ty: { settings: { completions: { autoImport: true } } } } } completeFunctionParentheses接受函数、方法或类的补全时是否同时插入括号并把光标放在括号内部。默认值false类型boolean VS Codejson { ty.completions.completeFunctionParentheses: true } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { settings { ty { completions { completeFunctionParentheses true, }, }, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ settings { ty { completions { completeFunctionParentheses true, }, }, }, }) Zedjson { lsp: { ty: { settings: { completions: { completeFunctionParentheses: true } } } } } VS Code 扩展专属设置以下设置仅对官方 VS Code 扩展生效。importStrategy加载ty可执行文件的策略fromEnvironment从环境中查找 ty找不到时回退到扩展内置版本。useBundled使用扩展内置的版本。默认值fromEnvironment类型fromEnvironment | useBundled{ ty.importStrategy: useBundled }interpreterPython 解释器路径列表。虽然它是列表只会使用第一个解释器。当ty.importStrategy为fromEnvironment时该路径用于查找ty可执行文件与 python/ty/_find_ty.py 按解释器环境定位二进制的逻辑一致。默认值[]类型string[]{ ty.interpreter: [/home/user/.local/bin/python] }pathty可执行文件路径列表。扩展使用第一个存在的可执行文件该设置优先于ty.importStrategy。默认值[]类型string[]{ ty.path: [/home/user/.local/bin/ty] }trace.server语言服务器与编辑器客户端之间消息的日志详细级别主要用于排查语言服务器问题。默认值off类型off | messages | verbose{ ty.trace.server: messages }初始化选项以下设置属于初始化选项静态设置修改后需要重启编辑器才能生效。VS Code 中照常使用ty.*命名空间其他编辑器需放入init_optionsNeovim或initialization_optionsZed字段。experimental.useUv控制 ty 如何使用 uv实验性功能未来可能变化启用要求 uv 0.12.3 或更高版本off不使用 uv。scripts使用 uv 为带有 PEP 723 内联元数据的独立脚本创建和更新环境。on使用 uv 进行项目发现与独立脚本环境管理。默认值null类型off | scripts | on注意当untrustedWorkspace为true时所有 uv 集成都会被禁用。 VS Codejson { ty.experimental.useUv: scripts } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { init_options { experimental { useUv scripts, }, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ init_options { experimental { useUv scripts, }, }, }) Zedjson { lsp: { ty: { initialization_options: { experimental: { useUv: scripts } } } } } logFile语言服务器日志文件路径。默认情况下 ty 把日志写入 stderr。默认值null类型string VS Codejson { ty.logFile: /path/to/ty.log } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { init_options { logFile /path/to/ty.log, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ init_options { logFile /path/to/ty.log, }, }) Zedjson { lsp: { ty: { initialization_options: { logFile: /path/to/ty.log } } } } logLevel语言服务器的日志级别。默认值info类型trace | debug | info | warn | error VS Codejson { ty.logLevel: debug } Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { init_options { logLevel debug, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ init_options { logLevel debug, }, }) Zedjson { lsp: { ty: { initialization_options: { logLevel: debug } } } } untrustedWorkspace是否把工作区视为不受信任。为true时 ty不会运行任何外部命令所有 uv 集成被禁用。默认值false类型boolean VS Code扩展会根据 [Workspace Trust](https://code.visualstudio.com/docs/editing/workspaces/workspace-trust) 自动设置该选项不存在 ty.untrustedWorkspace 设置项。以 Restricted Mode 打开工作区即将其标记为不受信任。 Neovimlua -- Neovim 0.11: vim.lsp.config(ty, { init_options { untrustedWorkspace true, }, }) -- Neovim 0.11: require(lspconfig).ty.setup({ init_options { untrustedWorkspace true, }, }) Zedjson { lsp: { ty: { initialization_options: { untrustedWorkspace: true } } } } 语言服务器在编辑器中的核心能力完成上述任一编辑器接入后你将获得 docs/features/language-server.md 中描述的一整套 IDE 能力包括诊断Diagnostics随输入实时更新的类型错误与规则诊断支持拉取pull与推送push两种模型诊断范围由diagnosticMode控制诊断规则的详细说明见 docs/features/diagnostics.md。代码导航Code navigation跳转定义Go to Definition、跳转声明Go to Declaration可能指向 stub 文件、跳转类型定义Go to Type Definition、全工作区查找引用Find all references、文档/工作区符号大纲Document/Workspace symbols。代码补全Code completions基于作用域的变量、函数、类、模块建议对未导入符号提供自动导入动作。代码操作与重构Code actions refactorings自动添加缺失 import、诊断快速修复、全代码库安全重命名Rename symbol、基于 Python 语法理解的选区范围Selection range。上下文信息Contextual information悬停显示类型/文档/函数签名含类型参数方差等细节、可点击/可双击插入注解的 inlay hints、输入(时自动出现的签名帮助Signature help、文档高亮Document highlight、基于语义与类型的语义高亮Semantic highlighting。代码折叠Code foldingPython 专属折叠区间docstring 被标记为注释支持“折叠所有注释块”等编辑动作。Notebook 支持.ipynb文件的跨单元格诊断、补全等语言服务。细粒度增量分析Fine-grained incrementality编辑时只增量更新受影响的部分细化到单个定义级别而不是全量重分析细粒度依赖还允许 ty 在无关时跳过大量第三方依赖从而在大型项目上也能提供毫秒级反馈。从 docs/features/language-server.md 的 LSP 特性参考表看ty 支持textDocument/completion、definition、declaration、typeDefinition、references、hover、diagnostic、inlayHint、rename、prepareRename、selectionRange、semanticTokens、signatureHelp、codeAction、foldingRange、documentSymbol、workspace/symbol、workspace/diagnostic、callHierarchy/*、typeHierarchy/*、notebookDocument/*等codeLens、documentColor、documentLink、implementation、workspace/willRenameFiles暂不支持格式化类请求formatting、rangeFormatting、onTypeFormatting建议交给 Ruff 处理。ty 还提供若干非标准 LSP 扩展客户端能力通过ClientCapabilities的experimental字段声明例如fullDiagnosticOutput诊断的data字段中附带包含 ANSI SGR 样式的多行渲染文本与原始diagnostic_id。更多细节可直接查阅 docs/features/language-server.md 源码文档。小结无论你使用 VS Code、Neovim、Zed、PyCharm、Emacs 还是其他 LSP 客户端ty 都以ty server提供一致的 Python 语言服务诊断、补全、导航、重构、内联提示一应俱全且支持通过configuration/configurationFile在编辑器内精细调控行为。所有设置项的权威参考位于 docs/reference/editor-settings.md语言服务器功能清单见 docs/features/language-server.md两者与本文共同构成 ty 编辑器集成的完整知识体系。【免费下载链接】tyAn extremely fast Python type checker and language server, written in Rust.项目地址: https://gitcode.com/GitHub_Trending/ty2/ty创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询