typescript-tools.nvim

typescript-tools.nvim

专为NeoVim打造的TypeScript集成插件

typescript-tools.nvim是一款专为NeoVim打造的TypeScript集成插件。它通过直接与Tsserver通信,显著提升了大型TypeScript/JavaScript项目的性能和准确性。该插件支持多Tsserver实例、本地和全局TypeScript安装,并兼容Mason安装的tsserver。此外,它还提供了增强的代码重构功能和对styled-components的原生支持,成为typescript-language-server的理想替代方案。

TypeScriptNeoVimLSPTsserver插件Github开源项目
<h1 align="center">typescript-tools.nvim</h1> <p align="center"><sup>⚡ NeoVim 值得拥有的 TypeScript 集成 ⚡</sup></p>

🚧 警告 🚧

请注意,该插件目前处于早期测试版本,这意味着您可能会遇到一些错误。

⁉️ 为什么?

  1. 纯 Lua 实现的 typescript-language-server 替代品,可直接使用
  2. 如果您在大型 TS/JS 项目中工作,您可能理解这个插件诞生的原因。在这类项目中,typescript-language-server 可能会非常慢,而且经常无法提供准确的补全或直接崩溃。

✨ 特性

  • ⚡ 速度极快,得益于使用类似 Visual Studio Code 的原生 Tsserver 通信协议
  • 🪭 支持 TypeScript 4.0 及以上的多个版本
  • 🌍 支持 nvim LSP 插件生态系统
  • 🔀 支持多个 Tsserver 实例
  • 💻 支持本地和全局安装的 TypeScript
  • 🔨 支持从 Mason 安装的 tsserver
  • 💅 提供开箱即用的 styled-components 支持,默认未启用(参见安装和配置
  • ✨ 改进的代码重构能力,例如提取变量或函数

code_action

🚀 工作原理?

<details> <summary> 如果您想了解插件的技术细节,请点击这里。 </summary> <p> <br> 这个插件的功能与 Visual Studio Code 中捆绑的 TypeScript 支持扩展完全相同。 得益于新的(0.8.0)NeoVim API,现在可以将 Lua 函数作为 LSP 启动命令传递。因此,该插件生成了一个自定义版本的 I/O 循环,直接使用 Tsserver 的原生协议与其通信,无需任何额外代理。 Tsserver 协议是一个基于 JSON 的通信协议,可能是 LSP 的灵感来源。然而,它与 LSP 不兼容。为解决这个问题,该插件提供的 I/O 循环具有一个转换层,用于将所有消息在 Tsserver 格式之间进行转换。 </p>

总之,该插件的架构可以用下面的图表来表示:

NeoVim Tsserver 实例 ┌────────────────────────────────────────────┐ ┌────────────────┐ │ │ │ │ │ LSP 处理程序 Tsserver LSP 循环 │ │ │ │ ┌─────────┐ ┌──────────────────┐ │ │ │ │ │ │ │ │ │ │ │ │ │ │ 请求 │ ┌──────────────┐ │ │ │ │ │ │ ├───────────┤►│ 转换层 │ │ │ │ │ │ │ │ 响应 │ │ │ │ │ │ │ │ │ ◄───────────┼─┤ │ │ │ │ │ │ │ │ │ └───┬─────▲────┘ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ │ ┌───▼─────┴────┐ │ │ 请求 │ │ │ │ │ │ │ I/O 循环 ├─┼─┼────────────► │ │ │ │ │ │ │ │ │ 响应 │ │ │ │ │ │ │ ◄─┼─┼────────────┤ │ │ │ │ │ └──────────────┘ │ │ │ │ │ │ │ │ │ │ │ │ │ └─────────┘ └──────────────────┘ │ │ │ │ │ │ │ └────────────────────────────────────────────┘ └────────────────┘
</details>

📦 安装

❗️ 重要提示:如前所述,此插件作为 typescript-language-server 的替代品,因此您应该移除 nvim-lspconfig 对它的设置。

⚡️ 要求

lazy.nvim

{ "pmizio/typescript-tools.nvim", dependencies = { "nvim-lua/plenary.nvim", "neovim/nvim-lspconfig" }, opts = {}, }

packer.nvim

use { "pmizio/typescript-tools.nvim", requires = { "nvim-lua/plenary.nvim", "neovim/nvim-lspconfig" }, config = function() require("typescript-tools").setup {} end, }

⚙️ 配置

传递给 setup 函数的参数也会传递给标准的 nvim-lspconfig 服务器 setup,允许您在此处使用相同的设置。 但您可以通过 settings 参数传递插件特定的选项,默认值如下:

require("typescript-tools").setup { on_attach = function() ... end, handlers = { ... }, ... settings = { -- 生成额外的 tsserver 实例来计算诊断信息 separate_diagnostic_server = true, -- "change"|"insert_leave" 决定客户端何时向服务器询问诊断信息 publish_diagnostic_on = "insert_leave", -- 字符串数组("fix_all"|"add_missing_imports"|"remove_unused"| -- "remove_unused_imports"|"organize_imports") -- 或字符串 "all" -- 包含所有支持的代码操作 -- 指定作为代码操作公开的命令 expose_as_code_action = {}, -- 字符串|nil - 指定自定义的 `tsserver.js` 文件路径,如果为 nil 或路径下文件不存在 -- 则应用标准路径解析策略 tsserver_path = nil, -- 指定 tsserver 加载的插件列表,例如,用于支持 `styled-components` -- (参见 💅 `styled-components` 支持部分) tsserver_plugins = {}, -- 此值传递给:https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-megabytes -- 内存限制(以兆字节为单位)或 "auto"(基本上没有限制) tsserver_max_memory = "auto", -- 下面描述 tsserver_format_options = {}, tsserver_file_preferences = {}, -- 所有 tsserver 消息的区域设置,支持的区域设置可以在这里找到: -- https://github.com/microsoft/TypeScript/blob/3c221fc086be52b19801f6e8d82596d04607ede6/src/compiler/utilitiesPublic.ts#L620 tsserver_locale = "en", -- VSCode 的 `typescript.suggest.completeFunctionCalls` 的镜像 complete_function_calls = false, include_completions_with_insert_text = true, -- CodeLens -- 警告:这在 VSCode 中也是一个实验性功能,因为它可能会影响服务器的性能。 -- 可能的值:("off"|"all"|"implementations_only"|"references_only") code_lens = "off", -- 默认情况下,代码镜头显示在所有可引用的值上,对于某些人来说可能太多了 -- 这个选项通过移除成员引用的镜头来减少它们的数量 disable_member_code_lens = true, -- JSXCloseTag -- 警告:默认情况下它是禁用的(也许您的配置或发行版已经使用了 nvim-ts-autotag, -- 如果启用此功能可能会发生冲突。) jsx_close_tag = { enable = false, filetypes = { "javascriptreact", "typescriptreact" }, } }, }

请注意,handlers 可用于覆盖某些 LSP 方法。 例如,您可以使用 filter_diagnostics 辅助函数来忽略特定错误:

local api = require("typescript-tools.api") require("typescript-tools").setup { handlers = { ["textDocument/publishDiagnostics"] = api.filter_diagnostics( -- 忽略 'This may be converted to an async function' 诊断。 { 80006 } ), }, }

您还可以传递自定义配置选项,这些选项将传递给 tsserver 实例。您可以在 typescript 仓库中找到可用选项(例如,对于 typescript 5.0.4 版本):

要将这些选项传递给插件,请在插件的 setup 函数中传递它们:

require("typescript-tools").setup { settings = { ... tsserver_file_preferences = { includeInlayParameterNameHints = "all", includeCompletionsForModuleExports = true, quotePreference = "auto", ... }, tsserver_format_options = { allowIncompleteCompletions = false, allowRenameOfImportPath = false, ... } }, }

如果您想让 tsserver_format_optionstsserver_file_preferences 依赖文件类型,您可以将它们设置为返回表的函数,例如:

<details> <summary>示例代码在此</summary> <p>
require("typescript-tools").setup { settings = { ... tsserver_file_preferences = function(ft) -- 使用打开文件的 `ft` 进行一些 "if 逻辑" return { includeInlayParameterNameHints = "all", includeCompletionsForModuleExports = true, quotePreference = "auto", ... } end, tsserver_format_options = function(ft) -- 使用打开文件的 `ft` 进行一些 "if 逻辑" return { allowIncompleteCompletions = false, allowRenameOfImportPath = false, ... } end }, }
</p> </details>

preferencesformat_options 的默认值在这个文件

💅 styled-components 支持

<details> <summary>显示更多</summary> <p> <br> 要获取 <code>styled-components</code> 的 IntelliSense,你需要全局安装 tsserver 插件,以启用对它的支持: </p>
npm i -g @styled/typescript-styled-plugin typescript-styled-plugin

现在,你需要通过修改 settings 对象来加载插件,如下所示:

require("typescript-tools").setup { settings = { ... tsserver_plugins = { -- 适用于 TypeScript v4.9+ "@styled/typescript-styled-plugin", -- 或者适用于较旧的 TypeScript 版本 -- "typescript-styled-plugin", }, }, }
</details>

自定义用户命令

该插件提供了几个自定义用户命令(仅应用于当前缓冲区):

  • TSToolsOrganizeImports - 对导入进行排序并移除未使用的导入
  • TSToolsSortImports - 对导入进行排序
  • TSToolsRemoveUnusedImports - 移除未使用的导入
  • TSToolsRemoveUnused - 移除所有未使用的语句
  • TSToolsAddMissingImports - 为所有缺少导入且可导入的语句添加导入
  • TSToolsFixAll - 修复所有可修复的错误
  • TSToolsGoToSourceDefinition - 跳转到源定义(自 TS v4.7 可用)
  • TSToolsRenameFile - 允许重命名当前文件并将更改应用到相关文件
  • TSToolsFileReferences - 查找引用当前文件的文件(自 TS v4.2 可用)

支持的 LSP 方法

状态请求
textDocument/completion
textDocument/hover
textDocument/rename
textDocument/publishDiagnostics
textDocument/signatureHelp
textDocument/references
textDocument/definition
textDocument/typeDefinition
textDocument/implementation
textDocument/documentSymbol
textDocument/documentHighlight
textDocument/codeAction
textDocument/formatting
textDocument/rangeFormatting
textDocument/foldingRange
textDocument/semanticTokens/full(自 TS v4.1 支持)
textDocument/inlayHint(自 TS v4.4 支持)
callHierarchy/incomingCalls
callHierarchy/outgoingCalls
textDocument/codeLens
🚧textDocument/linkedEditingRange(计划中)
workspace/symbol
workspace/willRenameFiles
workspace/applyEdit - 不适用
textDocument/declaration - 不适用
window/logMessage - 不适用
window/showMessage - 不适用
window/showMessageRequest - 不适用

🚦 路线图

  • textDocument/linkedEditingRange - #32
  • 嵌入式语言支持(HTML 内的 JS)- #43

🔨 开发

有用的链接:

🐛 运行测试

单元测试环境会自动引导,只需运行:

make test

或者如果你想运行单个测试文件:

make file=test_spec.lua test

💐 致谢

编辑推荐精选

讯飞智文

讯飞智文

一键生成PPT和Word,让学习生活更轻松

讯飞智文是一个利用 AI 技术的项目,能够帮助用户生成 PPT 以及各类文档。无论是商业领域的市场分析报告、年度目标制定,还是学生群体的职业生涯规划、实习避坑指南,亦或是活动策划、旅游攻略等内容,它都能提供支持,帮助用户精准表达,轻松呈现各种信息。

AI办公办公工具AI工具讯飞智文AI在线生成PPTAI撰写助手多语种文档生成AI自动配图热门
讯飞星火

讯飞星火

深度推理能力全新升级,全面对标OpenAI o1

科大讯飞的星火大模型,支持语言理解、知识问答和文本创作等多功能,适用于多种文件和业务场景,提升办公和日常生活的效率。讯飞星火是一个提供丰富智能服务的平台,涵盖科技资讯、图像创作、写作辅助、编程解答、科研文献解读等功能,能为不同需求的用户提供便捷高效的帮助,助力用户轻松获取信息、解决问题,满足多样化使用场景。

热门AI开发模型训练AI工具讯飞星火大模型智能问答内容创作多语种支持智慧生活
Spark-TTS

Spark-TTS

一种基于大语言模型的高效单流解耦语音令牌文本到语音合成模型

Spark-TTS 是一个基于 PyTorch 的开源文本到语音合成项目,由多个知名机构联合参与。该项目提供了高效的 LLM(大语言模型)驱动的语音合成方案,支持语音克隆和语音创建功能,可通过命令行界面(CLI)和 Web UI 两种方式使用。用户可以根据需求调整语音的性别、音高、速度等参数,生成高质量的语音。该项目适用于多种场景,如有声读物制作、智能语音助手开发等。

Trae

Trae

字节跳动发布的AI编程神器IDE

Trae是一种自适应的集成开发环境(IDE),通过自动化和多元协作改变开发流程。利用Trae,团队能够更快速、精确地编写和部署代码,从而提高编程效率和项目交付速度。Trae具备上下文感知和代码自动完成功能,是提升开发效率的理想工具。

AI工具TraeAI IDE协作生产力转型热门
咔片PPT

咔片PPT

AI助力,做PPT更简单!

咔片是一款轻量化在线演示设计工具,借助 AI 技术,实现从内容生成到智能设计的一站式 PPT 制作服务。支持多种文档格式导入生成 PPT,提供海量模板、智能美化、素材替换等功能,适用于销售、教师、学生等各类人群,能高效制作出高品质 PPT,满足不同场景演示需求。

讯飞绘文

讯飞绘文

选题、配图、成文,一站式创作,让内容运营更高效

讯飞绘文,一个AI集成平台,支持写作、选题、配图、排版和发布。高效生成适用于各类媒体的定制内容,加速品牌传播,提升内容营销效果。

热门AI辅助写作AI工具讯飞绘文内容运营AI创作个性化文章多平台分发AI助手
材料星

材料星

专业的AI公文写作平台,公文写作神器

AI 材料星,专业的 AI 公文写作辅助平台,为体制内工作人员提供高效的公文写作解决方案。拥有海量公文文库、9 大核心 AI 功能,支持 30 + 文稿类型生成,助力快速完成领导讲话、工作总结、述职报告等材料,提升办公效率,是体制打工人的得力写作神器。

openai-agents-python

openai-agents-python

OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。

openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。

Hunyuan3D-2

Hunyuan3D-2

高分辨率纹理 3D 资产生成

Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。

3FS

3FS

一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。

3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。

下拉加载更多