nvim-lsp-学习
LSP 介绍
LSP, 指 Language Server Protocol, 是一种用于开发集成开发环境 (IDE) 和编辑器的通信协议. 它的主要作用是提供一种标准化的方式, 使不同的编辑器和开发工具能够与各种编程语言的语言服务器进行交互.
LSP 的主要 features 有:
- go-to-definition, 即跳转到定义处
- find-references, 查找变量的引用
- hover, 悬停时显示信息
- completion, 自动补全
- rename, 修改变量名称
- format, 整理代码
等.
一般的设置步骤为:
- 安装 language server (可在 https://microsoft.github.io/language-server-protocol/implementors/servers/ 中查找可用列表)
- 给每一个 language server 配置一个 LSP client
- 配置 keymaps 和 autocmds 来完善 LSP features
lsp-config
在 LSP client 启用后, 其会启用 vim.diagnostic
, 以及几个选项:
omnifunc
, 其值设置为vim.lsp.omnifunc()
, 用于触发补全 (默认绑定在 insert 模式的Ctrl-X
和Ctrl-O
)tagfunc
, 设置为vim.lsp.tagfunc()
, 启用跳转功能,formatexpr
, 设置为vim.lsp.formatexpr()
, 触发格式化文件 (默认绑定在gq
)K
, 设置为vim.lsp.buf.hover()
禁用默认 lsp config
1 |
|
相关 vim options 解释
complete-functions
这类 function 用于赋值给 completefunc
, thesaurusfunc
和 omnifunc
options.
其用于完成两件事:
- Find the start of the text to be completed
- Find the matches
函数有两个参数, a:findstart
和 a:base
, 在完成上述两个任务时传入的值不同.
在完成 1
时:
a:findstart=1
, 相当于一个 bool 值, 表示这次调用是用于 findstarta: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 starta: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 wordmenu
, string, 在 menu 中显示在 “word” or “abbr” 之后的 extra textinfo
, string, 显示在 preview wiindow 中的信息kind
, string, single letter 用于表示 completion 的类型icase
, int, 非零时不考虑 case 来比较文本equal
, int, 非零时, 始终把当前 “word” 视为 completion 的文本dup
, int, 非零时, 允许重复empty
, int 非零时允许添加空字符串user_data
, 可以为任意类型, 为用户自定义, available inv:completed_item
对于 kind
, 可用的值有:
v
, variablef
, function or methodm
, member of a struct or classt
, typedefd
, #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
选项需包含menu
或menuone
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 有第三方提供.