上一章,我们初步认识了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})
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基础配置的更多相关文章

  1. 【linux配置】Redhat6.5基础配置指南

    Redhat6.5基础配置指南 本文针对鄙人在工作中常用系统配置加以说明,通常公司用于生产和测试的服务器基本上都不能连接外网,需要针对刚刚安装好的系统做一系列的常用配置. 一.常用基础系统配置 1.关 ...

  2. Emacs学习心得之 基础配置

    作者:枫雪庭 出处:http://www.cnblogs.com/FengXueTing-px/ 欢迎转载 Emacs学习心得之 基础配置 1.前言2.基础配置 一.前言 本篇博文记录了Emacs的一 ...

  3. webpack3.x版本实战案例【基础配置篇】(一)

    本文旨在通过一个一个实战例子来学习webpack如何配置,更加深入的学习webpack在实战项目中如何配置. 我们学习哪些配置呢? [基础配置] 打包JS 编译ES6 编译typeScript 打包公 ...

  4. Java开发学习(三)----Bean基础配置及其作用范围

    一.bean基础配置 对于bean的基础配置如下 <bean id="" class=""/> 其中,bean标签的功能.使用方式以及id和clas ...

  5. SpringMVC常用配置(二),最简洁的配置实现文件上传

    Spring.SpringMVC持续介绍中,基础配置前面已经介绍了很多,如果小伙伴们还不熟悉可以参考这几篇文章: 1.Spring基础配置 2.Spring常用配置 3.Spring常用配置(二) 4 ...

  6. Vim基础配置

    vim 个性化设置 安装插件管理器Vundle: 创建目录: mkdir -p ~/.vim/bundle 下载文件: git clone https://github.com/VundleVim/V ...

  7. HAproxy 基础配置

    基础配置详解 HAProxy 的配置文件haproxy.cfg由两大部分组成,分别是global和proxies部分 global:全局配置段 进程及安全配置相关的参数性能调整相关参数Debug参数 ...

  8. 从零开始学 Java - Spring 集成 ActiveMQ 配置(二)

    从上一篇开始说起 上一篇从零开始学 Java - Spring 集成 ActiveMQ 配置(一)文章中讲了我关于消息队列的思考过程,现在这一篇会讲到 ActivMQ 与 Spring 框架的整合配置 ...

  9. WEKA使用(基础配置+垃圾邮件过滤+聚类分析+关联挖掘)

    声明: 1)本文由我bitpeach原创撰写,转载时请注明出处,侵权必究. 2)本小实验工作环境为Windows系统下的WEKA,实验内容主要有三部分,第一是分类挖掘(垃圾邮件过滤),第二是聚类分析, ...

  10. nginx 的基础配置[转]

    nginx 的基础配置 分类: 工具软件2013-11-13 23:26 11人阅读 评论(0) 收藏 举报   目录(?)[-] 管理配置文件 全局配置 虚拟机server配置 location配置 ...

随机推荐

  1. MyBatis batchInsert 批量插入数据

    mybatis 是一个 Java 的持久层框架,它支持定制化 SQL.存储过程以及高级映射.通过 MyBatis,开发者可以直接编写原生态 SQL,避免了 JDBC 代码的繁琐. 如何在 MyBati ...

  2. Kubernetes(K8S) Service 介绍

    定义一组 Pod 的访问规则 存在的意义 防止 Pod 失联(服务发现),Pod 重启后,IP会变 定义一组 Pod 访问策略,负载均衡 Pod 和 Service 关系 根据 label 和 sel ...

  3. MySQL 错误记录:Data too long for column 'xxx' at row 1

    Content 字段是 text 类型(Text是6万多)改成了 longtext 就OK了 ALTER TABLE `Article` CHANGE `Content` `Content` LONG ...

  4. 100天搞定机器学习|Day60 遇事不决,XGBoost

    XGBoost 是一种集大成的机器学习算法,可用于回归,分类和排序等各种问题,在机器学习大赛及工业领域被广泛应用.成功案例包括:网页文本分类.顾客行为预测.情感挖掘.广告点击率预测.恶意软件分类.物品 ...

  5. 打破监控壁垒,棉花厂3D可视化建设让生产加工更加智能化

    前言 现在的棉花加工行业还停留在传统的反应式维护模式当中,当棉花加下厂的设备突然出现故障时,控制程序需要更换.这种情况下,首先需要客户向设备生产厂家请求派出技术人员进行维护,然后生产厂家才能根据情况再 ...

  6. 无需修改代码,用 fcapp.run 运行你的 REST 应用

    作者 | 阿里云 Serverless 技术研发 落语 背景 阿里云函数计算产品在较早的时候支持了HTTP触发器能力,支持用户使用 HTTP 协议进行函数调用.函数计算后端通过一个共享的 APISer ...

  7. iview 将Modal抽取成组件并控制Modal的显示隐藏

    开发中遇到Modal弹出框的内容太多,就想把Modal单独分装成一个组件,但是发现封装成组件后Modal的关闭和打开有问题.如下方法可以解决这个问题. 父级页面: <PriceInfodModa ...

  8. kafka集群五、__consumer_offsets副本数修改

    系列导航 一.kafka搭建-单机版 二.kafka搭建-集群搭建 三.kafka集群增加密码验证 四.kafka集群权限增加ACL 五.kafka集群__consumer_offsets副本数修改 ...

  9. 如何在编码阶段减少代码中的bug?

    前言 作为一名合格的程序员,不写bug是不可能的.如何花费最少的时间来修复bug呢? 在编码阶段借助一些静态分析工具往往可以事半功倍,减少代码中的bug. 静态分析工具能够在代码未运行的情况下分析源代 ...

  10. 05_删除链表的倒数第N个节点

    删除链表的倒数第N个节点 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点. 示例 1: 输入:head = [1,2,3,4,5], n = 2 输出:[1,2,3,5] 示例 2: ...