在 Sublime Text 中使用语言服务器
发布时间:作者: Paul Redmond
Sublime Text 是一款非常棒的编辑器,几乎可以处理任何你扔给它的语言。也就是说,如果你希望你的编辑器不要妨碍你,并且你并不关心你的编辑器检查你的代码,给你提供特定于语言的功能,例如自动完成、悬停时的文档等。使用 Sublime Text 和静态类型语言(如 Java)可能很痛苦,但我并不知道。
在 PHP 中,我们有像 PHP Companion 这样的 Sublime 插件,我甚至写过关于我的 PHP 的极简 Sublime Text 3 设置 的文章。Sublime 确实有一些内置功能,例如 `转到定义`、`转到引用`、`转到任何内容` 等等,这些功能可以使代码导航更快;然而,它缺少 语言服务器协议 (LSP) 提供的更现代的功能。VS Code、Vim 等编辑器受益于 LSP。PhpStorm 为 PHP 和 Laravel 项目提供了一系列语言智能功能。
Sublime Text 中有一些这些高级工具吗?
概述
让我们用 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 包吧!