使用Vim进行C++开发

2020-09-04 00:17:51

我想分享一下我是如何使用Vim作为C++开发环境的,添加了代码完成、linting、格式化、代码段等功能。如果你来自IDE领域,并且已经在GUI上用复选框设置了选项,那么你可能需要转向使用基于文本的配置工具,比如Vim。

已经有插件可以为Vim提供类似IDE的功能。它们中的一些是成功的,一些是进化的,而另一些则是不受欢迎的。我试过像YouCompleteMe这样的插件,它们很棒,但让它们工作的过程并不是一种愉快的体验。

创建一个完成引擎诚然很难,在不触及实现细节的情况下移植那些代码给其他编辑器几乎是不可能的。

语言服务器协议就是为解决这一问题而开发的。其想法是,创建一组规则并实现遵循规则的服务器和客户端,然后通过协议进行通信,并提供自动完成、转到定义、搜索函数调用、诊断等功能。

LSP创造了降低m-x-n复杂性问题的机会,即在任何编辑器、IDE或客户端端点中提供对任何编程语言的高级别支持,从而解决更简单的m-+-n问题。

服务器需要安装在主机系统上,客户端需要由编辑器提供,可以是插件,也可以是内置的。在Vim中,它必须是一个插件,NeoVim有一个实验支持。有些IDE,比如克利安,都是从包裹里运出来的.。是有代价的。

有两个正在积极开发的C++语言服务器:clangd和ccl.这两个都很棒。我发现clangd更容易安装。这里提供了预编译的二进制文件。APT软件包也可在https://apt.llvm.org.上获得。在我新安装的Debian10上,我只使用:

Apt-add-repository';deb http://apt.llvm.org/buster/llvm-toolchain-buster-11 main';wget-O-https://apt.llvm.org/llvm-snapshot.gpg.key|sudo apt-key add-apt-get updateapt-get install-qq clang-11 clang-tools-11 clang-11-doc libclang-common-11-dev\libclang-11-dev libclang1-11 clang-format-11 clangd-11 clang-tidy-11

..。仅此而已。现在,除了clangd,我还有最新稳定的C++编译器、标准库实现(我可以享受添加到语言中的最新功能)、Linter和代码格式化程序。我们拿到服务器了,那客户端呢?

要使用clangd,我们需要一个语言客户端。有多种实现可用,我将使用co.nvim。用TypeScript编写的IT需要Node.js运行时:

要以简单的方式添加oc.nvim和其他插件,需要一个插件管理器。同样,有多种选项可供选择,我将使用vim-Plug:

对于';:[';zig';,';cmake';,';rust';,\';java';,';json';,';json';,';json';,{';cmake';,\';java';,';json';,';json';,{';cmake';,';rust';,\';java';,';json';,{';{';}嘘';,';cs';,\';YAML';,';c';,';cpp';,';d';,';go';,\';python';,';Dart';,';javascript';,';vim';],';分支&##。Release';}调用Plug#End()。

这是我的.vimrc文件中的内容。插件作为Plug';Github_URI_PATH';列出在Plug#Begin和Plug#End之间。它允许插件使用特定的文件类型工作,该文件类型列在for之后。我不需要也不希望此插件支持其他文件类型,如.txt、.md等。

:PlugInstall将安装并:PlugUpdate更新插件。一个常见的仪式在振动器之间,一旦安装了插件,就会阅读它的文档。通常通过:help pluginName提供。

Nvim将服务器配置保存在一个名为coc-settings.json的JSON文件中(带有:CocConfig)。您几乎可以自定义服务器的所有行为方式。请从此处查看完整方案。目前,我将只注册语言服务器,并将其他语言服务器保留为默认设置:

{";语言服务器";:{";clangd";:{";command";:";clangd";,";filetypes";:[";c";,";cpp";],";rootPatterns";:[";Compile_Commands.json";,&#。Args";:[";--COMPILE-COMMANDS-DIR=BUILD";,";--COMPILE_ARGS_FROM=文件系统";,";--所有作用域-完成";,";--后台索引";,";--clang-tidy";,";--完成-解析=始终";,";--完成-。--跨文件重命名";,";--函数-参数占位符";,";--标题插入-装饰符";,";--查询-驱动程序=/usr/bin/**/clang-*,/home/adm/GCC-10/bin/g++*&34;,";--标题插入=从不";,";-交叉文件---Limit-Results=0";,";-j=6";,";--pch-storage=内存";,]}}

这将使用args数组中列出的参数调用clangd。使用clangd--help查看clangd的所有选项。

您可以向LanguagesServer对象添加任意数量的服务器,这样您就可以在同一编辑器上对不同的语言拥有相同的编辑体验、映射、主题等:

{";languagesserver";:{";clangd";:{//clangd options},";rls";{//rls options},";bash-lsp";{//bash-lsp options}。

对于映射(Vim中用于可重新分配的快捷方式的术语),从examplecConfiguration开始。如果您想看一下,这个白痴在Github上保存他的配置。

仪式的最后一部分涉及到使用CMake。我们需要做的就是在toplevel CMakeLists.txt上添加一个单行定义:

这将在构建目录上生成一个名为Compile_Commands.jsonon的文件。它包含包含路径、编译器命令和选项,这些可以帮助clangd找出什么是位置。

如果项目不使用CMake,而使用make,您可以使用Bear生成带有Bear Makecmand的文件。

整齐的皮棉工具可以通过叮当作响。Linter是一种工具,它可以说出代码中可疑的部分。确保在coc-setting.json文件上传递--clang-tiy arg to clangd。

Clangd将检测到此文件,并根据某些条件嵌入您的代码。查看所有检查:clang-tidy--list-checkks。

人们使用Aspell和其他一些工具来格式化他们的代码,作为一个千禧一代,我第一次遇到这样的工具是在clang-format。它相当容易使用:

片断是一种被低估的帮助者。它们减少了重复性、不费吹灰之力的工作。安装co.nvim代码段扩展名::CocInstall coc-snippits。

其中每个|都在等待打字。编写这样的代码片段相当容易。就像在VSCode中一样,它的JSON文件:

{";cmake";:{";prefix";:[";cmake";],";正文";:[";cmake_Minimum_Required(Version${1:Version})";,";,";project(${2:projname}";,";description\";${3:description}\"。,";HOMEPAGE_URL语言https://github.com/p1v0t/${4:reponame}";,";,";,";,";设置(CMAKE_EXPORT_COMPILE_COMMANTS ON)";,";${0}";]}}。

还有一个用于CMake的扩展,它提供基本的完成。请参阅此处的分机列表。

如果您喜欢编写小程序,并且不需要构建,SingleCompile插件正好适合这一点。下面是一个映射示例:

记住这种客户端-服务器体系结构,您可以在其他平台上使用类似的设置。在Windows中,您可以安装从LLVM获取Windows二进制文件,并使用带有clangd扩展名的VSCode的clangd。在Emacs上,有LSP模式支持。

请不要客气,让我难堪我用这篇帖子做的事情:)谢谢你的阅读。