上一章,我们初步认识了lsp,并且对 nvim-treesitter插件进行了配置,为编辑器提供了代码着色、自动格式化以及增量选中功能。算是初步体验了 lsp的相关功能。从这篇开始我们通过lsp的功能,进一步提升代码编辑、查阅等功能的体验

neovim lsp

早期想通过 neovim 使用 lsp 得通过一个额外的插件 nvim-coc 。它使用 nodejs实现,而且提供 lua 的接口。但是在 neovim 中混用不同编程语言有时候会出现莫名其妙的问题,比如我之前遇到的补全失效,但是过一段时间它自己又好了。好在 neovim 社区听从了程序员们对于 lsp 的呼唤,它内置了lsp 的客户端,并且为了方便配置服务端,它提供了一个名为 nvim-lspconfig 的插件。在现在的 neovim 版本下配置不同语言的 lsp已经很方便了,根据官方的文档,我们只需要4步即可

  1. 安装 nvim-lspconfig 插件
  2. 安装对应语言 lsp 的服务端
  3. 针对 xx语言,添加语言的配置 require('lspconfig').xx.setup{…}
  4. 检查 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基础配置相关推荐

  1. vim 安装与基础配置

    目录 零.须知 一.vim 安装 1.预安装 vi 卸载 2.依赖安装 3.源码下载与编译安装 4.在线安装 二.vim 基础配置 1.定位 vimrc 文件 2.添加基础配置 零.须知 以下所有操作 ...

  2. 【网络工程师配置篇】——OSPF基础配置!

    作者:最铁头的网工 (全球首批HCIA-DATACOM认证者) 认证技术:关于HCIA-DATACOM认证技术知识会在我博客做持续更新... 本期分享:系列15点到16点半-技术热讯 感谢大家关注-最 ...

  3. 华为交换机导入配置_华为交换机基础配置1—进入命令行

    交换机基础配置1-进入命令行 1.用户从终端成功登录至设备即进入用户视图,在屏幕上显示: 2.系统视图 在用户视图下,输入命令system-view后回车,进入系统视图. system-view En ...

  4. linux 内存告警门限,H3C LA系列无线网关 配置指导(V7)-R0304-6W100_基础配置指导_设备管理配置-新华三集团-H3C...

    通过设备管理功能,用户能够查看设备当前的工作状态,配置设备运行的相关参数,实现对设备的日常维护和管理. ·     none:表示通过本地时钟源获取系统时间.配置该参数后,用户可通过命令行修改系统时间 ...

  5. 【交换机配置】华为S5731基础配置以及SSH配置

    基础配置 sys sysname [规划好的交换机名]#创建vlan,配置vlanif接口地址 vlan batch 600 601 602 int vlanif 602 ip add [地址] [掩 ...

  6. Vim配置#Vim插件安装#NERDTree配置

    一.centos系统的Vim安装 普通用户下输入命令:yum -y install vim* 之后输入y,即可等待安装完成. 二.Vim的配置 如果你需要配置vim,只需在Home目录创建一个~/.v ...

  7. linux还原vim默认配置,vim默认设置的配置

    转载并修改自:http://space.itpub.net/8111049/viewspace-628456 在终端下使用vim进行编辑时,默认情况下,编辑的界面上是没有显示行号.语法高亮度显示.智能 ...

  8. BGP协议基础配置—学习

    BGP重要概念 IGP是运行在AS内部的路由协议,主要有RIP.OSPF及IS-IS,着重于发现和计算路由. EGP是运行在AS之间的路由协议,通常是BGP,它是实现路由控制和选择最好的路由协议. 这 ...

  9. Exchange 2016部署实施案例篇-04.Ex基础配置篇(下)

    上二篇我们对全新部署完成的Exchange Server做了基础的一些配置,今天继续基础配置这个话题. DAG配置 先决条件 首先在配置DGA之前我们需要确保DAG成员服务器上磁盘的盘符都是一样的,大 ...

最新文章

  1. 昨日,全球股市进入ICU!89岁股神巴菲特惊叹活久见!苹果微软万亿美金市值摇摇欲坠...
  2. 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小...
  3. android 设置自动弹框,安卓开发 弹出对话框,然后自动消失
  4. s1200 博图高速脉冲计数值没有变化_赤峰发泡硅胶板,高速公路橡胶垫橡胶厂-京品吉...
  5. mac bash 下使用vi 快捷方式——因为没有alt键 所以没有办法 用vi模式也非常方便的...
  6. linux下python脚本print中文显示不正确_在终端上运行python脚本,没有打印或显示-为什么?...
  7. OpenSSL漏洞补救办法详解(转)
  8. PAT之气死人不偿命的3n+1猜想
  9. centos安装python3.7和yum报错解决方法
  10. git add commit checkout 工作区 暂存区 远程仓库 区别
  11. PS常用快捷键(持续更新)
  12. 禁止恶意域名访问服务器方法
  13. replacestate 后退刷新_关于如何禁止浏览器后退及刷新功能
  14. 自定义实现IOC与DI
  15. youtube后端是python吗_Web后端开发,用Python还是Go呢?
  16. web前端需要学习什么?
  17. 使用frp+MobaXterm进行ssh远程连接报错及解决办法
  18. 三位一体自我陈述计算机专业,三位一体自我陈述报告
  19. 情侣一起看同步看电影H5网站 电影同步观看平台 (自己写的 已开源)
  20. [Android]如何做一个崩溃率少于千分之三噶应用app(15)-View分发module架构

热门文章

  1. 排列组合 - Java代码实现
  2. Android制作并替换系统开机动画bootanimation.zip(需root)
  3. asp.net 中配置 FreeTextBox详解
  4. 我,管理100多人团队的二三事
  5. 如何压缩jpg图片的大小,快速压缩不模糊
  6. AI 可以自己写代码了,对程序员来说是个好消息吗?
  7. 51单片机控制28BYJ48步进电机原理及代码
  8. 前端入职第一天都在做什么
  9. IDEA集成GitHub
  10. 赵海英《C语言精讲》,《数据结构》