Erlang LS指南(一)

欢迎来到 Erlang LS的世界

为编程语言实现自动完成或跳转到定义等功能并非易事。传统上,必须为每个开发工具重复这项工作,并且需要目标编程语言和所选开发工具内部使用的编程语言的专业知识组合。

一个绝妙的直觉, Language Server Protocol,也称为 LSP,改变了游戏规则。对 Erlang 社区来说是一个真正的祝福。

Erlang LS 是一个为 Erlang 编程语言提供语言特性的语言服务器。该服务器可与 Emacs、VSCode、Sublime Text 3、Vim 以及可能更多遵循 LSP 协议的文本编辑器和 IDE 配合使用。

这些页面包含配置您喜欢的文本编辑器或 IDE 以及使用 Erlang LS 所需的所有信息。您还将找到有关如何配置服务器以识别项目结构并在事情未按预期工作时对安装进行故障排除的说明。

保持联系

如果您对该项目有任何疑问,请随时在 GitHub 上打开一个新issue。 如果您想参与其中或喜欢更非正式的交流方式,也可以加入 Erlanger Slack 中的 #erlang-ls 频道。 欢迎所有贡献,无论是以错误报告、问题、反馈或代码的形式。

入门

Erlang LS 语言服务器适用于所有遵守 LSP 协议的文本编辑器和 IDE。 支持的编辑器列表包括 Emacs、Vim、VS Code、Sublime Text 3 等。

这些页面包含配置您喜欢的文本编辑器或 IDE 以使用 Erlang LS 所需的所有信息。 您还将找到有关如何配置服务器以识别项目结构并在事情未按预期工作时对安装进行故障排除的说明。

Emacs

安装

官方的 lsp-mode package 包括一个 Erlang 语言服务器的客户端。

在这里,您可以找到一个示例的 Emacs 配置文件,它安装和配置使所有 Erlang LS 功能正常工作所需的所有包。可以使用这个配置文件作为 Erlang LS Emacs 配置的起点。

每当第一次打开项目时,emacs-lsp 都会提示您选择正确的项目根目录。在那种情况下,您还有机会将项目列入黑名单。有关项目的信息存储在 lsp-session-file 变量指向的文件中。它的默认位置是 ~/.emacs.d/.lsp-session-v1。如果您改变主意将项目列入黑名单或错误地选择了项目根目录,则可能需要修剪或修改此文件。有关 lsp-session-file 和 emacs-lsp 的更多信息,请参阅官方文档。

请记住,Erlang 语言服务器需要 Erlang/OTP 21 或更高版本才能运行,因此请确保 OTP 21+ 在您的 PATH 中可用。例如,这可以通过使用 exec-path-from-shell Emacs 包来实现。

重启Language Server

您可能希望快速重新启动给定工作区的Language server(例如,在更新后或服务器崩溃的情况下)。 可以采用如下代码:

M-x lsp-workspace-restart

故障排除

如果事情没有按预期工作,我们建议您仅使用提供的示例文件中的配置启动 Emacs,使用以下命令:

emacs -q -l [PATH-TO-ERLANG-LS]/misc/dotemacs

这将从表达式中消除与您工作站上可能拥有的其他软件包或配置的潜在不兼容性,并且可能与 Erlang LS 冲突。

为了确保您没有安装过时或不兼容的软件包,您可能还想在对 Erlang LS Emacs 设置进行故障排除时重命名 ~/.emacs.d 目录。

此外,确保 Erlang(即 erl、escript 和朋友)和 erlang_ls 可执行文件都在您的 PATH 中可用。 如果不是,您可以尝试以下方法:

;; Ensure your Emacs environment looks like your user's shell one
(package-require 'exec-path-from-shell)
(exec-path-from-shell-initialize)

最后,要在客户端启用日志记录,只需:

(setq lsp-log-io t)

然后,您可以通过执行以下操作来跟踪当前工作区的客户端日志:

M-x lsp-workspace-show-log

技巧和窍门

您可以运行 M-x lsp-avy-lens 在shortcuts旁边显示字母。 然后,您可以按这些字母来触发相应的操作。

如果你已启用 ((setq lsp-ui-sideline-enable t)),您还可以使用 M-x lsp-execute-code-action 来触发快速修复操作。

Spacemacs

安装

开发分支包括一个 Erlang 层,支持使用 Erlang LS 作为后端的语言服务器协议。

您可以在此处找到有关安装和配置以及支持的功能的信息。

在设置 dotspacemacs-configuration-layers 时,可以配置 lsp 和 erlang-mode 变量,例如:

dotspacemacs-configuration-layers
'(
;...
lsp
(erlang :variables
        erlang-backend 'lsp
        erlang-root-dir "<path to>/otp_22/lib/erlang"
        erlang-man-root-dir "<path to>/otp_22_kred/lib/erlang/man"
        erlang-fill-column 100
        company-minimum-prefix-length 1
        company-idle-delay 0.3
        lsp-ui-doc-position 'bottom)
;...
)

VSCode

安装

Erlang 语言服务器可通过专用扩展在 VSCode 中使用。

要试用它,只需打开 VSCode 并通过 Marketplace 安装扩展:

Preferences > Extensions

寻找 erlang-ls 扩展并安装它。 就是这样。

请记住,Erlang 语言服务器需要 Erlang/OTP 21 或更高版本才能运行,因此请确保 OTP 21+ 在您的 PATH 中可用。

重启Language Server

您可能希望快速重新启动给定工作区的语言服务器(例如,在更新后或服务器崩溃的情况下)。 为此:

View -> Command Palette... -> Developer: Reload Window

在 Mac OS 上,您可以使用 Cmd+Shift+P 快捷方式快速访问命令面板。

Sublime Text 3

安装

安装 Erlang LS:

git clone https://github.com/erlang-ls/erlang_ls
cd erlang_ls
rebar3 escriptize

这将在以下位置创建一个 Erlang 脚本:

_build/default/bin/erlang_ls

尝试使用 –version 标志运行 Erlang LS 以验证一切是否按预期工作:

_build/default/bin/erlang_ls --version

确保 erlang_ls 在您的 PATH 中。

为 Sublime Text 3 安装 LSP 客户端

使用工具菜单中的命令面板,选择包控制:安装包并安装 LSP 包。

完成后,转到:

Preferences -> Package Settings -> LSP -> Settings

通过将以下配置添加到 LSP.sublime-settings – User 文件来添加 Erlang 客户端:

{
  "clients":
    {
      "erlang-ls":
        {
          "command"   : [ "erlang_ls", "--transport", "stdio" ],
          "enabled"   : true,
          "languageId": "erlang",
          "scopes"    : [ "source.erlang" ],
          "syntaxes"  : ["Packages/Erlang/Erlang.sublime-syntax"]
        }
    },
  // Allow up to 30 secs to `erlang_ls` to respond to `initialize`
  // (it requires less, but just to be on the safe side)
  "initialize_timeout": 30
}

就是这样。 打开一个新的 Erlang 项目并享受 Erlang LS。

故障排除

确保 Erlang LS 在你的 PATH 中

为了能够使用 Erlang LS,erlang_ls escript 需要在您的路径中。

启用日志记录

如果出现问题,您可以通过将以下配置添加到 LSP.sublime-settings – 用户文件来为 LSP 包启用额外的日志记录:

{
  // Show verbose debug messages in the sublime console.
  "log_debug": true,

// Show messages from language servers in the Language Servers output
// panel.
"log_server": true,

// Show language server stderr output in the Language Servers output
// panel.
"log_stderr": true,

// Show full JSON-RPC requests/responses/notifications in the Language
// Servers output panel.
"log_payloads": true
}

Sublime 控制台可以使用 Ctrl-` 快捷键进行切换。 可以使用命令 LSP:切换面板:语言服务器从命令面板切换输出面板。

IntelliJ

安装

警告:IntelliJ LSP 插件 (1.6.1) 的当前版本非常有限,因此并非所有 Erlang 语言服务器功能都在 IntelliJ 中可用。

首先,确保您已安装 LSP 支持插件。 如果你不这样做,你可以简单地导航到:

Preferences > Plugins > Browse Repositories

搜索“LSP Support”并安装相应的插件。

重新启动 IntelliJ,然后导航到:

Preferences > Languages and Frameworks > Language Server Protocol > Server Definitions

在那里,您可以指导 IntelliJ 如何启动服务器。 选择 Raw Command,设置 erl;hrl 作为扩展名,然后添加为命令:

/ABSOLUTE/PATH/TO/erlang_ls/_build/default/bin/erlang_ls --transport stdio

确保使用绝对路径。 该插件似乎不理解 ~ 符号。 要使上述命令正常工作,IntelliJ 需要正确配置 PATH 变量以包含 Erlang 20+。 要在 Mac OS 上规避这个问题,最好的方法是从终端(即通过 idea 命令)而不是通过 Spotlight 启动 IntelliJ。

要在悬停函数时可视化文档和类型规范,请确保在您的 IntelliJ 首选项中启用 Show quick documentation on mouse move 选项:

Preferences > Editor > General

在那里,您还可以设置以毫秒为单位的延迟。

有关如何配置 IntelliJ LSP 客户端的更多信息,请参阅项目 GitHub 页面。

故障排除

在某些情况下,IntelliJ LSP 客户端可能无法连接到服务器。 在这种情况下,第一步是启用日志记录:

Preferences > Languages and Frameworks > Language Server Protocol

选中此处的日志服务器通信复选框。

重新启动 IntelliJ 后,您会注意到在您的 Erlang 项目中创建了一个额外的 lsp 目录。 该目录包含错误和输出日志,它应该给你一个关于正在发生的事情的提示。

IntelliJ 日志表示另一种信息来源:

Help > Show Logs

Vim / NeoVim

使用Coc进行安装

以下说明应通过 Coc 系统(Vim 和 Neovim 的智能感知引擎)启用 Erlang 语言服务器集成。

使用 vim-plug 安装 Coc

对于安装了 nodejs >= 10.12 的 vim-plug 用户,安装插件只是:

" Use release branch (Recommended)
Plug 'neoclide/coc.nvim', {'branch': 'release'}

然而,要让插件知道 erlang_ls,它需要配置。

coc插件配置

coc是通过coc-settings.json配置的,可以在vim中通过以下命令打开:

:CocConfig

如果 erlang_ls 存在于您的 $PATH 变量中,那么以下配置就足够了:

{
  "languageserver": {
    "erlang": {
      "command": "erlang_ls",
      "filetypes": ["erlang"]
    }
  }
}

当 vim 开始编辑文件类型为 erlang 的文件时,如果可以启动并连接 erlang_ls 服务器,您应该会看到来自 Coc 的以下消息:

[coc.nvim] Erlang LS (in erlang_ls), version: X.Y.Z+build.REF

有关配置 Coc 和可能的键绑定的建议,请参阅其示例配置文档。

使用内置语言服务器客户端设置 Neovim

以下说明应该使用 Neovim 中的内置语言服务器客户端启用 Erlang 语言服务器集成。 nvim-lspconfig 插件用于配置、启动和初始化语言服务器。

安装 nvim-lspconfig

例如 vim-plug 安装:

Plug 'neovim/nvim-lspconfig'

启用Language Server

将以下设置调用添加到您的 init.vim 以使语言服务器附加到 Erlang 文件:

lua require'lspconfig'.erlangls.setup{}

现在,当您打开 Erlang 文件时,您应该会看到如下消息:

LSP[erlangls][Info] Erlang LS (in <your-project>), version: ..., OTP version: ...

通过编写一些不正确的代码来测试它。 您应该会看到语法错误消息。 运行 :LspInfo 以获取活动和已配置语言服务器的状态。

配置

LSP 命令没有默认的键绑定。 你可以在 nvim-lspconfig 插件页面的 Keybindings and completion 部分找到一个很好的例子来说明如何设置这些。 这个想法是创建一个函数来设置您的键绑定和配置,该函数将传递给上一节中的 setup 函数。 然后在附加 Erlang 语言服务器时调用此函数。 有关详细信息,请参阅 Neovim LSP 文档。

技巧和窍门

在 Neovim 中运行 :h vim.diagnostic.config 以获取有关如何显示诊断信息的说明。 :h vim.lsp.codelens.refresh 描述了如何显示代码镜头。

Related Posts

2021 年你需要知道的关于 Erlang 的一切

今天,我们将看一个相当古老且有些古怪的东西。 你们大多数人可能没有注意到的语言。 虽然 Erlang 不像某些现代编程语言那样流行,但它安静地运行着 WhatsApp 和微信等每天为大量用户提供服务的应用程序。 在这篇文章中,我将告诉你关于这门语言的更多事情、它的历史,以及你是否应该考虑自己学习它。 ## 什么是 Erlang,它在哪里使用? Erl

Read More

Erlang JIT中基于类型的优化

这篇文章探讨了 Erlang/OTP 25 中基于类型的新优化,其中编译器将类型信息嵌入到 BEAM 文件中,以帮助JIT(即时编译器)生成更好的代码。 ## 两全其美 OTP 22 中引入的基于SSA的编译器处理步骤进行了复杂的类型分析,允许进行更多优化和更好的生成代码。然而,Erlang 编译器可以做什么样的优化是有限制的,因为 BEAM 文件必须

Read More

Erlang JIT之路

自从Erlang 存在,就一直有让它更快的需求和野心。这篇博文是一堂历史课,概述了主要的 Erlang 实现以及如何尝试提高 Erlang 的性能。 ## Prolog 解释器 Erlang 的第一个版本是在 1986 年在 Prolog 中实现的。那个版本的 Erlang 对于创建真正的应用程序来说太慢了,但它对于找出Erlang语言的哪些功能有用,哪

Read More