从零开始配置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})
endrequire'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` globalglobals = {'vim'},},workspace = {-- Make the server aware of Neovim runtime fileslibrary = vim.api.nvim_get_runtime_file("", true),},-- Do not send telemetry data containing a randomized but unique identifiertelemetry = {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基础配置相关推荐
- vim 安装与基础配置
目录 零.须知 一.vim 安装 1.预安装 vi 卸载 2.依赖安装 3.源码下载与编译安装 4.在线安装 二.vim 基础配置 1.定位 vimrc 文件 2.添加基础配置 零.须知 以下所有操作 ...
- 【网络工程师配置篇】——OSPF基础配置!
作者:最铁头的网工 (全球首批HCIA-DATACOM认证者) 认证技术:关于HCIA-DATACOM认证技术知识会在我博客做持续更新... 本期分享:系列15点到16点半-技术热讯 感谢大家关注-最 ...
- 华为交换机导入配置_华为交换机基础配置1—进入命令行
交换机基础配置1-进入命令行 1.用户从终端成功登录至设备即进入用户视图,在屏幕上显示: 2.系统视图 在用户视图下,输入命令system-view后回车,进入系统视图. system-view En ...
- linux 内存告警门限,H3C LA系列无线网关 配置指导(V7)-R0304-6W100_基础配置指导_设备管理配置-新华三集团-H3C...
通过设备管理功能,用户能够查看设备当前的工作状态,配置设备运行的相关参数,实现对设备的日常维护和管理. · none:表示通过本地时钟源获取系统时间.配置该参数后,用户可通过命令行修改系统时间 ...
- 【交换机配置】华为S5731基础配置以及SSH配置
基础配置 sys sysname [规划好的交换机名]#创建vlan,配置vlanif接口地址 vlan batch 600 601 602 int vlanif 602 ip add [地址] [掩 ...
- Vim配置#Vim插件安装#NERDTree配置
一.centos系统的Vim安装 普通用户下输入命令:yum -y install vim* 之后输入y,即可等待安装完成. 二.Vim的配置 如果你需要配置vim,只需在Home目录创建一个~/.v ...
- linux还原vim默认配置,vim默认设置的配置
转载并修改自:http://space.itpub.net/8111049/viewspace-628456 在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能 ...
- BGP协议基础配置—学习
BGP重要概念 IGP是运行在AS内部的路由协议,主要有RIP.OSPF及IS-IS,着重于发现和计算路由. EGP是运行在AS之间的路由协议,通常是BGP,它是实现路由控制和选择最好的路由协议. 这 ...
- Exchange 2016部署实施案例篇-04.Ex基础配置篇(下)
上二篇我们对全新部署完成的Exchange Server做了基础的一些配置,今天继续基础配置这个话题. DAG配置 先决条件 首先在配置DGA之前我们需要确保DAG成员服务器上磁盘的盘符都是一样的,大 ...
最新文章
- 昨日,全球股市进入ICU!89岁股神巴菲特惊叹活久见!苹果微软万亿美金市值摇摇欲坠...
- 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小...
- android 设置自动弹框,安卓开发 弹出对话框,然后自动消失
- s1200 博图高速脉冲计数值没有变化_赤峰发泡硅胶板,高速公路橡胶垫橡胶厂-京品吉...
- mac bash 下使用vi 快捷方式——因为没有alt键 所以没有办法 用vi模式也非常方便的...
- linux下python脚本print中文显示不正确_在终端上运行python脚本,没有打印或显示-为什么?...
- OpenSSL漏洞补救办法详解(转)
- PAT之气死人不偿命的3n+1猜想
- centos安装python3.7和yum报错解决方法
- git add commit checkout 工作区 暂存区 远程仓库 区别
- PS常用快捷键(持续更新)
- 禁止恶意域名访问服务器方法
- replacestate 后退刷新_关于如何禁止浏览器后退及刷新功能
- 自定义实现IOC与DI
- youtube后端是python吗_Web后端开发,用Python还是Go呢?
- web前端需要学习什么?
- 使用frp+MobaXterm进行ssh远程连接报错及解决办法
- 三位一体自我陈述计算机专业,三位一体自我陈述报告
- 情侣一起看同步看电影H5网站 电影同步观看平台 (自己写的 已开源)
- [Android]如何做一个崩溃率少于千分之三噶应用app(15)-View分发module架构