Skip to content

Latest commit

 

History

History
733 lines (472 loc) · 22.7 KB

File metadata and controls

733 lines (472 loc) · 22.7 KB
aliases
tags
protocol
lsp
created 2024-04-07 17:48:22 -0700
modified 2025-09-24 22:54:53 -0700

LSP 协议笔记


关于 LSP

[!quote] 官方定义

The Language Server Protocol (LSP) defines the protocol used between an editor or IDE and a language server that provides language features like auto complete, go to definition, find all references etc.

一种用于为编辑器或 IDE 提供,诸如自动补全、定义跳转、查找关联等语言功能的编程语言服务协议。

LSP 相关网站:


常用语言 LSP

从 LSP 官网给的 列表,能看到各种语言的 LSP 实现。

C/C++

clangd clangd 是 clang 的扩展工具(clang-tools-extra),新版本是在 LLVM 中,安装 LLVM 就有 clangd 了。

安装完可以执行以下命令,如果能出现版本信息就证明 clangd 能用了!

clangd --version

clang-format

clang-format 是 clangd 附带的格式化工具。

clang-format 全局配置文件是放在用户根目录下的**.clang-format**,既~/.clang-format。

clang-format 配置文件不必全手工,可以使用 clang-format 生成指定风格的模板文件,然后再在此文件上进行自定义修改即可。

clang-format -style=格式名 -dump-config > 文件名

[!info]

clang 的格式风格有很多,如 google、微软、Mozilla 等。

文件名可以取任何名字,一般取 .clang-format_clang-format,这样能让 clang-format 识别。

[!info] clang-format 格式文档

Clang-Format Style Options

生成 llvm 风格的模板:

clang-format -style=llvm -dump-config > .clang-format

生成 google 风格的模板:

clang-format -style=google -dump-config > .clang-format

clang-format 配置
示例
BasedOnStyle: Google     # 配置格式化基于哪家的风格 有Google LLVM 微软等
# BasedOnStyle: LLVM
# BasedOnStyle: Microsoft
IndentWidth: 4       # 缩进宽度
TabWidth: 4        # tab缩进宽度
# UseTab: Always
UseTab: AlignWithSpaces     # 是否使用Tab缩进
AllowShortFunctionsOnASingleLine: Empty # 简单函数格式化成单行 Empty是函数体是空的才格式化成单行样式
AllowShortBlocksOnASingleLine: Empty # 简单代码块格式化成单行 Empty是代码块是空的才格式化单行样式
AlignConsecutiveAssignments: true  # 连续赋值对齐
# AlignConsecutiveDeclarations: true # 连续声明对齐

[!infot] 配置详解

使用 clang-format -style=格式名 -dump-config > 文件名 这个语法生成的配置文件,默认会将 BaseOnStyle 注释掉,而把全部属性都在文件中显式地设置一遍 -- 其实就是将某厂商风格配置文件 Copy 一份过来而已,这非常不「优雅」。

而更好的做法应该是,将 BaseOnStyle 属性注释取消,这意味着明确告诉 clang-format 格式化器,配置文件是使用哪家厂商的风格为底板,配置文件中设置的属性是自定义设置的外,其他属性都使用 BaseOnStyle 指定的厂商默认配置。这样设置,就使用配置文件中的配置项非常的少,以一种更「优雅」的方式自定义自己的格式化风格。


Java LSP

jdtls

jdtls 这是 Eclipse 开发的 Java 的 LSP。

Tip

  • jdt:Java Development Tools
  • ls:Language Server

Kotlin LSP

kotlin-language-server

kotlin-language-server 这是一个 Kotlin_Note 的 LSP。

这东西是官方 LSP 出来之前的产物,现在官方的 kotlin-lsp 出来了,这个 LSP 历史使命也将结束。

kotlin-lsp

kotlin-lsp 这是 jetbrains 出的 Kotlin 的 LSP。

安装,这货有 VSCode 插件版和独立安装版。

Tip

kotlin-lsp 需要 JDK17 及以上版本。

如果不用 VSCode,就安装独立安装版,Linux 下可以使用系统的包管理器安装,如:yay -S kotlinbb-lsp-bin(挺大的 500~600M)

Groovy LSP

groovy-language-server

groovy-language-server 是一个 Groovy 的 LSP。

下载源码,编译安装:

./gradlew build

运行:

java -jar groovy-language-server-all.jar

Python LSP

python lsp 实现:

微软的 python lsp :VSCode 中 python 提示、语法分析等功能,用的是就是这个 LSP。VSCode 中 Python Python extension for VSCode Repo 插件其实就是这个 LSP 的 Client。这个 LSP 一般是安装 VSCode Python 插件时,一起安装的。

Pydev on VSCode : 这是 Pydev 针对 VSCode 的 python 插件。这个插件应该是既是 Server 也是 Client。

之前两种 LSP 跟 插件耦合太明显,下面几款 LSP 能在各种编辑器用:


下面几款 Python LSP 名字都有点相近:

pyright

pyright 是微软新推出的 LSP,上面那个要被微软废弃了!因为微软 VSCode 自己用的是 Pylance,所以开源的 Pyright 估计会被微软阉割,所以下场也不会太好!

安装

pyright 可以用 npm 装也可以用 pip 装,不过还是建议使用 npm 装,毕竟人家是用 TypeScript 写的嘛!

npm i -g pyright

jedi

jedi 这是 Python 界大名鼎鼎的 LSP,很多后来的 Python LSP 都是它的子孙。

python-language-server

python-language-server 这款 LSP 是基于 jedi 。 这款 LSP 需要 Python 版本是 3.5+。 这款 LSP 是 vim-lsp 示例配置中 Python 的 LSP。 这款 LSP 依赖的 [jedi] 版本相对「保守」点。

python-language-server 安装:

pip install 'python-language-server[yapf]'
# 或者
pip install 'python-language-server[all]'

如果报 'install_requires' must be a string or list of strings 类似错误,请执行以下代码:

pip install -U setuptools

测试 python-language-server 是否安装成功:pyls --help

这个 LSP 已经是「unmaintained」,所以建议别用了!

jedi-language-server

jedi-language-server 灵感源于上面那款。 这款 LSP 要求 Python 的版本是 3.7+。 这款 LSP 是比较新的,在 vim 下 使用效果挺不错的。这也是几个 python 版本 lsp 在 deoplete+vim-lsp,能正常代码提示的 LSP。

Tip

其他 python 的 LSP 代码提示不正常,有可能是依赖的 jedi 等模块版本发生冲突,这大概是直接在 pip 中安装多个 python 的 LSP 所致。所以建议,如果想换着 LSP 来「玩」,可以使用 pipx 来装,这样每个 LSP 都有各自的虚拟环境,互不干扰。

jedi-language-server 安装:

pip install -U jedi-language-server

python-langserver

python-langserver 这个 LSP 已经停止维护了!

python-lsp-server

python-lsp-server 同样是一款基于 jedi,由 Spyder IDE 的团队在维护的 Python LSP。Spyder IDE 用的也是这个 LSP 实现。这个 LSP 是要求 Python 的版本是 3.7+

python-lsp-server 安装:

pip install "python-lsp-server[yapf]"
# 或者
pip install "python-lsp-server[all]"

安装出现 'install_requires' must be a string or list of strings 类似的错误,请执行以下代码:

pip install -U setuptools

测试是否安装成功:pylsp -V

这个 Python LSP 应该是当下主流使用的,毕竟至今还在更新。

[!tip] 注意

pylsp 这个 LSP 用的 jedi 模块的版本可能与 jedi-language-server 存在差异,如果使用 pip 直接安装,可能造成不必要的冲突,建议使用 pipx 来装,这样两个 LSP 都在各自的虚拟环境中运行,互不干扰。

ty

ty 是一个使用 Rust 写非常新的 PythonLSP。

此 LSP 当前还处于「Preview」,所以尝鲜的可以试下,不建议用于正式的生产环境。

ruff

ruff

ruff-lsp

ruff-lsp 因为没有补全功能,所以应跟 Python 其他 LSP,如 pyright 配合使用,而 ruff-lsp 主要用来诊断用的。(ruff-lsp README neovim example


Lua LSP

lua-lsp

lua-lsp 这个 LSP 只支持 lua 版本到 5.3。

lua-language-server

lua-language-server


Ruby LSP

ruby_language_server

ruby_language_server

Ruby LSP

ruby-lsp

安装:

gem install ruby-lsp

Solargraph

Solargraph: A Ruby language server.

安装:

gem install solargraph

sorbet

sorbet 安装完后, 使用 srb 来调用。

gem install sorbet
gem install sorbet-runtime

steep

steep

gem install steep

YAML LSP

yaml-language-server

yaml-language-server 这个是 RedHat 提供的 yaml 的 LSP。

安装:

npm install yaml-language-server -g

Rust LSP

请参考笔记:Rust LSP

TOML

TOML LSP 使用 Taplo


Vim LSP

vim language server

vim language server

安装:

npm install -g vim-language-server

最好连 vscode-langservers-extracted 这个也装上:

npm i -g vscode-langservers-extracted

有的 LSP 会用到这:nvim-lspconfig server configuration docs about html


Emmet LSP

emmet-ls

emmet-lsemmet 的 LSP。

安装:npm install -g emmet-ls

emmet-language-server

emmet-language-server 这同样也是一个 emmet 的 LSP。它好像与 VSCode 内置的 emmet 功能有关联。而且 fix 了 emmet-ls 一些问题。

这个 LSP 也是 Neovim 的插件 nvim-emmet 所依赖的 LSP。

安装:npm i -g @olrtg/emmet-language-server


HTML LSP

html 的 LSP 就没什么可选的,因为这东西编辑器本身就能实现代码提示,所以 LSP 大概就只有微软的:html-language-server

安装:

npm install -g vscode-html-languageserver-bin

这个 LSP 运行程序名是:vscode-html-languageservice


CSS LSP

css-language-server

css-language-server

安装:

npm install css-language-server -g

css-language-server 的程序名:css-languageserver

当然,也可以安装另一个的 css lsp:

npm install -g vscode-css-languageserver-bin

Tip

还是建议装 vscode-css-languageserver-bin 这个 lsp,上面那个 lsp,版本号才 0.0.2,看那个鬼样子,基本不怎么更了。


TypeScript LSP

typescript-language-server

typescript-language-server 这个 LSP 已过时。

Typescript language server

名字完全一样。这个 typescript-language-server 是上面那款的「继任者」。

这个 LSP 程序名:tsserver

安装:

npm install -g typescript-language-server typescript

[!info]

如果 typescript 已经安装,可以省略:npm install -g typescript-language-server

运行:

typescript-language-server --stdio

问题

有时想重装 TypeScript,但会报错,会出现装不了 typescript,也卸载不了情况。如下:

npm ERR! code ENOTEMPTY
npm ERR! syscall rename
npm ERR! path /home/silascript/nodejs/node_global/lib/node_modules/typescript
npm ERR! dest /home/silascript/nodejs/node_global/lib/node_modules/.typescript-k7ovRQHn
npm ERR! errno -39
npm ERR! ENOTEMPTY: directory not empty, rename '/home/silascript/nodejs/node_global/lib/node_modules/typescript' -> '/home/silascript/nodejs/node_global/lib/node_modules/.typescript-k7ovRQHn'

npm ERR! A complete log of this run can be found in: /home/silascript/nodejs/node_cache/_logs/2024-03-14T10_44_17_348Z-debug-0.log

这只能「暴力出奇迹了」:删除相关目录:cachemodule 相关目录,如 rm -rf /home/silascript/nodejs/node_global/lib/node_modules/.typescript-k7ovRQHnrm -rf /home/silascript/nodejs/node_global/lib/node_modules/typescript ,删完再重装,就能装了!


SQL LSP

sqls

sqls 这是用 Go 写的 SQL LSP。

支持以下几种 数据库系统

安装
go install github.com/sqls-server/sqls@latest

运行和调用名称为:sqls

配置和启用 LSP

LSP 配置文件 sqls.lua

---@brief
---
--- https://github.com/sqls-server/sqls
---
--- ```lua
--- vim.lsp.config('sqls', {
---   cmd = {"path/to/command", "-config", "path/to/config.yml"};
---   ...
--- })
--- ```
--- Sqls can be installed via `go install github.com/sqls-server/sqls@latest`. Instructions for compiling Sqls from the source can be found at [sqls-server/sqls](https://github.com/sqls-server/sqls).

---@type vim.lsp.Config
return {
	cmd = { "sqls" },
	filetypes = { "sql", "mysql" },
	root_markers = { ".sqls", "config.yml" },
	settings = {},
}

启用设置:

vim.lsp.enable({
	"sqls",
})
配置数据库链接

全局配置是在 .config/sqls/ 目录下新建 config.yml 配置文件:

# Set to true to use lowercase keywords instead of uppercase.
lowercaseKeywords: true
connections:
  - alias: sqls_mysql
    driver: mysql
    dataSourceName: root:123456@tcp(localhost:3356)/exercise01

[!info]

lowercaseKeywords 这是设置关键字是否使用小字字母

参考:sqls-server#configuration-file-sample

sql-language-server

sql-language-server 是使用 TypeScript_Note 写的 SQL LSP。

[!info]

实话在这 LSP 好像针对 VSCode 设计,Neovim 下使用非常烂,真的比不上 sqls

安装
npm i -g sql-language-server

运行或调用的名称是 sql-language-server,在使用 nvim-lspconfig 配置 LSP 时,其缩略名为 sqlls,与 sqls 很相似,得注意区分。

Tip

新版本 nvim,已经淘汰 nvim-lspconfig,使用 vim.config 来配置,所以自定义配置文件时,名称可以不再使用 sqlls 这个容易与 sqls 相混淆的名称。

配置

可能需要配置相应的数据库连接,配置文件为:.sqllsrc.json

  • 全局是放在 ~/.config/sql-language-server/ 目录下。

官方示例:

{
  "connections": [
    {
      "name": "sql-language-server",
      "adapter": "mysql",
      "host": "localhost",
      "port": 3307,
      "user": "username",
      "password": "password",
      "database": "mysql-development",
      "projectPaths": ["/Users/joe-re/src/sql-language-server"],
      "ssh": {
        "user": "ubuntu",
        "remoteHost": "ec2-xxx-xxx-xxx-xxx.ap-southeast-1.compute.amazonaws.com",
        "dbHost": "127.0.0.1",
        "port": 3306,
        "identityFile": "~/.ssh/id_rsa",
        "passphrase": "123456"
      }
    },
    {
      "name": "postgres-project",
      "adapter": "postgres",
      "host": "localhost",
      "port": 5432,
      "user": "postgres",
      "password": "pg_pass",
      "database": "pg_test",
      "projectPaths": ["/Users/joe-re/src/postgres_project"]
    },
    {
      "name": "sqlite3-project",
      "adapter": "sqlite3",
      "filename": "/Users/joe-re/src/sql-language-server/packages/server/test.sqlite3",
      "projectPaths": ["/Users/joe-re/src/sqlite2_project"]
    }
  ]
}

[!info]

sql-language-server#configuration

  • 项目级别就将 .sqllsrc.json 放在当前项目根目录下。

配置上项目级别的 .sqllsrc.json 与全局的有「些许」不同:

[!info]

如果项目级别的 .sqllsrc.json 中的 name 属性值与全局的一样,这两份配置就会合并。


Docker LSP

docker-language-server

docker-language-server 这是一款 Docker_Note 的 LSP。

[!quote]

The Docker Language Server is a language server for providing language features for file types in the Docker ecosystem (DockerfilesCompose files, and Bake files).

安装

这个 LSP 是使用 Go 开发的,所以需要 Go 环境。

go install github.com/docker/docker-language-server/cmd/docker-language-server@latest

Markdown LSP

#lsp #markdown

marksman

marksman

markmark

markmark

安装 markmark:

npm install -g markmark

markdown-oxide

markdown-oxide 这是一个功能非常强的 LSP,比 markmarkmarksman 都要强。

安装:

yay -S markdown-oxide

如果本机已装有 Cargo,可以通过 Cargo 来安装:

cargo install --locked --git https://github.com/Feel-ix-343/markdown-oxide.git markdown-oxide

Vue LSP

VLS VLS Repo

安装:

npm install vls -g

其他 LSP

bash-language-server

bash-language-server 顾名思义这是一款 Bash 的 LSP。

使用 nodejs 安装:

npm i -g bash-language-server

diagnostic-languageserver

diagnostic-languageserver 这个是一个通用诊断语言服务器。

主要有两功能:

  • 诊断
  • 格式化

这个 LSP 对于那些没有专门的 LSP 的编程语言,如 Shell,是非常好的补充,至少有个 LSP 可用的。

npm install diagnostic-languageserver -g

相关笔记