在 Sublime Text 中使用语言服务器

发布时间:作者:

Using Language Servers in Sublime Text image

Sublime Text 是一款非常棒的编辑器,几乎可以处理任何你扔给它的语言。也就是说,如果你希望你的编辑器不要妨碍你,并且你并不关心你的编辑器检查你的代码,给你提供特定于语言的功能,例如自动完成、悬停时的文档等。使用 Sublime Text 和静态类型语言(如 Java)可能很痛苦,但我并不知道。

在 PHP 中,我们有像 PHP Companion 这样的 Sublime 插件,我甚至写过关于我的 PHP 的极简 Sublime Text 3 设置 的文章。Sublime 确实有一些内置功能,例如 `转到定义`、`转到引用`、`转到任何内容` 等等,这些功能可以使代码导航更快;然而,它缺少 语言服务器协议 (LSP) 提供的更现代的功能。VS Code、Vim 等编辑器受益于 LSP。PhpStorm 为 PHP 和 Laravel 项目提供了一系列语言智能功能。

Sublime Text 中有一些这些高级工具吗?

进入 Sublime Text 的 LSP

概述

让我们用 PHP 的 Intelephense LSP 来试试 LSP 插件,看看它如何将 Sublime Text 变成一个更高级的编辑器,但我们仍然可以从 Sublime 提供的轻量级、性感的体验中受益。

从高层次上来说,语言服务器协议提供了一种在开发工具和语言之间进行交互的方式。

语言服务器协议 (LSP) 定义了编辑器或 IDE 和语言服务器之间使用的协议,语言服务器提供了语言功能,例如自动完成、转到定义、查找所有引用等。语言服务器索引格式 (LSIF,发音类似于 "else if")的目标是在没有本地源代码副本的情况下,在开发工具或 Web UI 中支持丰富的代码导航。

在 Sublime Text 中,你拥有主要的 LSP 包,它提供了 LSP 功能的框架,然后你拥有单独的 LSP 包,它们提供了特定于语言的 LSP,例如 PHP Intelephense、Rust、Golang 等。这些特定于 LSP 的包充当 Sublime Text 中的 LSP 框架和各个 LSP 之间的桥梁。

每种语言的 LSP 支持程度不同。例如,Rust 提供了 rust-lang/rust-analyzer LSP,而 LSP-rust-analyzer 包将 LSP (rust-analyzer) 与 Sublime Text 连接起来。

现在我们已经完成了这些,让我们深入了解一下 LSP 如何将 Sublime Text 变成我们喜欢的文本编辑器,再加上智能语言服务器功能。

悬停时的文档

在一个 Laravel 10 项目中,当我们悬停在方法上时,我们可以立即看到一些好处:

从这个悬停菜单中,你可以转到方法的定义,在你的项目代码中查找引用,并重命名(虽然我不确定重命名是否有效/如何工作)。

悬停时的文档 UI 甚至支持 Markdown 中的代码示例,如果你想提供如何使用你的方法的代码示例,这将很有用。

以下展示了如何将示例添加到你的方法中的源代码。

/**
* Say hello
*
* Examples:
* ```
* $this->example(); // Hello, World!
* $this->example('Paul'); // Hello, Paul!
* ```
*
* @param ?string $name The name
*/
private function example($name = null)

自动完成

现在,我们在导入类、编写方法或函数调用时有了自动完成功能,等等:

当你想要导入的类时,自动完成非常有用,如果你 `new` 一个实例或添加一个返回值类型,LSP 会自动在文件顶部导入该类:

未使用的符号

如果我们添加一个未使用的局部变量或导入,我们会得到一些视觉格式(对我来说,它是一个下划线),告诉我们这个问题:

注意我们可以通过悬停在导入或类型上看到的文档,以及 Intelephense 警告,指出该导入从未在我们的文件中使用过 🔥

高亮显示

当你的光标位于某个单词上时,Intelephense LSP 会高亮显示该单词的所有出现位置,这使你更容易看到变量的使用位置。

Composer

当我开始使用 LSP 包时,我注意到 LSP 设置 JSON 本身有有用的提示和可能配置值的描述。由于 `LSP-Intelephense` 插件,这对于 `composer.json` 文件也是如此,当你更新 `composer.json` 配置文件时,这非常有用。

将鼠标悬停在配置键上会为你提供有用的描述,并使你在不查找你可能想要添加或更改的每个键的情况下更轻松地导航配置

Vue LSP 支持

Vue LSP 是一款很棒的生产力提升器!我设置了 LSP-vue 包,为指令和其他常见事物提供自动完成功能真是太棒了。

在文件中扩展 `script` 具有一个不错的自动完成 UI,用于选择你想要在你的 `.vue` 文件中使用的启动 `<script` 标签。

我只触及了表面,但我认为你可能明白我的意思:LSP 非常有用!

入门

Sublime Text 中 LSP 的工作方式是,你需要通过包控制安装 LSP 包,然后安装你想拥有 LSP 支持的语言的特定于语言的 LSP。你可以在官方文档中看到 语言服务器 的列表,其中提供了安装语言 LSP 的具体说明。

例如,PHP 有 两个 LSP 包,LSP-intelephense 和 Phpactor。我还没有尝试过 Phpactor——这篇文章展示了如何使用 LSP-intelephense——但是还有很多其他有用的 LSP 用于你可能使用的其他东西,例如 Tailwind、JavaScript、TypeScript、Vue、Markdown 等等。大多数(如果不是全部)可用的语言服务器都可以在文档中的 语言服务器页面 上找到。

并非所有单独的 LSP 都支持此包中提供的所有 LSP 功能,并且每个 LSP 之间的效果会有所不同。我会说,一些单独的 LSP 稍微有点粗糙,但我对安装的那些非常满意!它们中的大多数在我的操作中无需任何配置或故障排除即可工作。

当您编辑文件时,您可以在窗口左下角一目了然地看到哪些 LSP 针对该文件处于活动状态:

请注意,我在 PHP 代码中可以使用 LSP-html LSP!虽然我现在的 PHP 文件中没有写很多 HTML 代码,但它说明了在处理给定文件类型时,可能存在多个 LSP 可用。

设置

关于设置需要注意几件事。首先,LSP 包的设置,然后是一些 LSP 拥有单独的配置。例如,LSP 设置是一个很好的起点,可以查看所有设置和快捷键

接下来,上面的“服务器”菜单包含针对各个 LSP(例如 Intelephense)的设置。LSP-Intelephense 的默认设置文件具有自述功能,我建议您四处浏览并查看您喜欢的配置设置。

在尝试使用 LSP 时,我还禁用了 Sublime PHP Companion 包,我不知道是否缺少任何功能。我相信 Sublime PHP Companion 拥有一些 PHP LSP 不具备的功能,但我建议您先禁用它,以便根据自己的喜好调整 LSP 包,然后看看是否缺少任何东西。

禁用语言服务器

有时您可能会遇到错误或问题,或者出于其他原因想要禁用正在使用的语言的 LSP。使用命令面板(对我来说是 Command + Shift + P),键入“disable”,您应该看到以下内容:

您也可以通过选择“Package Control: Disable Package”命令并键入包名称来禁用单个 LSP 包。您可以在以后使用命令面板重新启用它。

了解更多

这是一篇快速简要介绍 Sublime 的 LSP 包的文章,我非常喜欢它!我可能会在将来发布更多关于我发现有趣的特定 LSP 功能的深入文章,但现在,请尽情享受 Sublime Text 的 LSP 包吧!

Paul Redmond photo

Laravel News 的特约撰稿人。全栈 Web 开发人员和作者。

归档于
Cube

Laravel 新闻

加入 40k+ 其他开发者,永远不会错过新的技巧、教程等。

Laravel Forge logo

Laravel Forge

轻松创建和管理您的服务器,并以秒速部署您的 Laravel 应用程序。

Laravel Forge
Tinkerwell logo

Tinkerwell

Laravel 开发人员必备的代码运行器。使用 AI、自动完成和对本地和生产环境的即时反馈进行调整。

Tinkerwell
No Compromises logo

绝不妥协

Joel 和 Aaron,来自“绝不妥协”播客的两位经验丰富的开发者,现在可以为您的 Laravel 项目提供服务。 ⬧ 固定价格 $7500/月。 ⬧ 无需冗长的销售流程。 ⬧ 无需合同。 ⬧ 100% 返款保证。

绝不妥协
Kirschbaum logo

Kirschbaum

提供创新和稳定性,确保您的 Web 应用程序取得成功。

Kirschbaum
Shift logo

Shift

运行旧版本的 Laravel?即时、自动的 Laravel 升级和代码现代化,使您的应用程序保持新鲜。

Shift
Bacancy logo

Bacancy

让您的项目充满活力,只需 $2500/月即可获得 4-6 年经验丰富的 Laravel 开发人员。获得 160 小时的专业技能和 15 天的无风险试用期。立即安排通话!

Bacancy
Lucky Media logo

Lucky Media

立即获得 Lucky - Laravel 开发的理想选择,拥有十多年的经验!

Lucky Media
Lunar: Laravel E-Commerce logo

Lunar:Laravel 电子商务

Laravel 电子商务。一个开源软件包,将现代无头电子商务功能的强大功能带入 Laravel。

Lunar:Laravel 电子商务
LaraJobs logo

LaraJobs

官方 Laravel 工作板

LaraJobs
SaaSykit: Laravel SaaS Starter Kit logo

SaaSykit:Laravel SaaS 启动工具包

SaaSykit 是一个 Laravel SaaS 启动工具包,包含运行现代 SaaS 所需的所有功能。付款、精美结账、管理面板、用户仪表板、身份验证、就绪组件、统计、博客、文档等等。

SaaSykit:Laravel SaaS 启动工具包
Rector logo

Rector

您无缝升级 Laravel、降低成本和加速创新以助力企业成功的合作伙伴

Rector
MongoDB logo

MongoDB

通过将 MongoDB 与 Laravel 强力集成来增强您的 PHP 应用程序,使开发人员能够轻松高效地构建应用程序。使用熟悉的 Eloquent API 支持事务、搜索、分析和移动用例。了解 MongoDB 如何将灵活的现代数据库融入您的 Laravel 应用程序。

MongoDB
Maska is a Simple Zero-dependency Input Mask Library image

Maska 是一个简单的零依赖输入掩码库

阅读文章
Add Swagger UI to Your Laravel Application image

将 Swagger UI 添加到您的 Laravel 应用程序

阅读文章
Assert the Exact JSON Structure of a Response in Laravel 11.19 image

在 Laravel 11.19 中断言响应的精确 JSON 结构

阅读文章
Build SSH Apps with PHP and Laravel Prompts image

使用 PHP 和 Laravel 提示构建 SSH 应用程序

阅读文章
Building fast, fuzzy site search with Laravel and Typesense image

使用 Laravel 和 Typesense 构建快速、模糊的站点搜索

阅读文章
Add Comments to your Laravel Application with the Commenter Package image

使用 Commenter 包将评论添加到您的 Laravel 应用程序

阅读文章