从零开始配置vim(23)——lsp基础配置
上一章,我们初步认识了lsp,并且对 nvim-treesitter插件进行了配置,为编辑器提供了代码着色、自动格式化以及增量选中功能。算是初步体验了 lsp的相关功能。从这篇开始我们通过lsp的功能,进一步提升代码编辑、查阅等功能的体验
neovim lsp
早期想通过 neovim
使用 lsp
得通过一个额外的插件 nvim-coc
。它使用 nodejs
实现,而且提供 lua
的接口。但是在 neovim
中混用不同编程语言有时候会出现莫名其妙的问题,比如我之前遇到的补全失效,但是过一段时间它自己又好了。好在 neovim
社区听从了程序员们对于 lsp
的呼唤,它内置了lsp
的客户端,并且为了方便配置服务端,它提供了一个名为 nvim-lspconfig
的插件。在现在的 neovim
版本下配置不同语言的 lsp
已经很方便了,根据官方的文档,我们只需要4步即可
- 安装
nvim-lspconfig
插件 - 安装对应语言
lsp
的服务端 - 针对
xx
语言,添加语言的配置require('lspconfig').xx.setup{…}
- 检查
lsp
的服务端在该缓冲区是否正常运行print(vim.inspect(vim.lsp.buf_get_clients()))
安装 nvim-lspconfig
好了,我们按照官方的提示,我们先来配置 lua
相关的内容,以便后期在写配置时可以有更好的编程体验。
use {'neovim/nvim-lspconfig'}
我们可以去微软的官方网站查看各个语言的服务端信息 https://microsoft.github.io/language-server-protocol/implementors/servers/
安装对应服务端
针对 lua
语言我们选中的是 sumneko/lua-language-server
这个服务端。根据 wiki
页面的安装方式,我们可以使用命令行自行安装。但是现在有了更方便的方式了我们使用 nvim-lsp-installer
插件进行安装。
use {
"williamboman/nvim-lsp-installer",
"neovim/nvim-lspconfig",
}
我们还是一样,在plugin-config
目录下创建一个配置文件用来配置 nvim-lsp-installer
插件
require("nvim-lsp-installer").setup {}
我们可以使用 LspInstallInfo
命令来查看当前lsp服务的安装情况。我们使用 :LspInstall --sync [server]
来安装对应的服务端。其中 --sync
代表我们希望以同步的方式安装,也就是安装时会卡主 neovim
主体。使用下面的命令来安装 lua
的服务端
:LspInstall --sync sumneko_lua
我们可以在 这个页面 查看 nvim-lsp-installer
插件支持的各个语言对应的服务端
针对lua进行配置
安装完成之后,我们来配置 lua
相关的内容。不知道还记不记得我们之前介绍 文件类型的时候说过不同文件类型的配置都在 ~/.config/nvim/ftplugin
里面。我们在这个目录里面定义一个 lua.lua
的文件,写入以下内容
-- 是否将 tab 替换为 space
vim.bo.expandtab = true
vim.bo.shiftwidth = 4
vim.bo.tabstop = 4
vim.bo.softtabstop = 4
-- 取消自动注释,当前行是注释时,按下回车键会默认添加一行注释,这里取消这一行为
vim.opt_local.formatoptions = vim.opt_local.formatoptions - {"r", "c", "o"}
我们之前分析过 neovim
是如何实现文件类型检测的。在那篇文章中我们说它定义了自动命令,当检测到对应文件类型的时候会调用 ~/.config/nvim/ftplugin
目录中对应以文件类型命名的目录或者 lua
文件。使用这种方式有两个好处,第一个就是我们不用手动使用 require
来加载了,第二个好处就是可以根据文件类型动态的选择调用或者不调用,而且这个工作由 neovim
自动完成,不需要我们进行干预
基于这些好处,我们在 ftplugin/lua.lua
中保存 lua
相关的配置。另外再在 ~/.config/nvim/lua
目录创建一个 lsp
目录,专门用来保存语言的配置。然后再在 ftplugin/lua.lua
中加载它
require('lsp/lua')
我们在这个文件中添加 Lua
相关的lsp配置
-- 定义快捷键
-- 根据官方的提示,这里我们使用 on_attach 表示当前缓冲加载服务端完成之后调用
local on_attach = function(client, bufnr)
-- 跳转到声明
vim.api.nvim_buf_set_keymap(bufnr, "n", "gd", "<cmd>lua vim.lsp.buf.declaration()<CR>", {silent = true, noremap = true})
-- 跳转到定义
vim.api.nvim_buf_set_keymap(bufnr, "n", "gD", "<cmd>lua vim.lsp.buf.definition()<CR>", {silent = true, noremap = true})
-- 显示注释文档
vim.api.nvim_buf_set_keymap(bufnr, "n", "gh", "<cmd>lua vim.lsp.buf.hover()<CR>", {silent = true, noremap = true})
-- 跳转到实现
vim.api.nvim_buf_set_keymap(bufnr, "n", "gi", "<cmd>lua vim.lsp.buf.implementation()<CR>", {silent = true, noremap = true})
-- 跳转到引用位置
vim.api.nvim_buf_set_keymap(bufnr, "n", "gr", "<cmd>lua vim.lsp.buf.references()<CR>", {silent = true, noremap = true})
-- 以浮窗形式显示错误
vim.api.nvim_buf_set_keymap(bufnr, "n", "go", "<cmd>lua vim.diagnostic.open_float()<CR>", {silent = true, noremap = true})
vim.api.nvim_buf_set_keymap(bufnr, "n", "gp", "<cmd>lua vim.diagnostic.goto_prev()<CR>", {silent = true, noremap = true})
vim.api.nvim_buf_set_keymap(bufnr, "n", "gn", "<cmd>lua vim.diagnostic.goto_next()<CR>", {silent = true, noremap = true})
end
require'lspconfig'.sumneko_lua.setup {
settings = {
Lua = {
runtime = {
-- Tell the language server which version of Lua you're using (most likely LuaJIT in the case of Neovim)
version = 'LuaJIT',
},
diagnostics = {
-- Get the language server to recognize the `vim` global
globals = {'vim'},
},
workspace = {
-- Make the server aware of Neovim runtime files
library = vim.api.nvim_get_runtime_file("", true),
},
-- Do not send telemetry data containing a randomized but unique identifier
telemetry = {
enable = false,
},
},
},
on_attach = on_attach,
}
大部分的配置都是根据 sumneko_lua
官方的文档抄过来的,这里我们需要着重强调一下 on_attach
这里,根据 nvim-config
的描述,当 lsp
服务程序加载完成之后会调用我们在 on_attach
出指定的回调函数,在函数内部我们使用 vim.api.nvim_buf_set_keymap
仅仅针对当前加载了lsp
服务的缓冲区进行,而对于其他普通文件我们不需要用到这些快捷键。
看到这里不知道小伙伴是否有点头晕了,这次我们安装了好多内容,也创建了不少配置文件,下面来回顾一下
- 安装
nvim-lspconfig
来用于lsp的配置 - 安装
nvim-lsp-installer
来安装不同语言的lsp
服务端 - 安装
sumneko_lua
作为lua
语言的lsp
服务端 - 创建了一个
~/.config/nvim/ftplugin
作为加载lua
语言配置的入口 - 创建了一个
~/.config/nvim/lsp/lua.lua
保存lua
语言相关的配置
本篇只讲了如何基于 neovim
官方给出的那4步来配置一个语言的 lsp
服务端,但是还有如何自动补全没有谈到,下节我们将开始讲解如何使用自动补全。敬请期待!
从零开始配置vim(23)——lsp基础配置的更多相关文章
- 【linux配置】Redhat6.5基础配置指南
Redhat6.5基础配置指南 本文针对鄙人在工作中常用系统配置加以说明,通常公司用于生产和测试的服务器基本上都不能连接外网,需要针对刚刚安装好的系统做一系列的常用配置. 一.常用基础系统配置 1.关 ...
- Emacs学习心得之 基础配置
作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础配置 1.前言2.基础配置 一.前言 本篇博文记录了Emacs的一 ...
- webpack3.x版本实战案例【基础配置篇】(一)
本文旨在通过一个一个实战例子来学习webpack如何配置,更加深入的学习webpack在实战项目中如何配置. 我们学习哪些配置呢? [基础配置] 打包JS 编译ES6 编译typeScript 打包公 ...
- Java开发学习(三)----Bean基础配置及其作用范围
一.bean基础配置 对于bean的基础配置如下 <bean id="" class=""/> 其中,bean标签的功能.使用方式以及id和clas ...
- SpringMVC常用配置(二),最简洁的配置实现文件上传
Spring.SpringMVC持续介绍中,基础配置前面已经介绍了很多,如果小伙伴们还不熟悉可以参考这几篇文章: 1.Spring基础配置 2.Spring常用配置 3.Spring常用配置(二) 4 ...
- Vim基础配置
vim 个性化设置 安装插件管理器Vundle: 创建目录: mkdir -p ~/.vim/bundle 下载文件: git clone https://github.com/VundleVim/V ...
- HAproxy 基础配置
基础配置详解 HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分 global:全局配置段 进程及安全配置相关的参数性能调整相关参数Debug参数 ...
- 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)
从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...
- WEKA使用(基础配置+垃圾邮件过滤+聚类分析+关联挖掘)
声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的WEKA,实验内容主要有三部分,第一是分类挖掘(垃圾邮件过滤),第二是聚类分析, ...
- nginx 的基础配置[转]
nginx 的基础配置 分类: 工具软件2013-11-13 23:26 11人阅读 评论(0) 收藏 举报 目录(?)[-] 管理配置文件 全局配置 虚拟机server配置 location配置 ...
随机推荐
- JSP | out 对象详解
原作者为 RioTian@cnblogs, 本作品采用 CC 4.0 BY 进行许可,转载请注明出处. 本篇学习自:C语言中文网,部分内容转载仅供学习使用. \[QAQ \] out 对象是一个输出流 ...
- Codeforces Round #725 (Div. 3) A~G 题解记录
补题链接:Here 1538A. Stone Game 数组 \(a\) 的大小为 \(n\) ,请问每次可以删除最左和最右侧的元素,请问最少执行多少次能删除掉数组中的最大值和最小值 (\(1\le ...
- Windows 10 修改环境变量不重启生效的解决方案
# 表示 Win 键 #R 进入 cmd(不要使用 Listary 的 cmd 方式进入,设置不会生效) 键入 set PATH=C: 关闭窗口 同样方式打开 cmd 键入 echo %PATH%,会 ...
- 云原生体系下 Serverless 弹性探索与实践
Serverless 时代的来临 Serverless 顾名思义,是一种"无服务器"架构,因为屏蔽了服务器的各种运维复杂度,让开发人员可以将更多精力用于业务逻辑设计与实现.在 Se ...
- oralce用户锁-表锁
一.数据库在使用中,如果多次使用错误密码登录会导致用户锁住无法正常登陆. 解决方法:dba用户登录后使用语句搞定 alter user testuser account unlock; 注:test ...
- Winform的使用
Winform是什么 以下内容,来自朝夕教育课程,没有基础的可以去朝夕学学.这里主要是为了方便我自己回顾查询 创建Winform程序 Program类 Winform项目结构介绍 Winform控件简 ...
- 洛谷 P9683 A Certain Forbidden Index 题解
题目链接:\(\color{Purple}\texttt{P9683 A Certain Forbidden Index}\). 填坑.提供一个相对好写的做法. 考虑把一堆不交的区间绑在一起问(即先询 ...
- 如果诸葛亮会编程,用Java写出师表...
继上一篇 "如果诸葛亮用C#写出师表..."后,站长想自己的第一语言是Java,虽然平时工作上用的不多,也用Java实现一遍吧,改改就是了,无非就是: C#的Console.Wri ...
- PR 调整时间线宽度
1.问题 这里的宽度太小,不好进行下一步的调整 2.解决方法 方法一 按下=可以放宽 按下-(=左边的那个键)可以缩小宽度 方法二 拖动下方的滑动条即可 方法三 按住ALT+滚轮,即可调节
- CSS - 滤镜的妙用 - 制作炫彩圆环(外加动画)
效果图如下: 话不多说,上代码: <!DOCTYPE html> <html lang="en"> <head> <meta charse ...