Vim一键配置指南,打造高效率C++开发环境
文章目录
- 前言
- 安装与卸载
- 功能演示
- gcc/g++升级问题
前言
Vim作为当下最受欢迎的文本编译器之一,不仅具有强大的文本编辑功能,还提供了高度的可定制性。用户可以根据自己的喜好自定义配置,并且通过自己编写插件或者使用现有的插件来扩展Vim的功能。
虽说工欲善其事必先利其器,然而对于初学者来说,花太多的时间在Vim配置上,显然会劝退一大批人,特别是YCM的插件的配置,可以说网络上 90% 的博客都有或多或少的错误。而今天给大家推荐的开源工具 VimForCpp,具有以下的优点:
- 使用国内的码云作为代码托管平台,安装速度快。在网络畅通的情况下,只需要 1~2 min就可以完成全部的安装配置
- 省去了YouCompleteMe漫长的编译过程,使用已经预编译好的 ycm_core.so
- 真正做到了一键式安装,所有依赖的程序也会自动下载
配置完成后的效果如下图所示,整体看起来还是蛮清爽的

阅读完本篇博客,你将收获以下的内容:
- 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
但是实际运行后会遇到如下的问题:

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

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

鉴于此时vim用不了,可以使用别的编辑器进行编辑,例如 nano。修改后重启终端后 vim 就可以正常使用了
功能演示
VimForCpp功能演示可以参考Gitee,这里就一些较为常用的功能进行说明。
VimForCpp集成了很多好用的插件,并对其进行了快捷键映射。你需要做的就是在normal模式下按下空格,这样就进入了一级功能菜单页面:

按下 a~t 就进入了二级菜单。这里面的功能大家可以自行探索。
-
我最常用的功能就是 f+a 查看函数列表。按下
crtl + w就可以移动光标的焦点进入到左边的函数列表了,按下换行后进行进行快速跳转
-
aa可以实现函数/变量跳转,也可以实现头文件的跳转

这一部分的功能由 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++,那么会异常检测出各种各样的错误:

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


我们明明已经安装了高版本的 gcc 和 g++,并且也能正确编译没有任何问题,但是为什么 VimForCpp 语法检测会莫名奇妙的出问题?这和 VimForCpp 使用语法检查插件 YouCompleteMe 的配置有关(虽然 cQuery也有语法检测的功能,但是在 VimForCpp 中其语法检测功能被关闭了)
ycm的配置文件是 ~/.ycm_extra_conf.py,使用vim打开可以看到这样的内容:

对于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

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

['-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++语法也不再会莫名其妙的报错误了:

最后我还想说,ycm是一个非常强大的自动补齐插件,他也为用户提供了很大的个性化配置,对这个有兴趣的可以看看 ycm Github上的介绍。相关设置可以在 ~/.vimrc 文件中配置
相关文章:
Vim一键配置指南,打造高效率C++开发环境
文章目录 前言安装与卸载功能演示gcc/g升级问题 前言 Vim作为当下最受欢迎的文本编译器之一,不仅具有强大的文本编辑功能,还提供了高度的可定制性。用户可以根据自己的喜好自定义配置,并且通过自己编写插件或者使用现有的插件来扩展Vim的功能…...
新航向,新生态: Michael在出海业务圆桌会议分享HyperBDR全球业务拓展之道
1月15日-16日,以“领航新开局,共赢新生态”为主题的华为云生态大会2024在华为云贵安数据中心云上屯盛大举行。本次会议聚焦于华为云全国生态伙伴与开发者,旨在共同见证华为云生态战略的最新进展和伙伴政策的新升级。与会者将分享来自优秀生态…...
SpringBoot异步处理
Spring boot异步处理 业务场景: 如执行数据库备份任务,前端发起请求到后端,后端备份数据库的处理逻辑需要很长一段时间,此时前端会一直等待后端返回结果,给用户给等待时间过长,这是就要考虑异步处理了&…...
2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块二
竞赛需要完成三个阶段的任务,分别完成三个模块,总分共计 1000分。三个模块内容和分值分别是: 1.第一阶段:模块一 网络平台搭建与设备安全防护(180 分钟,300 分)。 2.第二阶段:模块二…...
matplotlib绘制动态瀑布图
绘制瀑布图思路:遍历指定文件目录下所有的csv文件,每读一个文件,取文件前20行数据进行保存,如果超过规定的行数300行,将最旧的数据删除,仅保留300行数据进行展示。 网上找的大部分绘制瀑布图的代码&#x…...
【STM32】STM32学习笔记-USART串口收发HEX和文本数据包(29)
00. 目录 文章目录 00. 目录01. 串口简介02. 串口收发HEX数据包接线图03. 串口收发HEX数据包示例104. 串口收发HEX数据包示例205. 串口收发文本数据包接线图06. 串口收发文本数据包示例07. 程序示例下载08. 附录 01. 串口简介 串口通讯(Serial Communication)是一种设备间非常…...
uniapp列表实现方式 v-for
创建列表视图 v-for v-for“对象item in 数组” v-for“(对象item,下标) in 数组” v-for“(对象item,使用这个键取到的值,下标) in 数组” :key 绑定标识 一般建议使用对象中的id等值 类型 any <template><view><view clas…...
SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解
SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤 三、使用Core API访问与操作数据库 Sqlalchemy 的Core部分集成了DB API, 事务管理,schema描述等功能,ORM构筑于其上。本章介绍创建 Engine对象,使用基本的…...
PDF有编辑密码怎么办
目录 注意: windows方法: 1 python 下载 2 打开命令行 3 安装 pikepdf 4 编写python脚本 5 使用py脚本 6解密完成 Linux方法: 注意: 此方法可以用于破解PDF的编辑密码,而不是PDF的打开密码 当遇到类似如下问…...
智慧公厕:打造智慧城市公共厕所信息化管理的新升级
在现代社会中,随着科学技术的不断进步与应用,智慧公厕作为公共服务设施,正迎来一次新的升级与革新。利用先进技术,智慧公厕实现了信息化升级,能够实时监测人员、环境和设备状况,提高使用效率、安全性、舒适…...
gin-vue-admin二开使用雪花算法生成唯一标识 id
场景介绍 需求场景: 总部采集分支的数据,由于分支的 id 是子增的主键 id,所以会出现重复的 id,但是这个 id 需要作为标识,没有实际作用,这里选择的是分布式 id 雪花算法生成 id 存储用来标识,这…...
文心一言 vs. ChatGPT:哪个更胜一筹?
文心一言 vs. ChatGPT:从简洁美到深度思考的文本生成之旅 近年来,文本生成工具的崛起使得人们在表达和沟通方面拥有了更多的选择。在这个领域中,文心一言和ChatGPT作为两个备受瞩目的工具,各自以独特的优势展现在用户面前。本文将…...
LoadBalancer 替换 Ribbon
POM 移除 Ribbon 相关依赖 <!-- LoadBalancer 必须引入 springcloud --> <!-- 父pom引入springcloud 版本管理 --> https://spring.io/projects/spring-cloud/ 官网查看 boot 对应的 cloud 的版本 <dependencyManagement><dependency> <groupI…...
Jsqlparser简单学习
文章目录 学习链接模块访问者模式parser模块statement模块Expression模块deparser模块 测试TestDropTestSelectTestSelectVisitor 学习链接 java设计模式:访问者模式 github使用示例参考 测试 JSqlParser使用示例 JSqlParse(一)基本增删改…...
IC验证——perl脚本ccode_standard——c代码寄存器配置标准化
目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig;.;..;./boot) 指定脚本执行路…...
Qt单个字符判断
1.相关说明 字符的Unicode编码、单个字符的判断 2.界面绘制 3.相关主要代码 #include "widget.h" #include "ui_widget.h"Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget) {ui->setupUi(this); }Widget::~Widget() {delete ui;…...
通过OpenIddict设计一个授权服务器02-创建asp.net项目
在这一部分中,我们将创建一个ASPNET核心项目,作为我们授权服务器的最低设置。我们将使用MVC来提供页面,并将身份验证添加到项目中,包括一个基本的登录表单。 创建一个空的asp.net core项目 正如前一篇文章中所说,授权…...
2.6、云负载均衡产品详述
一、定义 弹性负载均衡(Elastic Load Balance,简称ELB)可将来自公网的访问流量分发到后端云主机,可选多种负载均衡策略,并支持自动检测云主机健康状况,消除单点故障,保障应用系统的高可用。 二、产品架构 1&am…...
黑马程序员 Docker笔记
本篇学习笔记文档对应B站视频: 同学们,在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么? 我相信,除了个别天赋异禀的同学以外,大多数同学都会有相同的…...
游戏素材永不缺,免费在线AI工具Scenario功能齐全,简单易用
Scenario是一个在线的AI驱动的工具,主要用于游戏艺术创作。它提供了一套全面的功能,旨在帮助游戏开发者创建与其独特风格和艺术方向相符的独特、高质量的游戏艺术。Scenario的突出特点之一是它的微调能力,允许用户根据独特的风格和艺术方向训…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
Cursor实现用excel数据填充word模版的方法
cursor主页:https://www.cursor.com/ 任务目标:把excel格式的数据里的单元格,按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例,…...
树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频
使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...
Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程
STM32F1 本教程使用零知标准板(STM32F103RBT6)通过I2C驱动ICM20948九轴传感器,实现姿态解算,并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化,适合嵌入式及物联网开发者。在基础驱动上新增…...
协议转换利器,profinet转ethercat网关的两大派系,各有千秋
随着工业以太网的发展,其高效、便捷、协议开放、易于冗余等诸多优点,被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口,具有实时性、开放性,使用TCP/IP和IT标准,符合基于工业以太网的…...
沙箱虚拟化技术虚拟机容器之间的关系详解
问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西,但是如果把三者放在一起,它们之间到底什么关系?又有什么联系呢?我不是很明白!!! 就比如说: 沙箱&#…...
【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统
Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...
