从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. JQuery 修改用户信息

    JQuery 修改用户信息,多项选择,赋值,框架: https://www.h-ui.net/v3.shtml $(data.data.roleList).each(function (i, val) ...

  2. 销售订单BAPI增强

    一.需求背景 在销售订单批导时,需要调用BAPI:BAPI_SALESORDER_CREATEFROMDAT2维护成本中心字段, 二.增强实现 BAPI中没有该字段,需要通过增强的方式导入.通过BAP ...

  3. Codeforces Round #653 (Div. 3) 题解

    记第一场CF赛,完成3道题 代码更新(降低时间复杂度和修改写法):21.1.23 A题 Required Remainder 题意:给你 x.y.n 求最大的k (k<=n) 使得k%x==y ...

  4. AtCoder Regular Contest 116 (A~F补题记录)

    补题链接:Here 第一次打 ARC,被数学题虐惨了 赛后部分数学证明学习自 ACwisher A - Odd vs Even \(T(1≤T≤2×10^5)\)组测试数据,每次询问一个正整数 \(N ...

  5. Redis 缓存性能实践及总结

    一.前言 在互联网应用中,缓存成为高并发架构的关键组件.这篇博客主要介绍缓存使用的典型场景.实操案例分析.Redis使用规范及常规 Redis 监控. 二.常见缓存对比 常见的缓存方案,有本地缓存,包 ...

  6. win10系统怎么修改host文件

    1.先根据下面路径找到host文件 C:\Windows\System32\drivers\etc 2.把HOST文件复制一份出来 3.修改完成后,直接替换就可以

  7. v-cloak指令用法

    插值表达式存在的问题:'闪动' 如何解决该问题:使用v-cloak指令 解决该问题的原理:先隐藏,替换好值之后再显示最终的值 背后的原理:先通过样式隐藏内容,然后在内存中进行值得替换,替换好之后再显示 ...

  8. Vue 大屏可视化 铺满全屏

    https://blog.csdn.net/u011097323/article/details/106728221?utm_medium=distribute.pc_aggpage_search_r ...

  9. 使用 Sealos 一键部署 Kubernetes 集群

    Sealos 是一款以 Kubernetes 为内核的云操作系统发行版,使用户能够像使用个人电脑一样简单地使用云. 与此同时,Sealos 还提供一套强大的工具,可以便利地管理整个 Kubernete ...

  10. JS单线程的理解

    一.首先需要区分几个概念: 1. 进程和线程的概念: 进程:指在系统中运行的一个应用程序,目的就是担当分配系统资源(CPU时间.内存等)的基本单位 线程:系统分配处理器时间资源的基本单元,建立在进程的 ...