从9月份到国庆这段时间,因为得了女儿,于是回老家帮忙料理家事以及陪伴老婆和女儿。一时之间无暇顾及该系列教程的更新。等我回来的时候发现很多小伙伴私信我催更。在这里向支持本人这一拙劣教程的各位小伙伴表示真诚的感谢。言归正传,让我们开始吧

之前我们根据lua语言配置了基于lsp的代码高亮、自动跳转、自动补全等等功能,那个时候我们安装了很多插件,像 nvim-lspconfig、nvim-lsp-installernvim-cmp等等,每个插件都在干嘛,虽然我们配置好了 lua相关的内容,但是可能仍然有小伙伴有疑问,碰到其他语言该如何配置,是不是要重新下载对应的插件呢?为了解答这些问题,这篇文章我们将要来根据 c++和 python的日常习惯来进行配置,给大家演示一下在上述内容都配置完成之后面对其他语言我们该如何进行处理

安装配置 c++ 相关的lsp服务

关于c++ 的服务,我们根据 nvim-lsp-installer 官方给出的表格中显示它可以使用 cclsclang,这里我们以 ccls 作为示例进行讲解。

首先通过命令安装 :LspInstall ccls

接着我们新建一个 ftplugin/c.luaftplugin/cpp.lua 来配置 c/c++ 。不过他们两个采用相同的配置,我们暂时将一份配置复制两遍

require("lsp/cpp")

他们的作用只有一个,那就是加载 lsp/cpp 这个文件,我们将他们的配置放到一个文件中

然后我们再在 lua/lsp/cpp.lua 文件中加入以下内容用于启动 lsp服务端

local lspconfig = require('lspconfig')
lspconfig.ccls.setup {
init_options = {
cache = {
directory = ".ccls-cache";
};
}
}

我们进入一个 .c/.cpp 文件发现已经加载了 ccls 了。如果没有加载可以使用 :LspStart 命令手工加载或者使用 LspInfo 查看是否有问题



现在我们已经可以看到lsp服务给出的提示了

修改之前的配置

我们在第22篇文章中给出了基于 lsplua 的配置,主要是使用 lsp 服务端的配置和对应的跳转之类的快捷键配置,我们将它放到了 lsp/lua.lua 目录下了。但是一想想我们使用 c++Python 或者其他什么语言的时候,这些快捷键应该是不会修改的,这个时候自然就想到了要重用快捷键了。所以来配置之前的第一件事就是想办法重用这些快捷键。

这个时候我们想到的办法就是将之前定义的快捷键封装成函数,然后在 on_attach 的回调函数中调用该函数。我们将那些快捷键定义放到 lua/keybindings.lua

local lsp_keybinds = {}
lsp_keybinds.set_keymap = function (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
return lsp_keybinds

我们将它打包到lsp_keybinds 模块中作为 keybinds.lua 文件的导出模块。然后在 lsp/lua.lua文件的 on_attach 函数中调用这个函数完成快捷键的配置工作

local lsp_set_keymap = require("keybindings")
local on_attach = function(_, bufnr)
lsp_set_keymap.set_keymap(bufnr)
end

现在我们就完成了 c/c++ 相关的配置



尝试一下绑定的那些快捷键,发现它可以正常进行跳转

是不是很简单了,我们没有安装任何的插件,只是安装了 c++ lsp 的服务端。剩下的配置依然延续之前的就好了

python 相关配置

我们再来以 python 的配置作为例子来讲lsp的配置。python 的服务端我们采用 pyright 。还有一个方法可以安装 lsp 服务。我们可以在命令模式中输入 :LspInstallInfo 查看当前已安装的 lsp 服务。下面会列出一堆的未安装的 lsp 服务。这个时候我们可以将光标移动到某个服务上,按下 i 来安装该服务。



这里我提前已经安装好了,所以它显示在 Installed Server 中,没有安装它应该显示在下方的Available Server 列表中。

安装完成之后我们还是按照惯例,在 ftplugin 目录下建立一个 python.lua 文件并且在该文件中加载 lua/lsp/python.lua 文件

我们在 lua/lsp/python.lua 文件中加入下面的代码

local lsp_set_keymap = require("keybindings")
local util = require 'lspconfig/util' require('lspconfig').pyright.setup{
on_attach = function(_, bufnr)
lsp_set_keymap.set_keymap(bufnr)
end,
cmd = { "pyright-langserver", "--stdio" },
filetypes = { "python" },
settings = {
python = {
analysis = {
autoSearchPaths = true,
diagnosticMode = "workspace",
useLibraryCodeForTypes = true,
typeCheckingMode = "off"
},
},
},
root_dir = function(fname)
local root_files = {
'pyproject.toml',
'setup.py',
'setup.cfg',
'requirements.txt',
'Pipfile',
'pyrightconfig.json',
}
return util.root_pattern(unpack(root_files))(fname) or util.find_git_ancestor(fname) or util.path.dirname(fname)
end,
}

前面的配置与 c++ 的配置类似。主要设置快捷键,这里需要注意的是 root_dir 这里的配置,想要在对应缓冲中启动相应的 lsp 服务,需要buffer处在对应语言的项目中,root_dir 规定在 buffer 所在目录中存在这些文件或者目录时将该目录作为对应项目文件

如果我们不加该配置,可能会导致lsp 服务启动失败。如果失败的话我们使用 :LspInfo 来查看失败原因



这个根目录设置是可以作用于它下面所有子目录的。这里我根据 python 中常用文件给出了一个列表,各位小伙伴可以根据自己的需求自行添加

另外需要注意的一个问题时,pyright 依赖于 nodework_threads 模块,该模块从12版本以后才被支持,如果小伙伴的 node 版本低于该版本需要考虑升级 node



根据这两个例子,相信各位已经熟悉了该如何配置不同语言的 lsp 服务了。这里面没有什么深奥的代码,也没有什么个性化到只有自己才会用的配置,希望能起到抛砖引玉的作用,后面再碰到什么其他语言小伙伴们应该可以很容易的添加它的lsp服务了。

从零开始配置vim(25)——关于 c++ python 的配置的更多相关文章

  1. selenium+python安装配置

    一.安装步骤 1.python安装 2.selenium安装     2.1. 方法一:在Windows命令行(cmd)输入pip install selenium即可自动安装selenium,安装完 ...

  2. Windows环境下配置Vim为Python的IDE

    (一)安装Python 2.7 在官网下载Python,并安装,我的安装路径是D:\Program Files\Python.安装完成后编辑环境变量Path,在其后添加;D:\Program File ...

  3. 代码编辑器[0] -> Vim/gVim[0] -> 基于 Python 的 gVim 环境配置(Windows)

     环境配置 / Environment Setup 基于Python开发的 gVim 环境配置(Windows) 使用方式参考 Vim 的使用. 1 基于vundle进行配置 Vim有多个扩展管理器, ...

  4. 为Python配置Vim编辑器(GUI/非GUI皆可)

    原文地址:https://blog.csdn.net/alanzjl/article/details/49383943 Vim as a python IDE ** 最近一直在写Python,但一直没 ...

  5. python之配置logging的几种方式

    作为开发者,我们可以通过以下3中方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文 ...

  6. python之配置日志的三种方式

    以下3种方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文件,然后使用fileCo ...

  7. Python之配置日志的几种方式(logging模块)

    原文:https://blog.csdn.net/WZ18810463869/article/details/81147167 作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Py ...

  8. 【转】python之配置日志的几种方式

    [转]python之配置日志的几种方式 作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用 ...

  9. python之配置日志的几种方式

    作为开发者,我们可以通过以下3种方式来配置logging: 1)使用Python代码显式的创建loggers, handlers和formatters并分别调用它们的配置函数: 2)创建一个日志配置文 ...

  10. 使用vim打造自己的python编辑器

    基础配置 vim的配置是在用户主目录下的 ~/.vimrc 文件中完成的,如果没有的话,需要自己新建一下: cd ~ touch .vimrc 首先做些简单的配置: set nocompatible ...

随机推荐

  1. PPT 合并形状

    形状格式 -> 插入形状 -> 合并形状 选中的元素,就是要保留的元素. 可以到 https://www.iconfont.cn/ 下载SVG格式插入 PPT中进行使用 合并开状的应用 文 ...

  2. NLog.config 配置

    NLog.confg 参考配置, NLog 热生效不需要重启服务 <?xml version="1.0" encoding="utf-8" ?> & ...

  3. 2D 可视赋能智慧水务绿色集约化发展

    前言 随着国家对环境保护治理程度的日益重视,各地政府积极响应国家政策,在共同聚焦生态文明建设下,急速催生了水务行业数字化转型.如今 "供排污"一体化管理系统成为行业发展的重要趋势, ...

  4. springboot 参数通过 @RequestBody传递的写法

    controller中有时候参数是使用 @RequestBody传递的这种怎么写? 直接上代码 @RequestMapping("/test") public void getAc ...

  5. Xmanager连接linux服务器的桌面

    在办公室使用xshell通过22端口访问linux服务器大家都很熟悉,但有的时候在办公室要远程linux服务器上的桌面应用,该如何实现. 环境准备 客户端:win10 服务器:centos7.9 一. ...

  6. zzuli 1023

    java 读入单个字符 import java.util.Scanner; public class Main{ public static void main(String args[]){ Sca ...

  7. go 接口学习笔记

    这里是对接口在汇编层面上转换和实现的小结,详细了解可参考 Go 语言接口的原理 1. 类型转换:结构体到接口 1.1 结构体方法实现接口 package main type Duck interfac ...

  8. SNMP 使用总结

    转载请注明出处: 1.SNMP简介 SNMP(Simple Network Management Protocol,简单网络管理协议)是一种用于网络设备和系统的管理协议.它允许网络管理员监控和管理网络 ...

  9. iview 表单有值却校验失败

    转载请注明出处: iview 表单校验数值的时候,表单有值,却在提交的时候,提示表单校验失败: 解决方案: 1. IviewUI的文档里查到了rules规则里面有个校验类型的属性字段type rule ...

  10. SV OOP-2

    静态变量 继承性(Inheritance) 抽象类和虚方法virtual methods 多态(Ploymorphism) 通过基类的变量可以使用子类的对象 基类中定义的virtual functio ...