nvim-lsp-学习

LSP 介绍

LSP, 指 Language Server Protocol, 是一种用于开发集成开发环境 (IDE) 和编辑器的通信协议. 它的主要作用是提供一种标准化的方式, 使不同的编辑器和开发工具能够与各种编程语言的语言服务器进行交互.

LSP 的主要 features 有:

  • go-to-definition, 即跳转到定义处
  • find-references, 查找变量的引用
  • hover, 悬停时显示信息
  • completion, 自动补全
  • rename, 修改变量名称
  • format, 整理代码
    等.

一般的设置步骤为:

  1. 安装 language server (可在 https://microsoft.github.io/language-server-protocol/implementors/servers/ 中查找可用列表)
  2. 给每一个 language server 配置一个 LSP client
  3. 配置 keymaps 和 autocmds 来完善 LSP features

lsp-config

在 LSP client 启用后, 其会启用 vim.diagnostic, 以及几个选项:

  • omnifunc, 其值设置为 vim.lsp.omnifunc(), 用于触发补全 (默认绑定在 insert 模式的 Ctrl-XCtrl-O)
  • tagfunc, 设置为 vim.lsp.tagfunc(), 启用跳转功能,
  • formatexpr, 设置为 vim.lsp.formatexpr(), 触发格式化文件 (默认绑定在 gq)
  • K, 设置为 vim.lsp.buf.hover()

禁用默认 lsp config

1
2
3
4
5
6
7
vim.api.nvim_create_autocmd('LspAttach', {
callback = function(ev)
vim.bo[ev.buf].formatexpr = nil
vim.bo[ev.buf].omnifunc = nil
vim.keymap.del("n", "K", { buffer = ev.buf })
end,
})

相关 vim options 解释

complete-functions

这类 function 用于赋值给 completefunc, thesaurusfuncomnifunc options.

其用于完成两件事:

  1. Find the start of the text to be completed
  2. Find the matches

函数有两个参数, a:findstarta:base, 在完成上述两个任务时传入的值不同.

在完成 1 时:

  • a:findstart=1, 相当于一个 bool 值, 表示这次调用是用于 findstart
  • a:base=empty

此时函数需要返回 start 的 column 值 (integer). 也就是找到文本从哪里 column 开始. 有几个特殊的返回值 (都是负数) 需要注意:

  • -2, 表示 cancel silently and stay in completion mode
  • -3, 表示 cancel silently and leave completion mode
  • 其他负数值, 表示 completion starts at the cursor column

在完成 2 时:

  • a:findstart=0, 表示此次调用不用于 find start
  • a:base=string, 用于匹配补全文本的 string (也就是当前文本)

此时函数可以返回 a List with the matching words (这里的 item 可以不单单包含用于补全的 word, 具体内容见后), 没有匹配到时返回 empty list.

函数也可以返回一个 Dict 用于包含更多信息, 这个 Dict 需包含的 items 为:

  • words, The List of matching words (必须有)
  • refresh, 用于控制函数 re-invocation 的字符串, 若设置为 always, 则函数会在每次 leading text 改变时调用

对于返回的 List, 其 item 可以为 a string or a Dictionary, 若为 a string 则用于 completion, 若为 Dictionary, 其可以包含:

  • word, string, 用于 completion 的文本 (必须有)
  • abbr, string, “word” 的缩写, 当非空时显示在 menu 中 instead of word
  • menu, string, 在 menu 中显示在 “word” or “abbr” 之后的 extra text
  • info, string, 显示在 preview wiindow 中的信息
  • kind, string, single letter 用于表示 completion 的类型
  • icase, int, 非零时不考虑 case 来比较文本
  • equal, int, 非零时, 始终把当前 “word” 视为 completion 的文本
  • dup, int, 非零时, 允许重复
  • empty, int 非零时允许添加空字符串
  • user_data, 可以为任意类型, 为用户自定义, available in v:completed_item

对于 kind, 可用的值有:

  • v, variable
  • f, function or method
  • m, member of a struct or class
  • t, typedef
  • d, #define or macro

在将 matched item 添加到 return list 中时, 通过调用 complete_add() 函数来添加, 在 searching for matches 的过程中, 可以通过调用 complete_check() 来允许用一个 keybinding 来 stop searching when it returns non-zero.

popupmenu-completion

Vim 提供了一种将 matches 显示在 a simplistic popup menu 的机制. 但其需要满足一些调用条件:

  • completeopt 选项需包含 menumenuone

CompleteDonePre 和 CompleteDone Events

completeopt

previewheight

complete_add() 和 complete_check()

omnifunc

omnifunc 选项默认值为空字符串, 且只对当前 buffer 起作用.

将其值指定为一个 function, 在 insert mode 用 CTRL-X, CTRL-O 调用 omni completion.

completefunc

thesaurusfunc

tagfunc

formatexpr

K

vim.lsp

vim.lsp 提供让 nvim 与 LSP Server 交互的 Lua 框架. (这里 nvim 就是 LSP Client)

这里的 LSP Server 有第三方提供.


nvim-lsp-学习
http://example.com/2024/03/11/nvim-lsp-学习/
作者
Jie
发布于
2024年3月11日
许可协议