Windows配置vim编辑器写C++
前言
我是一个非常喜欢vim的人,于是我想要在windows下实现vim编辑器
下面的内容主要参考:
https://www.linuxprobe.com/how-using-vim.html
https://vim.fandom.com/wiki/C%2B%2B_code_completion
所需文件介绍
1.编译器:MinGW
什么是MinGW-64?我也不清楚,只能贴过来一篇文章,c++有很多编译器,其他不做介绍。
2. 编辑器:vim
MinGW-64安装过程
MinGW-64,进入网址后点击Files,文件在该目录下:Toolchains targetting Win64–>Personal Builds–>mingw-builds–>8.1.0–>threads-posix–>seh
这里下载的是64位、seh异常处理机制、POSIX线程的gcc包。
把下载好的x86_64-8.1.0-release-posix-seh-rt_v6-rev0解压,得到文件夹mingw64,然后把mingw64随便放到一个目录下,把mingw64目录下的bin添加环境变量即可。
测试是否安装完成,在命令行输入gcc -v
,可以看到版本信息
这样,我们就将一个编译环境搭建好了,
helloword程序测试,将这段代码写入hello.cpp文件中,把hello.cpp放到桌面,用g++命令编译,生成a.exe文件,执行a.exe输出”HELLO WORLD”。注意了,编译的时候不能使用gcc命令,虽然gcc命令可以编译c++源码,但是它不能自动链接c++的函数库。
#include<iostream> using namespace std; int main() { cout<<"HELLO WORLD"<<endl; return 0; }
vim安装以及配置
编译环境弄好,下一步就是编辑环境了,我们来安装vim
vim官网,进入网址后点击Download再点击PC: MS-DOS and MS-Windows,再点击gvim82.exe(ftp)完成下载
程序安装:点开gvim82.exe一直下一步就好。安装完成后会生成一系列的vim编辑器。
环境变量配置:和上面MinGW-64配置环境变量一样,把vim目录下的vim82添加到环境变量path中,然后确定。
MinGW的使用
MinGW(Minamalist GNU For Windows)是个精简的C/C++编译器,它实际上是将经典的开源C语言编译器GCC移植到了Windows下,并且包含了Win32API,因此可以将源代码编译生成Windows下的可执行程序。
一句话来概括,MinGW是GCC的Windows版本
对cpp文件的编译与运行
我们来写一段C/C++代码
#include<stdio.h>
int main(void){
printf("请输入一个数字,我们将判断其奇偶");
int val; //用于存储数字
scanf("%d",&val);
if(val%2==1){
printf("这是一个奇数\n");
}else{
printf("这是一个偶数\n");
}
return 0;
}
这是一个简单的判断奇数偶数的一段程序,下面,我们来将其保存在某cpp文件中。
首先我们需要有一些理论知识,关于一个C/C++文件被运行的步骤
C/C++文件变成可执行文件(即日常所说“编译过程”)需要四个步骤:
- 预编译:预处理主要处理源文件中的“#include”、“#define”等预处理命令,最后将这些数据输出到一个“.i”的文件中
预处理主要完成的工作有:
(1)删除#define,展开宏;
(2)处理条件编译指令,预处理程序先判断条件,在根据条件修改源代码;
(3)删除注释;
(4)添加行号,以及文件名标识,便于调试
(5)删除“#include”,插入相应的头文件; - 编译:将C/C++文件,例如刚才的.i文件翻译成汇编语言的文件,将结果数据输出到“.s”的文件中
- 汇编:将刚才的汇编代码翻译成符合一定格式的机器代码,将结果输出到“.o、.obj”的文件中
- 链接:链接就是将上一步生成的obj文件和系统的obj文件、库文件链接起来,最终生成可以在特定平台执行的可执行文件
而我们的MinGW所对应的命令就是
- 预编译:g++ -E test.cpp -o test.i
- 编译:g++ -S test.i -o test.s
- 汇编:g++ -c test.s -o test.o
- 链接:g++ test.o -o test.exe
我们可以直接使用g++ test.cpp -o test 来生成可执行程序,不过建议一步步来,这样也能更熟悉C++的编译过程。
GDB调试工具
下面我们来介绍一些MinGW下的一个调试工具——GDB。
要支持调试,在编译时要加入-g选项,编译命令:
gcc -g test.cpp -o test.exe
然后,我们就可以加载调试文件:
gdb test.exe
调试常用命令:
命令 | 解释 | 简写 |
file | 加载一个可执行文件,也可以在运行gdb的时候加载,两种方法都不会运行程序。 | 无 |
list | 列出可执行源码的一部分,通常在程序开始运行前执行,用来设置断点。 | l |
next | 单步调试,不进入函数。 | n |
step | 单步执行,进入函数。 | s |
run | 运行加载了的程序。 | r |
continue | 继续执行程序。 | c |
quit | 退出调试。 | q |
printf | 输出指定的变量的值,变量要在程序运行处可见。 | p |
break | 设置断点。 | b |
info break | 查看断点的信息。 | i b |
delete | 删除断点。 | d |
watch | 监视一个变量的值,一旦发生变化,程序将会被暂停执行。 | wa |
help | 查看gdb的帮助信息。 | h |
help | 查看gdb的帮助信息。 | h |
我们通过 break n(n是一个数字) 来设置断点
关于GDB的具体操作请看这里——https://www.cnblogs.com/ggg-327931457/p/9765774.html
Vim基本操作
三种基本模式
(1)一般模式:进入vi的默认模式,能够进行复制、黏贴、删除等操作; (2)编辑模式:从一般模式按下‘i’即可进入; (3)命令行模式:从一般模式按下“:”、'?'、'/'即可进入;
一般模式 常用按键
“一般模式”的常用按键 | 按键含义 |
---|---|
h | 向左 |
J | 向下 |
K | 向上 |
l | 向右 |
20h | 向左20个字符 |
20j | 向下20行 |
20k | 向上20行 |
20l | 向右20个字符 |
Page Up | 向上翻页 |
Page Down | 向下翻页 |
Home | 光标移到当前行的最左端 |
End | 光标移到当前航的最右端 |
n [空格] | 光标向右移动n个字符 |
N[Enter] | 光标向下N行 |
G | 光标移到最后一行 |
nG | 光标移动到第n行 |
gg或1G | 光标移动到第一行 |
/word | 向下查找word |
?word | 向上查找word |
n | 如果是/word后使用,则表示向下继续查找; 如果是?word后使用,则表示向上继续查找; |
N | 如果是/word后使用,则表示向上继续查找; 如果是?word后使用,则表示向下继续查找; |
:n,m/old/new/g | 从第n行到第m行中,将old替换为new |
:n,$s/old/new/g | 从第n行到最后一行中,将old替换为new |
u | 类似windows中的CTRL+Z,前一步 |
x | 向后删除一个字符 |
X | 向前删除一个字符 |
3x | 向后删除3个字符 |
3X | 向前删除3个字符 |
dd | 删除当前行 |
3dd | 删除当前行开始的3行 |
yy | 复制当前行 |
3yy | 复制当前行开始的3行 |
p | 黏贴到当前光标的下一行 |
P | 黏贴到当前光标的上一行 |
CTRL+r | 重做前一个操作 |
命令行模式 常用按键
“命令行模式”的常用按键 | 按键含义 |
---|---|
:w | 保存 |
:q | 退出vim |
:wq | 保存并退出 |
:wq! | (在可以转换权限的情况下)强制保存并退出 |
:q! | 直接退出不保存 |
:w filename | 另存为filename |
:n,m w filename | 将第n行到第m行另存为filename |
:set nu | 显示行号 |
:set nonu | 不显示行号 |
:! command | 暂时离开vim,并执行command,执行完后再进入vim |
:r filename | 将filename文件的数据读入当前文件 |
:set all | 显示当前vim的环境配置 |
:term | 打开一个终端 |
可视区块功能
Visual Block功能可以用于块复制。
在一般模式下可以进行可视区块操作:
CTRL+v:开始复制块;
y:复制块;
p:黏贴块;
d:删除块
同时编辑多个文件
多文件编辑的好处是能够将一个文件的某些内容yy后,p到另一个文件中。
vim file1 file2 即可同时编辑两个文件,但是屏幕中同时只会出现一个文件内容,需要进行切换。
在命令行模式下:
:n:向下切换;
:N:向上切换;
:files:列出当前编辑的所有文件;
多窗口编辑
如下图:一个界面能够显示多个文件内容
:sp:打开当前文件;
:sp filename:打开filename文件;
CTRL+w+↓:光标切换到下一个窗口;
CTRL+w+↑:光标切换到上一个窗口;
:q:关闭光标所在的窗口;
升级Vim
下载好了vim,下面我们要来配置一些插件
安装Vundle
首先我们需要安装一个插件管理器——Vundle。
通过下面的命令将Vundle安装到vim目录下的vim82/bundle/Vundle.vim目录下
git clone https://github.com/VundleVim/Vundle.vim.git vim82/bundle/Vundle.vim
你的电脑需要基本配置git
添加一个gvim目录的 环境变量 $VIM ,步骤 :我的电脑->属性->高级系统设置->高级->环境变量->新建 ;如图
打开_vimrc,加入如下配置
"vundle start
set nocompatible " be iMproved, required
filetype off " required
" 将Vundle插件的目录添加到gvim的运行时变量中
set rtp+=$VIM/vim82/bundle/Vundle.vim/
call vundle#begin('$VIM/vim82/bundle/')
" All of your Plugins must be added before the following line
Plugin 'VundleVim/Vundle.vim'
Plugin 'scrooloose/nerdtree'
call vundle#end() " required
filetype plugin indent on " required
"vundle end
需要安装插件时只要在vundle#begin下面写插件就可以了
卸载插件
- 编辑.vimrc文件移除的你要移除的插件所对应的plugin那一行。
- 保存退出当前的vim
- 重新打开vim,输入命令BundleClean。
配置编译环境
在你的_vimrc文件中配置编译调试选项。
"编译环境
func CompileRun()
exec "w"
"C程序
if &filetype == 'c'
exec "!gcc -Wall -enable-auto-import % -g -o %<.exe"
"c++程序
elseif &filetype == 'cpp'
exec "!g++ -Wall -enable-auto-import % -g -o %<.exe"
"Java程序
elseif &filetype == 'java'
exec "!javac %"
endif
endfunc
"结束定义CompileRun
"定义Run函数
func Run()
if &filetype == 'c' || &filetype == 'cpp'
exec "!%<.exe"
elseif &filetype == 'java'
exec "!java %<"
endif
endfunc
"定义Debug函数,用来调试程序
func Debug()
exec "w"
"C程序
if &filetype == 'c'
exec "!gcc % -g -o %<.exe"
exec "!gdb %<.exe"
elseif &filetype == 'cpp'
exec "!g++ % -g -o %<.exe"
exec "!gdb %<.exe"
"Java程序
elseif &filetype == 'java'
exec "!javac %"
exec "!jdb %<"
endif
endfunc
"结束定义Debug
"设置程序的运行和调试的快捷键F5和Ctrl-F5
map <F5> :call CompileRun()<CR>
map <F6> :call Run()<CR>
map <C-F5> :call Debug()<CR>
可能遇到的问题:
编译的时候可能会出现:
Info: resolving std::cout by linking to __imp___ZSt4cout (auto-import)
c:/mingw/bin/../lib/gcc/mingw32/4.5.0/../../../../mingw32/bin/ld.exe: warning: a
uto-importing has been activated without –enable-auto-import specified on the c
ommand line.
This should work unless it involves constant data structures referencing symbols
from auto-imported DLLs.)
在编译命令中加入 -enable-auto-import
安装nerdtree
下面我们来安装第一个插件——nerdtree,上面的配置文件中已经写了:
Plugin 'scrooloose/nerdtree'
下面在我们的Vim命令行下执行:
:PluginInstall
在_vimrc文件中添加对应的配置就可以使用了
"autocmd vimenter * NERDTree map <F2> :NERDTreeToggle<CR> "nerdtree end
关于这个目录管理工具的一些操作帮助:
进入当前目录的树形界面,通过小键盘”上下”键,能移动选中的目录或文件。目录前面有”+”号,按Enter会展开目录,文件前面是”-“号,按Enter会在右侧窗口展现该文件的内容,并光标的焦点focus右侧。”ctr+w+h”光标focus左侧树形目录,”ctrl+w+l”光标focus右侧文件显示窗口。多次按”ctrl+w”,光标自动在左右侧窗口切换。光标focus左侧树形窗口,按”?”弹出NERDTree的帮助,再次按”?”关闭帮助显示。输入”:q”回车,关闭光标所在窗口。
NERDTree提供了丰富的键盘操作方式来浏览和打开文件,介绍一些常用的快捷键:
-
和编辑文件一样,通过h j k l移动光标定位
-
打开关闭文件或者目录,如果是文件的话,光标出现在打开的文件中
-
go 效果同上,不过光标保持在文件目录里,类似预览文件内容的功能
-
i和s可以水平分割或纵向分割窗口打开文件,前面加g类似go的功能
-
t 在标签页中打开
-
T 在后台标签页中打开
-
p 到上层目录
-
P 到根目录
-
K 到同目录第一个节点
-
J 到同目录最后一个节点
- r : 刷新当前目录
- R : 刷新当前根目录(这个在新加入文件后会用到)
-
m 显示文件系统菜单(添加、删除、移动操作)
-
? 帮助
-
q 关闭
CTags和OmniComplete代码补全
OmniComplete 并不是插件的名字,而是 Vim 众多补全方式中的一种(全能补全)。说白了 OmniComplete 其实就是根据光标前的内容猜测光标后的内容,具体怎么猜取决于所采用的脚本。
而 OmniCppComplete 就是专为 C/C++ 编写的 OmniComplete 一个补全脚本。
那么经常和 OmniCppComplete 一起出没的 Ctags 又是什么呢?Ctags 全名 Exuberant Ctags,是一个独立的程序(也就是说,其实和 Vim 一点关系都没有)。它可以为各种语言的源代码生成语言元素(language object)索引文件。对于 C/C++ 来说,就是把源代码中的各种宏、函数、类、类成员等等元素和它们的相关信息生成索引文件,供其它程序使用。
OmniCppComplete 脚本就是根据 Ctags 生成的索引文件进行补全的。
安装CTags
- 从官网下载 Ctags 可执行文件,网站是 http://ctags.sourceforge.net/
- 将下载到的文件解压到一个目录,例如
D:/ctags
- 将该目录加入环境变量
PATH
准备索引文件
以生成 C++ 标准库索引文件为例,我们来创造 stdc++标签:
- 创造一个目录,例如%VIM%\vim82\tags,来存放我们一会需要的标签
- 下载并且解压标准库文件到%VIM%\vim82\tags
- 进行tags目录下执行下列命令:
ctags -R --sort=1 --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ -f cpp cpp_src
–c++-kinds=+p : 为标签添加函数原型(prototype)信息
–fields=+iaS : 为标签添加继承信息(inheritance),访问控制(access)信息,函数特征(function Signature,如参数表或原型等)
–extra=+q : 为类成员标签添加类标识
基本步骤到这里就结束了,我们在tags目录下生成了一个cpp文件
安装 OmniCppComplete
- 在vundle中添加
Plugin 'thinktainer/omnicppcomplete'
- 在vim中使用PluginInstall安装
- 在 vimrc 文件中加入
filetype on
" configure tags - add additional tags here or comment out not-used ones
set tags+=E:\gVim\gvim\Vim\vim82\tags\cpp
" build tags of your own project with Ctrl-F12
map <C-F12> :!ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q .<CR>
" OmniCppComplete
let OmniCpp_NamespaceSearch = 1
let OmniCpp_GlobalScopeSearch = 1
let OmniCpp_ShowAccess = 1
let OmniCpp_ShowPrototypeInAbbr = 1 " show function parameters
let OmniCpp_MayCompleteDot=1 " autocomplete after .
let OmniCpp_MayCompleteArrow = 1 " autocomplete after ->
let OmniCpp_MayCompleteScope = 1 " autocomplete after ::
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
" automatically open and close the popup menu / preview window
au CursorMovedI,InsertLeave * if pumvisible() == 0|silent! pclose|endif
set completeopt=menuone,menu,longest,preview
另外,还需确认在 vimrc 中开启了 filetype 选项,不然 OmniComplete 无法自动识别 C/C++ 文件类型进行补全。
这样,在插入模式编辑 C/C++ 源文件时按下 .
或 ->
或 ::
,或者手动按下 Ctrl+X Ctrl+O 后就会弹出自动补全窗口,此时可以用 Ctrl+N 和 Ctrl+P 上下移动光标进行选择。
不出意外,在这里就可以实现补全了,老实说,这里困了我一下午,网上很多下载OminicppComplete的方法是过时的,原来在vundle中写一句话就可以,甚至峰回路转。
也许你也已经注意到了一个问题,那就是「自动补全窗口的配色非常之丑」,Vim 自带的几个配色方案中只有两三种配色改掉了自动补全窗口丑陋的紫色,其它的基本上都是很逆天的用灰色表示当前选中项、紫色表示其他项。
要改变自动补全窗口的配色可以在 vimrc 中加上:
highlight Pmenu guibg=darkgrey guifg=black highlight PmenuSel guibg=lightgrey guifg=black
Pmenu
是所有项的配色,PmenuSel
是选中项的配色,guibg
和guifg
分别对应背景色和前景色。效果在gVim中才能看!
安装auto-pairs
这个插件是一个帮助自动补全括号的插件
在vundle中添加:
Plugin 'jiangmiao/auto-pairs'
然后PluginInstall
补全规则1:逗号后补全空格。例如,输入:',',输出:', '
let g:AutoPairs = {',':' ','(':')', '[':']', '{':'\}',"'":"'",'"':'"', "`":"`", '```':'```', '"""':'"""', "'''":"'''"}
其他小插件
还有一些小插件:
Yggdroot/indentLine ——代码缩进标识
https://github.com/Yggdroot/indentLine
Vundle管理:Plugin 'Yggdroot/indentLine'
.vimrc配置:
" 设置对齐线开/关快捷键
nmap <leader>il :IndentLinesToggle<CR>
" 设置Gvim的对齐线样式
let g:indentLine_char = "┊"
let g:indentLine_first_char = "┊"
" 设置对齐线默认开1/关0状态
let g:indentLine_enabled = 1
" 设置 GUI 对齐线颜色,如果不喜欢可以将其注释掉采用默认颜色
" let g:indentLine_color_gui = '#A4E57E'
" 设置终端对齐线颜色,如果不喜欢可以将其注释掉采用默认颜色
" let g:indentLine_color_term = 239
Mark–Karkat ——高亮关键字
https://github.com/vim-scripts/Mark–Karkat
vundle管理:Plugin 'Mark--Karkat'
.vimrc配置:插件内置,无需配置
使用方法:
<leader>m 高亮/取消选中的单词
<leader>n 取消高亮的所有单词
<leader>/ 查找高亮的所有单词
装饰主题
tender
Plugin 'jacoborus/tender.vim'
https://github.com/jacoborus/tender.vim#screenshots
let g:lightline = { 'colorscheme': 'tender' }
基本的搭建就是这样,后面就靠各位自己来玩出花儿了。
商业转载 请联系作者获得授权,非商业转载 请标明出处,谢谢