当前位置: 首页 > news >正文

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 文件中配置

相关文章:

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&#xff0c;下标) in 数组” v-for“(对象item&#xff0c;使用这个键取到的值&#xff0c;下标) in 数组” :key 绑定标识 一般建议使用对象中的id等值 类型 any <template><view><view clas…...

SqlAlchemy使用教程(三) CoreAPI访问与操作数据库详解

SqlAlchemy使用教程(一) 原理与环境搭建SqlAlchemy使用教程(二) 入门示例及编程步骤 三、使用Core API访问与操作数据库 Sqlalchemy 的Core部分集成了DB API, 事务管理&#xff0c;schema描述等功能&#xff0c;ORM构筑于其上。本章介绍创建 Engine对象&#xff0c;使用基本的…...

PDF有编辑密码怎么办

目录 注意&#xff1a; windows方法&#xff1a; 1 python 下载 2 打开命令行 3 安装 pikepdf 4 编写python脚本 5 使用py脚本 6解密完成 Linux方法&#xff1a; 注意&#xff1a; 此方法可以用于破解PDF的编辑密码&#xff0c;而不是PDF的打开密码 当遇到类似如下问…...

智慧公厕:打造智慧城市公共厕所信息化管理的新升级

在现代社会中&#xff0c;随着科学技术的不断进步与应用&#xff0c;智慧公厕作为公共服务设施&#xff0c;正迎来一次新的升级与革新。利用先进技术&#xff0c;智慧公厕实现了信息化升级&#xff0c;能够实时监测人员、环境和设备状况&#xff0c;提高使用效率、安全性、舒适…...

gin-vue-admin二开使用雪花算法生成唯一标识 id

场景介绍 需求场景&#xff1a; 总部采集分支的数据&#xff0c;由于分支的 id 是子增的主键 id&#xff0c;所以会出现重复的 id&#xff0c;但是这个 id 需要作为标识&#xff0c;没有实际作用&#xff0c;这里选择的是分布式 id 雪花算法生成 id 存储用来标识&#xff0c;这…...

文心一言 vs. ChatGPT:哪个更胜一筹?

文心一言 vs. ChatGPT&#xff1a;从简洁美到深度思考的文本生成之旅 近年来&#xff0c;文本生成工具的崛起使得人们在表达和沟通方面拥有了更多的选择。在这个领域中&#xff0c;文心一言和ChatGPT作为两个备受瞩目的工具&#xff0c;各自以独特的优势展现在用户面前。本文将…...

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设计模式&#xff1a;访问者模式 github使用示例参考 测试 JSqlParser使用示例 JSqlParse&#xff08;一&#xff09;基本增删改…...

IC验证——perl脚本ccode_standard——c代码寄存器配置标准化

目录 1 脚本名称 2 脚本路径 3 脚本参数说明 4 脚本操作说明 5 脚本代码 1 脚本名称 ccode_standard 2 脚本路径 /scripts/bin/ccode_standard 3 脚本参数说明 次序 参数名 说明 1 address (./rfdig&#xff1b;.&#xff1b;..&#xff1b;./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项目

在这一部分中&#xff0c;我们将创建一个ASPNET核心项目&#xff0c;作为我们授权服务器的最低设置。我们将使用MVC来提供页面&#xff0c;并将身份验证添加到项目中&#xff0c;包括一个基本的登录表单。 创建一个空的asp.net core项目 正如前一篇文章中所说&#xff0c;授权…...

2.6、云负载均衡产品详述

一、定义 弹性负载均衡(Elastic Load Balance&#xff0c;简称ELB)可将来自公网的访问流量分发到后端云主机&#xff0c;可选多种负载均衡策略&#xff0c;并支持自动检测云主机健康状况&#xff0c;消除单点故障&#xff0c;保障应用系统的高可用。 二、产品架构 1&am…...

黑马程序员 Docker笔记

本篇学习笔记文档对应B站视频&#xff1a; 同学们&#xff0c;在前两天我们学习了Linux操作系统的常见命令以及如何在Linux上部署一个单体项目。大家想一想自己最大的感受是什么&#xff1f; 我相信&#xff0c;除了个别天赋异禀的同学以外&#xff0c;大多数同学都会有相同的…...

游戏素材永不缺,免费在线AI工具Scenario功能齐全,简单易用

Scenario是一个在线的AI驱动的工具&#xff0c;主要用于游戏艺术创作。它提供了一套全面的功能&#xff0c;旨在帮助游戏开发者创建与其独特风格和艺术方向相符的独特、高质量的游戏艺术。Scenario的突出特点之一是它的微调能力&#xff0c;允许用户根据独特的风格和艺术方向训…...

web vue 项目 Docker化部署

Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段&#xff1a; 构建阶段&#xff08;Build Stage&#xff09;&#xff1a…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

树莓派超全系列教程文档--(62)使用rpicam-app通过网络流式传输视频

使用rpicam-app通过网络流式传输视频 使用 rpicam-app 通过网络流式传输视频UDPTCPRTSPlibavGStreamerRTPlibcamerasrc GStreamer 元素 文章来源&#xff1a; http://raspberry.dns8844.cn/documentation 原文网址 使用 rpicam-app 通过网络流式传输视频 本节介绍来自 rpica…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)

文章目录 1.什么是Redis&#xff1f;2.为什么要使用redis作为mysql的缓存&#xff1f;3.什么是缓存雪崩、缓存穿透、缓存击穿&#xff1f;3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

JVM垃圾回收机制全解析

Java虚拟机&#xff08;JVM&#xff09;中的垃圾收集器&#xff08;Garbage Collector&#xff0c;简称GC&#xff09;是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象&#xff0c;从而释放内存空间&#xff0c;避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明

AI 领域的快速发展正在催生一个新时代&#xff0c;智能代理&#xff08;agents&#xff09;不再是孤立的个体&#xff0c;而是能够像一个数字团队一样协作。然而&#xff0c;当前 AI 生态系统的碎片化阻碍了这一愿景的实现&#xff0c;导致了“AI 巴别塔问题”——不同代理之间…...

零知开源——STM32F103RBT6驱动 ICM20948 九轴传感器及 vofa + 上位机可视化教程

STM32F1 本教程使用零知标准板&#xff08;STM32F103RBT6&#xff09;通过I2C驱动ICM20948九轴传感器&#xff0c;实现姿态解算&#xff0c;并通过串口将数据实时发送至VOFA上位机进行3D可视化。代码基于开源库修改优化&#xff0c;适合嵌入式及物联网开发者。在基础驱动上新增…...

协议转换利器,profinet转ethercat网关的两大派系,各有千秋

随着工业以太网的发展&#xff0c;其高效、便捷、协议开放、易于冗余等诸多优点&#xff0c;被越来越多的工业现场所采用。西门子SIMATIC S7-1200/1500系列PLC集成有Profinet接口&#xff0c;具有实时性、开放性&#xff0c;使用TCP/IP和IT标准&#xff0c;符合基于工业以太网的…...

沙箱虚拟化技术虚拟机容器之间的关系详解

问题 沙箱、虚拟化、容器三者分开一一介绍的话我知道他们各自都是什么东西&#xff0c;但是如果把三者放在一起&#xff0c;它们之间到底什么关系&#xff1f;又有什么联系呢&#xff1f;我不是很明白&#xff01;&#xff01;&#xff01; 就比如说&#xff1a; 沙箱&#…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...