Vim一键配置指南,打造高效率C++开发环境

文章目录

    • 前言
    • 安装与卸载
    • 功能演示
    • gcc/g++升级问题

前言

Vim作为当下最受欢迎的文本编译器之一,不仅具有强大的文本编辑功能,还提供了高度的可定制性。用户可以根据自己的喜好自定义配置,并且通过自己编写插件或者使用现有的插件来扩展Vim的功能。

虽说工欲善其事必先利其器,然而对于初学者来说,花太多的时间在Vim配置上,显然会劝退一大批人,特别是YCM的插件的配置,可以说网络上 90% 的博客都有或多或少的错误。而今天给大家推荐的开源工具 VimForCpp,具有以下的优点:

  • 使用国内的码云作为代码托管平台,安装速度快。在网络畅通的情况下,只需要 1~2 min就可以完成全部的安装配置
  • 省去了YouCompleteMe漫长的编译过程,使用已经预编译好的 ycm_core.so
  • 真正做到了一键式安装,所有依赖的程序也会自动下载

配置完成后的效果如下图所示,整体看起来还是蛮清爽的

image-20240109131429951

阅读完本篇博客,你将收获以下的内容:

  • VimForCpp的安装
  • gcc/g++升级后的语法识别问题(默认情况下,VimForCpp只会识别 4.8.5 版本的C++头文件)
  • VimForCpp的使用技巧

VimForCpp 项目在 2019 就停止维护了,写这篇博客的目的就是记录 VimForCpp 使用过程中遇到的问题和对应的解决方案,如果你遇到了同样的问题说不定会给你提供帮助

安装与卸载

环境:

注意!目前 VimForCpp只支持 Centos7 x86_64。如果你的操作系统属于Linux的其他发行版本,就不用继续往下看了

安装:

VimForCpp 的安装非常简单,所有你需要做的便是在shell中执行以下命令:

curl -sLf https://gitee.com/HGtz2222/VimForCpp/raw/master/install.sh -o ./install.sh && bash ./install.sh

唯一需要注意的是,想让vim配置在那个用户下生效就在哪个用户下执行这个指令。 强烈 “不推荐” 直接在 root 下执行

卸载:

官方提到的卸载方式是在安装了 VimForCpp 的用户下执行:

bash ~/.VimForCpp/uninstall.sh

但是实际运行后会遇到如下的问题:

image-20240109143704189

这是因为 VimForCpp 中使用的 vim 并不是 usr/bin/vim 路径下的vim,而是使用本地目录下安装的nvim(vim的一个分支,具有更好的性能和可扩展性),使用 which 指令就可以证明。

image-20240109143548420

因此就算你重新安装vim也不会解决问题,正确的做法是修改配置文件 .bashrc 的内容,取消对 vim 命令的重命名:

image-20240109144428420

鉴于此时vim用不了,可以使用别的编辑器进行编辑,例如 nano。修改后重启终端后 vim 就可以正常使用了

功能演示

VimForCpp功能演示可以参考Gitee,这里就一些较为常用的功能进行说明。

VimForCpp集成了很多好用的插件,并对其进行了快捷键映射。你需要做的就是在normal模式下按下空格,这样就进入了一级功能菜单页面:

image-20240112170157463

按下 a~t 就进入了二级菜单。这里面的功能大家可以自行探索。

  • 我最常用的功能就是 f+a 查看函数列表。按下 crtl + w 就可以移动光标的焦点进入到左边的函数列表了,按下换行后进行进行快速跳转

    image-20240112170546633

  • aa可以实现函数/变量跳转,也可以实现头文件的跳转

    image-20240112171005105
    这一部分的功能由 cquery 提供,.cquery 文件是其配置文件,我这里特意将头文件路径修改为 11,使用高版本的头文件,原来默认的还是指向 4.8.2 的

    %clang
    %c -std=gnu11
    %cpp -std=gnu++14
    -pthread# Includes
    -I/usr/include
    -I/usr/include/c++/11
    -I.
    

    这个功能有个很难受的地方,就是你必须要在你的项目根路径下创建一个 .cquery 功能,里面就是上面的内容。在 cquery 的 github 的 Issue 中我也看到有人提出这个问题,并确实在 cquery 的下一个版本中实现,但是我实测发现最新版的 cquery 好像并不是开箱即用的,和 LanguageClient-neovim 似乎并不直接兼容。有知道的大神可以指点我一下

gcc/g++升级问题

如果gcc 4.8.5就可以满足你所有的需求,那么你就不需要阅读这部分的内容了。不知道怎么给Centos7升级gcc的,可以参考我这篇博文:Centos7下升级gcc/g++版本(简单 + 避坑)

在升级完gcc/g++后,我们随便用vim编写一段代码:

  • 如果你之前没有使用 yum install gcc-g++,那么会异常检测出各种各样的错误:

    image-20240109231035155

  • 如果你之前安装过了,那么上面的代码虽然不会出错,但是如果用到了高版本的C++语法和头文件还是会报错:

    image-20240109231339452

    image-20240109231942200

我们明明已经安装了高版本的 gcc 和 g++,并且也能正确编译没有任何问题,但是为什么 VimForCpp 语法检测会莫名奇妙的出问题?这和 VimForCpp 使用语法检查插件 YouCompleteMe 的配置有关(虽然 cQuery也有语法检测的功能,但是在 VimForCpp 中其语法检测功能被关闭了)

ycm的配置文件是 ~/.ycm_extra_conf.py,使用vim打开可以看到这样的内容:

image-20240110141549122

对于C/C++来说,YouCompleteMe 使用 clangd 作为语法检查器。clangd 是基于 clang 编译器的语言服务器,和任何编译器相同,clangd 在解析代码时同样需要一组编译标志(compile flags)来指导其工作,否则就无法正确地解析代码。

而 flags 列表中的参数就是即将提供给 clangd 的编译标志,我们重点关注以下参数:

  • -std:这个参数指定语法检查所使用的C++标准,例如 -std=c++20
  • -isystem:这个参数指定了系统头文件目录,我们可以看到默认 VimForCpp 设置的C++头文件检索目录是在 4.8.5 这个文件夹下的,这也就解释了为什么 VimForCpp 语法检测只会对 g++ 4.8.5 感冒
  • -I: 用于指定用户头文件目录,看的出来开发人员还“夹带私货”了 😄

好的,我们现在已经定位问题了,只需要将头文件搜索路径修改为高版本的库的路径即可,那么如何确保我们头文件添加没有遗漏呢?这里教大家一个小技巧:前面提到,我们编译是没有问题的,因此可以使用 g++ -v 命令来显示 g++ 编译器详细的编译过程,其中就包含了标准库的搜索路径、头文件搜索路径

g++ -v test.cc

image-20240110150325224

在这个部分就可以看到所有的头文件搜索路径,最后我修改的结果如下。供大家参考:

image-20240110154152635

['-std=c++17','-x','c++','-isystem','/opt/rh/devtoolset-11/root/usr/include/c++/11','-isystem','/opt/rh/devtoolset-11/root/usr/include/c++/11/x86_64-redhat-linux','-isystem','/opt/rh/devtoolset-11/root/usr/include/c++/11/backward','-isystem','/opt/rh/devtoolset-11/root/usr/lib/gcc/x86_64-redhat-linux/11/include','-isystem','/usr/include','-isystem','/usr/local/include','-I','.',
]

重启打开vim后就会生效,现在对于高版本的C++语法也不再会莫名其妙的报错误了:

image-20240110154252017

最后我还想说,ycm是一个非常强大的自动补齐插件,他也为用户提供了很大的个性化配置,对这个有兴趣的可以看看 ycm Github上的介绍。相关设置可以在 ~/.vimrc 文件中配置

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/409616.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Queue at the School-codeforces

题目链接:Problem - 266B - Codeforces 题目: 解题思路: 大概意思就是一个队伍里有男生女生,男生会不好意思排在女生前而跟后面的女生换位置,一个时间段里换过的男女生就不能再换了,下个时间段再继续判断…

vite和webpack的区别

1 构建原理 Webpack 是一个静态模块打包器,通过对项目中的 JavaScript、CSS、图片等文件进行分析,生成对应的静态资源,并且可以通过一些插件和加载器来实现各种功能。Webpack 的主要特点是支持各种复杂的构建场景,例如代码分割、…

自动化测试框架pytest系列之8个常用的装饰器函数

自动化测试框架pytest系列之基础概念介绍(一)-CSDN博客 自动化测试框架pytest系列之21个命令行参数介绍(二)-CSDN博客 自动化测试框架pytest系列之强大的fixture功能,为什么fixture强大?一文拆解它的功能参数。(三)-CSDN博客 接上文 3.5 pytest的8…

Elasticsearch:聊天机器人教程(二)

这是继上一篇文章 “Elasticsearch:聊天机器人教程(一)”的续篇。本教程的这一部分讨论聊天机器人实现中最有趣的方面,以帮助你理解它并对其进行自定义。 数据摄入 在此应用程序中,所有示例文档的摄取都是通过 flask …

C#判断输入的数字是否符合货币格式

目录 一、用正则表达式判断输入是否符合货币格式 二、用double.TryParse()判断输入是否符合货币格式 一、用正则表达式判断输入是否符合货币格式 // 判断输入是否货币合格 using System.Text.RegularExpressions; namespace IsCurrency_Format {partial class Program{stati…

Python进程池multiprocessing.Pool

环境: 鲲鹏920:192核心 内存:756G python:3.9 python单进程的耗时 在做单纯的cpu计算的场景,使用单进程核多进程的耗时做如下测试: 单进程情况下cpu的占用了如下,占用一半的核心数: 每一步…

【数据结构】归并排序的两种实现方式与计数排序

前言:在前面我们讲了各种常见的排序,今天我们就来对排序部分收个尾,再来对归并排序通过递归和非递归的方法进行实现,与对计数排序进行简单的学习。 💖 博主CSDN主页:卫卫卫的个人主页 💞 👉 专栏…

c#异形窗体遮罩效果

c#异形窗体遮罩效果,移动,关闭,最大化,最小化,还原操作 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Drawing.Drawing2D…

在程序中链接静态库 和 动态库

9. 链接库 在编写程序的过程中,可能会用到一些系统提供的动态库或者自己制作出的动态库 或者静态库文件,cmake中也为我们提供了相关的加载动态库的命令hehedalinux:~/Linux/loveDBTeacher-v3$ tree . ├── CMakeLists.txt ├── include │ └── …

如何从 Keras 中的深度学习目录加载大型数据集

一、说明 数据集读取,使用、在磁盘上存储和构建图像数据集有一些约定,以便在训练和评估深度学习模型时能够快速高效地加载。本文介绍Keras 深度学习库中的ImageDataGenerator类等工具自动加载训练、测试和验证数据集。 二、ImageDataGenerator加载数据集…

中科院自动化所:基于关系图深度强化学习的机器人多目标包围问题新算法

摘要:中科院自动化所蒲志强教授团队,提出一种基于关系图的深度强化学习方法,应用于多目标避碰包围(MECA)问题,使用NOKOV度量动作捕捉系统获取多机器人位置信息,验证了方法的有效性和适应性。研究成果在2022年ICRA大会发…

【征服redis5】redis的Redisson客户端

目录 1 Redisson介绍 2. 与其他Java Redis客户端的比较 3.基本的配置与连接池 3.1 依赖和SDK 3.2 配置内容解析 4 实战案例:优雅的让Hash的某个Field过期 5 Redisson的强大功能 1 Redisson介绍 Redisson 最初由 GitHub 用户 “mrniko” 创建,并在…