vim打造C/C++开发环境

  • 用vim打造出 C/C++ 编程环境的方法
  • 多个平台(Windows与linux)下vim的安装与配置
  • 提供了扩展多种编程语言的方案

vim下载与安装

linux下的下载与安装

  • Ubuntu下使用命令

    1
    sudo apt install vim
  • CentOs下使用命令

    1
    sudo yum install vim

windows下的下载与安装

  • 官网下载gvim安装包点击安装即可
    点此下载
  • 安装时务必记住安装路径,以便之后的配置;
  • 安装路径不要出现中文或空格,以避免一些奇怪的错误

vim插件的下载与应用

相关目录和配置文件

  • vimrc 配置文件

    linux下为 ~/.vimrc , windows下为安装目录下的 _vimrc文件

  • linux下vim插件的存放目录为

    1
    2
    3
    cd ~/.vim/
    #如没有可自行创建
    #mkdir ~/.vim/
  • windows下插件存放目录为,软件安装目录下的 vimfile 文件夹

插件管理插件 pathogen

  • 项目地址

    https://github.com/tpope/vim-pathogen

  • 安装命令

    1
    mkdir -p ~/.vim/autoload ~/.vim/bundle && curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim
  • 解释

    • 在~/.vim/目录下创建两个文件夹autoload 和 bundle
    • 将 pathogen.vim 文件下载到autoload目录下
    • 将其他插件放在 bundle 目录下, pathogen会自动将其配置,而不用自己将文件放在不同的目录
    • linux下可以直接复制上面的安装命令(当然前提时安装了git) ,
    • windows下从项目地址将文件下载下来按照上述说明建立相应的文件夹并将文件复制进去即可

自动匹配括号与引号 auto-pairs

  • 项目地址

    https://github.com/jiangmiao/auto-pairs

  • 安装命令

    1
    git clone git://github.com/jiangmiao/auto-pairs.git ~/.vim/bundle/auto-pair
  • 解释

    从GitHub上获取项目的文件夹复制到 ~/.vim/bundle 目录下(此后的插件都是此方式,之后不再赘述)

显示目录树 NERDTree

ctags

  • 说明

    ctags并不是一个vim的插件,它是一个可执行的程序,通过它可以生成索引文件,用于变量与函数的跳转,列出及代码补全

  • linux下的安装

1
2
sudo apt-get install ctags		#Ubuntu
sudo yum install ctags #CentOs
  • windows下的安装 点此下载

    把下载下来的压缩文件解压,把其中的 ctags.exe 文件添加环境变量(不会请自行百度)

taglist 列出函数、变量等

C/C++代码补全 omnicppcomplete

  • 项目地址

    http://www.vim.org/scripts/script.php?script_id=1520

  • 安装命令

    1
    cd ~/.vim/bundle && wget "http://www.vim.org/scripts/download_script.php?src_id=7722" -O omnicppcomplete.zip && unzip omnicppcomplete.zip -d omnicppcomplete
  • 额外添加库函数补全的方法

    以 STL 标准库为例

    • 下载用于生成 tags 文件的补全文件
      点此下载

    • 建立一个文件夹方便统一管理,(这里我选择在.vim/ 下建立一个名为 tags 的文件夹)

      1
      mkdir -p ~/.vim/tags && cd ~/.vim/tags && wget "http://www.vim.org/scripts/download_script.php?src_id=9178" -O - | tar jxvf -
    • 生成 tags 文件,在 ~/.vim/tags/cpp_src/目录下执行如下命令

      1
      ctags -R --sort=yes --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++
    • 添加tags文件路径到 vimrc

      1
      set tags+=~/.vim/tags/cpp_src/tags

MiniBufExplorer 显示已打开的文件

SuperTab — tab键触发代码补全

vimrc文件的编写

以下是我的vimrc文件

几点说明

  • 文件中各个部分都做了注释,应该比较容易看懂
  • 文件中有些补全插件在文中并未提及,有些我自己也没装,可根据需要自行查找,这里提供的只是一个支持多种编程语言的vimrc文件编写思路,请见谅
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
"============================
" windows下解决乱码问题(linux下不需要)
"============================
set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has("win32")
set fileencoding=chinese
else
set fileencoding=utf-8
endif
"解决菜单乱码
source $VIMRUNTIME/delmenu.vim
source $VIMRUNTIME/menu.vim
"解决consle输出乱码
language messages zh_CN.utf-

"============================
" 基本设置
"============================
syntax enable "开启语法高亮
syntax on "开启语法高亮

filetype on "检测文件类型
filetype plugin on "针对不同文件采取不同缩进方式
filetype indent on "允许插件
filetype plugin indent on "启动自动补全

set number "显示行号
set ruler "显示当前行号
set showmode "显示当前Vim模式
set showcmd "显示正在输入的命令
set tabstop=4 "设置tab宽度
set shiftwidth=4 "设置自动对齐空格数
set smarttab "设置backspace删去tab"
set mouse=a "允许鼠标操作
set nobackup "取消备份
set noswapfile "取消临时文件
set encoding=utf-8 "设置编码方式
set helplang=cn "中文帮助
set completeopt=longest,menu "自动补全配置
set wildmenu "增强命令行自动完成操作

"pathogen 插件管理
execute pathogen#infect()


"============================
" TagList插件设置
"============================
autocmd FileType cpp set tags+=~/.vim/tags/cpp_src/tags "设置tags文件包含
let Tlist_Show_One_File=1 " 只展示一个文件的taglist
let Tlist_Exit_OnlyWindow=1 " 当taglist是最后一个窗口时自动退出
let Tlist_Use_Right_Window=1 " 在右边显示taglist窗口
let Tlist_Sort_Type="name" " tag按名字排序


"============================
" 补全插件设置
"============================
autocmd FileType css set omnifunc=csscomplete#CompleteCSS
autocmd FileType html set omnifunc=htmlcomplete#CompleteTags
autocmd FileType javascript set omnifunc=javascriptcomplete#CompleteJS
autocmd FileType xml set omnifunc=xmlcomplete#CompleteTags
autocmd FileType php set omnifunc=phpcomplete#CompletePHP
autocmd FileType ruby set omnifunc=rubycomplete#Complete
autocmd FileType perl set omnifunc=perlcomplete#Complete

"============================
" C++ 补全插件设置
"============================
autocmd Filetype c setlocal omnifunc=cppcomplete#Complete
autocmd Filetype cpp setlocal omnifunc=cppcomplete#Complete
" search namespaces in the current buffer and in included files
let OmniCpp_NamespaceSearch = 2
let OmniCpp_ShowPrototypeInAbbr = 1 " 显示函数参数列表
let OmniCpp_MayCompleteScope = 1 " 输入 :: 后自动补全
let OmniCpp_DefaultNamespaces = ["std", "_GLIBCXX_STD"]
let OmniCpp_DisplayMode = 1 "always show all members


"============================
" Python 补全插件设置
"============================
autocmd Filetype python setlocal omnifunc=pythoncomplete#Complete
let g:pydiction_location='~/.vim/tools/pydiction/complete-dict'

"============================
" Java 补全插件设置
"============================
autocmd Filetype java setlocal omnifunc=javacomplete#Complete
autocmd FileType java set omnifunc=javacomplete#Complete
autocmd FileType java set completefunc=javacomplete#CompleteParamsInf
autocmd FileType java inoremap <buffer> . .<C-X><C-O><C-P>


"============================
" 自动添加文件头
"============================
"新建.c,.h,.sh,.java文件,自动插入文件头
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.rb,*.java,*.py exec ":call SetTitle()"
""定义函数SetTitle,自动插入文件头
func SetTitle()
"如果文件类型为.sh文件
if &filetype == 'sh'
call setline(1,"\#!/bin/bash")
call append(line("."), "")
elseif &filetype == 'python'
call setline(1,"#!/usr/bin/env python")
call append(line("."),"# coding=utf-8")
call append(line(".")+1, "")
else
call setline(1, "/*************************************************************************")
call append(line("."), " > File Name: ".expand("%"))
call append(line(".")+1, " > Author: DHD")
call append(line(".")+2, " > Mail: ")
call append(line(".")+3, " > Created Time: ".strftime("%c"))
call append(line(".")+4, " ************************************************************************/")
call append(line(".")+5, "")
endif
if expand("%:e") == 'cpp'
call append(line(".")+6, "#include<iostream>")
call append(line(".")+7, "using namespace std;")
call append(line(".")+8, "")
endif
if &filetype == 'c'
call append(line(".")+6, "#include<stdio.h>")
call append(line(".")+7, "")
endif
if expand("%:e") == 'h'
call append(line(".")+6, "#ifndef _".toupper(expand("%:r"))."_H")
call append(line(".")+7, "#define _".toupper(expand("%:r"))."_H")
call append(line(".")+8, "#endif")
endif
if &filetype == 'java'
call append(line(".")+6,"public class ".expand("%:r"))
call append(line(".")+7,"")
endif
"新建文件后,自动定位到文件末尾
endfunc
autocmd BufNewFile * normal G


"============================
" 快捷键设置
"============================
"Ctrl + n 打开目录树
map <C-n> :NERDTree<CR>
"Ctrl + t 打开 taglist
map <F8> :Tlist<CR>
"ctags 生成 cpp 文件的 tags
map <F12> :call CreateTags()<CR>
"<F5> 编译运行
map <F5> :call ComplieAndRun() <CR>
"<C-F5> 调试
map <C-F5> :call Rungdb() <CR>


"============================
" 函数定义
"============================
"编译
func! ComplieAndRun()
exec "w"
if &filetype == 'c'
exec "!g++ % -o %<"
exec "!time ./%<"
elseif &filetype == 'cpp'
exec "!g++ % -std=c++11 -o %<"
exec "!time ./%<"
elseif &filetype == 'java'
exec "!javac %"
exec "!time java %<"
elseif &filetype == 'sh'
:!time bash %
elseif &filetype == 'python'
"exec "!time python2.7 %"
exec "!time python3.6 %"
elseif &filetype == 'html'
exec "!google-chrome % &"
endif
endfunc

"调试
func! Rungdb()
exec "w"
exec "!g++ % -std=c++11 -g -o %<"
exec "!gdb ./%<"
endfunc

"生成tags文件
func! CreateTags()
if &filetype == 'c'
exec "!ctags *.c *.h --c-kinds=+p --fields=+iaS --extra=+fq "
elseif &filetype == 'cpp'
exec "!ctags *.cpp *.h *.hpp *.c --c++-kinds=+px --fields=+iaS --extra=+fq "
elseif &filetype == 'java'
exec "!ctags *.java --java-kinds=+p --fields=+iaS --extra=+fq "
elseif &filetype == 'python'
exec "!ctags *.py --python-kinds --fields=+iaS --extra=+f "
elseif &filetype == 'html'
exec "!ctags *.html --html-kinds=+p --fields=+iaS --extra=+f "
endif
endfunc