小言_互联网的博客

手把手教你配置linux下C++开发工具——vim+ycm(YouCompleteMe),支持基于语义的自动补全和第三方库补全(史上最简单、史上最透彻、史上最全的终极解决方案)

6453人阅读  评论(0)

截止到目前,vim稳定版本已经到了8.2+,ycm(YouCompleteMe的简称)最新版本与几年前的安装配置截然不同了。之前网上很多教程也教不得法,生搬硬套,没有讲透彻。所以,才下定决心写一篇自认为史上最简单、史上最全的教程出来。

一、准备工作

       1、安装python(ycm需要使用python3.6以上的版本,这里选择python3.8.5):

                   1.1、进入download目录:cd download

                   1.2、下载python3.8.5:wget https://www.python.org/ftp/python/3.8.5/Python-3.8.5.tar.xz

                   1.3、解压: xz -d Python-3.8.5.tar.xz  && tar -xvf Python-3.8.5.tar

                   1.4、进入Python-3.8.5目录:cd Python-3.8.5

                   1.5、配置:./configure --prefix=/usr --enable-shared --enable-optimizations --with-ssl

                   1.6、构建及安装:make -j 8 && sudo make install   #构建完成后,会安装在/usr/bin目录

                   1.7、测试:在命令行输入python --version或python3 --version

二、安装vim8.2+

            1、下载vim8.2:git clone https://github.com/vim/vim.git

            2、进入目录:cd vim

            3、切换到最新的tag:git checkout v8.2.1522    #可使用git tag查看所有的tag

            4、配置:./configure --prefix=/usr --enable-luainterp=yes --enable-mzschemeinterp --enable-perlinterp=yes  --enable-python3interp=yes --enable-tclinterp=yes --enable-rubyinterp=yes --enable-cscope --enable-terminal --enable-autoservername --enable-multibyte --enable-xim --enable-fontset --with-modified-by=shlian --with-compiledby=shlian  --with-python3-command=python3   

           如果上述配置命令配置、编译后,vim一直不能支持python3,则建议尝试一下下面的命令:

            ./configure --prefix=/usr --enable-luainterp=yes --enable-mzschemeinterp --enable-perlinterp=yes  --enable-python3interp=yes --enable-tclinterp=yes --enable-rubyinterp=yes --enable-cscope --enable-terminal --enable-autoservername --enable-multibyte --enable-xim --enable-fontset --with-modified-by=shlian --with-compiledby=shlian  --with-python3-config-dir=/usr/lib/python3.8/config-3.8-x86_64-linux-gnu

           #上面的--with-python3-config-dir的目录视机器的不同而不同,建议在自己的机器上查找具体的配置目录并修改。

           说明:

              1、标红的非常关键, vim8.2以后的版本,在配置的时候,不用再指定python的config目录了(网上很多很多指定python的config目录的教程,只能说已经过时了,详见:./configure --help)

              2、注意:vim8.2不支持同时使用python2和python3,所以千成不可以在上述命令中指定:--enable-pythoninterp=yes,否则python3不会被vim支持的

              3、如果发现了错误,则安装不存在的依赖包:

                     3.1 yum install perl-devel #让vim支持perl解释器

                     3.2 yum install perl-ExtUtils-Embed #安装包解决:找不到EXTERN.h文件的问题

                     3.3 yum install ruby-devel #让vim支持ruby解释器

               5、构建及安装:make -j 8 && sudo make install

               6、查看vim是否支持python3:

                 

                 带+号的说明已经支持了,所以,已经成功安装了支持python3的vim

 

三、安装vim辅助插件

            1、下载管理插件的插件——vundle

                 新建目录: mkdir -p  ~/.vim/bundle

                 clone代码:git clone https://github.com/VundleVim/Vundle.vim.git  ~/.vim/bundle/Vundle.vim

              2、在home目录,新建一个.vimrc文件,并输入以下内容:                   


  
  1. set nocompatible " be iMproved, required
  2. filetype off " required
  3. " set the runtime path to include Vundle and initialize
  4. set rtp+=~/.vim/bundle/Vundle.vim
  5. call vundle#begin()
  6. " let Vundle manage Vundle, required
  7. Plugin 'VundleVim/Vundle.vim'
  8. " All of your Plugins must be added before the following line
  9. call vundle#end() " required
  10. filetype plugin indent on " required

               3、安装

                    使用vim打开.vimrc文件 : vim .vimrc 

                    按键”shift+;"进入命令模式,输入:PluginInstall,然后回车即可完成安装

               4、配置.vimrc,是一项很复杂的工作,我配置好的如下(已经安装了很多插件了,如:文件搜索、注释、doxygen、drawit、buffer、winmanager+taglist+tagbar等等):

                    


  
  1. "/**
  2. "* @file .vimrc
  3. "* @brief vimrc
  4. "* @author shlian
  5. "* @version 1.1.0
  6. "* @date 2020-09-01
  7. "*/
  8. set nocompatible " 关闭 vi 兼容模式
  9. set smartindent "当在大括号中间回车的时候,他会智能缩进,因为他知道括号中间要缩进
  10. set tabstop=4
  11. set shiftwidth=4
  12. set expandtab
  13. syntax on " 自动语法高亮
  14. set number " 显示行号
  15. "设置代码参考线
  16. highlight ColorColumn ctermbg=darkgray
  17. set colorcolumn=140
  18. " 高亮显示当前行
  19. set cursorline
  20. "red(红),white(白),black(黑),green(绿),yellow(黄),blue(蓝),purple(紫),gray(灰),brown(棕),tan(褐色),syan(青色)
  21. hi CursorLine cterm=NONE ctermbg=darkgray ctermfg=NONE
  22. "hi CursorColumn cterm=NONE ctermbg=darkred ctermfg=white
  23. set ruler " 打开状态栏标尺
  24. set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4
  25. set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格
  26. set tabstop=4 " 设定 tab 长度为 4
  27. set nobackup " 覆盖文件时不备份
  28. "set autochdir " 自动切换当前目录为当前文件所在的目录
  29. set backupcopy=yes " 设置备份时的行为为覆盖
  30. set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
  31. "set nowrapscan " 禁止在搜索到文件两端时重新搜索
  32. set incsearch " 输入搜索内容时就显示搜索结果
  33. set hlsearch " 搜索时高亮显示被找到的文本
  34. set noerrorbells " 关闭错误信息响铃
  35. set novisualbell " 关闭使用可视响铃代替呼叫
  36. set t_vb= " 置空错误铃声的终端代码
  37. set showmatch " 插入括号时,短暂地跳转到匹配的对应括号
  38. " set matchtime=2 " 短暂跳转到匹配括号的时间
  39. set magic " 设置魔术
  40. set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存
  41. set guioptions-=T " 隐藏工具栏
  42. set guioptions-=m " 隐藏菜单栏
  43. set smartindent " 开启新行时使用智能自动缩进
  44. set backspace=indent,eol,start
  45. " 不设定在插入状态无法用退格键和 Delete 键删除回车符
  46. set cmdheight=1 " 设定命令行的行数为 1
  47. set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)
  48. set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
  49. " 设置在状态行显示的信息
  50. set foldenable " 开启折叠
  51. "set foldmethod=syntax " 设置语法折叠************************
  52. set foldcolumn=0 " 设置折叠区域的宽度
  53. setlocal foldlevel=1 " 设置折叠层数为
  54. "set foldclose=all " 设置为自动关闭折叠
  55. nnoremap <space> @=((foldclosed(line( '.')) < 0) ? 'zc' : 'zo')<CR>
  56. " 用空格键来开关折叠
  57. " return OS type, eg: windows, or linux, mac, et.st..
  58. function! MySys()
  59. if has( "win16") || has( "win32") || has( "win64") || has( "win95")
  60. return "windows"
  61. elseif has( "unix")
  62. return "linux"
  63. endif
  64. endfunction
  65. " 用户目录变量$VIMFILES
  66. if MySys() == "windows "
  67. let $VIMFILES = $VIM.'/vimfiles'
  68. elseif MySys() == "linux "
  69. let $VIMFILES = $HOME.'/.vim'
  70. endif
  71. " 设定doc文档目录
  72. let helptags= $VIMFILES. '/doc'
  73. " 设置字体 以及中文支持
  74. if has("win32 ")
  75. set guifont=Inconsolata:h12:cANSI
  76. endif
  77. " 配置多语言环境
  78. if has( "multi_byte")
  79. " UTF-8 编码
  80. set encoding=utf-8
  81. set termencoding=utf-8
  82. set formatoptions+=mM
  83. set fencs=utf-8,gbk
  84. if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
  85. set ambiwidth=double
  86. endif
  87. if has("win32 ")
  88. source $VIMRUNTIME/delmenu.vim
  89. source $VIMRUNTIME/menu.vim
  90. language messages zh_CN.utf-8
  91. endif
  92. else
  93. echoerr "Sorry, this version of (g)vim was not compiled with +multi_byte "
  94. endif
  95. " Buffers操作快捷方式!
  96. "nnoremap <C-RETURN> :bnext<CR>
  97. "nnoremap <C-S-RETURN> :bprevious<CR>
  98. " Tab操作快捷方式!
  99. "nnoremap <C-TAB> :tabnext<CR>
  100. "nnoremap <C-S-TAB> :tabprev<CR>
  101. "关于tab的快捷键
  102. " map tn :tabnext<cr>
  103. " map tp :tabprevious<cr>
  104. " map td :tabnew .<cr>
  105. " map te :tabedit
  106. " map tc :tabclose<cr>
  107. "窗口分割时,进行切换的按键热键需要连接两次,比如从下方窗口移动
  108. "光标到上方窗口,需要<c-w><c-w>k,非常麻烦,现在重映射为<c-k>,切换的
  109. "时候会变得非常方便.
  110. nnoremap <C-h> <C-w>h
  111. nnoremap <C-j> <C-w>j
  112. nnoremap <C-k> <C-w>k
  113. nnoremap <C -l> <C-w>l
  114. " set fileformats=unix,dos,mac
  115. nmap <leader>fd :se fileformat=dos<CR>
  116. nmap <leader>fu :se fileformat=unix<CR>
  117. " use Ctrl+[l|n|p|cc] to list|next|previous|jump to count the result
  118. " map <C-x>l <ESC>:cl<CR>
  119. " map <C-x>n <ESC>:cn<CR>
  120. " map <C-x>p <ESC>:cp<CR>
  121. " map <C-x>c <ESC>:cc<CR>
  122. " Python 文件的一般设置,比如不要 tab 等
  123. autocmd FileType python set tabstop=4 shiftwidth=4 expandtab
  124. autocmd FileType python map <F12> :!python %<CR>
  125. " 选中状态下 Ctrl+c 复制
  126. "vmap <C-c> "+y
  127. "十六进制显示文件
  128. nmap <leader>H :%!xxd<CR>
  129. "二进制显示文件
  130. nmap <leader>B :%!xxd -r<CR>
  131. "******************************************************************************************************************
  132. set rtp+=~/.vim/bundle/Vundle.vim
  133. call vundle#begin()
  134. filetype plugin indent on " 必须加载vim自带和插件相应的语法和文件类型相关脚本
  135. "vim包管理工具
  136. Plugin 'gmarik/Vundle.vim'
  137. "文件目录增加git 状态
  138. Plugin 'Xuyuanp/nerdtree-git-plugin'
  139. "tab智能补全
  140. Plugin 'ervandew/supertab'
  141. "代码可视化缩进块
  142. Plugin 'yggdroot/indentline'
  143. let g:indentLine_enabled = 1
  144. let g:indentLine_color_term = 230
  145. "let g:indentLine_char_list = ['|', '¦', '┆', '┊','|'] 会出现光标的错行,慎用
  146. let g:indentLine_char_list = ['|', '¦', '¦', '¦']
  147. "彩虹括号
  148. Plugin 'kien/rainbow_parentheses.vim'
  149. "真彩色
  150. Plugin 'tpope/vim-sensible'
  151. "git左边栏增删改提示
  152. Plugin 'airblade/vim-gitgutter'
  153. Plugin 'altercation/solarized'
  154. Plugin 'altercation/vim-colors-solarized' "solarized
  155. let g:solarized_termtrans = 1 " 使用 termnal 背景
  156. let g:solarized_visibility = "high" " 使用 :set list 显示特殊字符时的高亮级别
  157. " GUI 模式浅色背景,终端模式深色背景
  158. if has( 'gui_running')
  159. set background=light
  160. else
  161. set background=dark
  162. endif
  163. " 主题设置为 solarized
  164. "colorscheme solarized
  165. "文件目录分屏
  166. Plugin 'scrooloose/nerdtree'
  167. let NERDTreeHighlightCursorline = 1 " 高亮当前行
  168. let NERDTreeShowLineNumbers = 1 " 显示行号
  169. " 忽略列表中的文件
  170. let NERDTreeIgnore = [ '\.pyc$', '\.pyo$', '\.obj$', '\.o$', '\.egg$', '^\.git$', '^\.repo$', '^\.svn$', '^\.hg$' ]
  171. " 启动 vim 时打开 NERDTree
  172. "autocmd vimenter * NERDTree
  173. " 当打开 VIM,没有指定文件时和打开一个目录时,打开 NERDTree
  174. "autocmd StdinReadPre * let s:std_in = 1
  175. "autocmd VimEnter * if argc() == 0 && !exists("s:std_in ") | NERDTree | endif
  176. "autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists( "s:std_in") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif
  177. " 关闭 NERDTree,当没有文件打开的时候
  178. "autocmd bufenter * if (winnr( "$") == 1 && exists( "b:NERDTreeType") && b:NERDTreeType == "primary") | q | end
  179. " <leader>nt 打开 nerdtree 窗口,在左侧栏显示
  180. map <leader>nt :NERDTreeToggle<CR>
  181. " <leader>tc 关闭当前的 tab
  182. map <leader>tc :tabc<CR>
  183. " <leader>to 关闭所有其他的 tab
  184. map <leader>to :tabo<CR>
  185. " <leader>ts 查看所有打开的 tab
  186. map <leader>ts :tabs<CR>
  187. " <leader>tp 前一个 tab
  188. map <leader>tp :tabp<CR>
  189. " <leader>tn 后一个 tab
  190. map <leader>tn :tabn<CR
  191. "tagbar
  192. Plugin 'majutsushi/tagbar'
  193. let g:tagbar_ctags_bin = 'ctags' " tagbar 依赖 ctags 插件
  194. let g:tagbar_width = 30 " 设置 tagbar 的宽度为 30 列,默认 40 列
  195. let g:tagbar_autofocus = 1 " 打开 tagbar 时光标在 tagbar 页面内,默认在 vim 打开的文件内
  196. let g:tagbar_left = 1 " 让 tagbar 在页面左侧显示,默认右边
  197. " let g:tagbar_sort = 0 " 标签不排序,默认排序
  198. " <leader>tb 打开 tagbar 窗口,在左侧栏显示
  199. map <leader>tb :TagbarToggle<CR>
  200. "taglist
  201. Plugin 'vim-scripts/taglist.vim'
  202. let Tlist_Show_One_File = 1 " 只显示当前文件的tags
  203. let Tlist_GainFocus_On_ToggleOpen = 1 " 打开 Tlist 窗口时,光标跳到 Tlist 窗口
  204. let Tlist_Exit_OnlyWindow = 1 " 如果 Tlist 窗口是最后一个窗口则退出 Vim
  205. let Tlist_Use_Left_Window = 1 " 在左侧窗口中显示
  206. let Tlist_File_Fold_Auto_Close = 1 " 自动折叠
  207. let Tlist_Auto_Update = 1 " 自动更新
  208. " <leader>tl 打开 Tlist 窗口,在左侧栏显示
  209. map <leader>tl :TlistToggle<CR>
  210. "winmanager
  211. Plugin 'vim-scripts/winmanager'
  212. let g:NERDTree_title="[NERDTree] "
  213. " let g:winManagerWindowLayout= "TagList|NERDTree"
  214. let g:winManagerWindowLayout= 'FileExplorer|TagList'
  215. function! NERDTree_Start()
  216. exec 'NERDTree'
  217. endfunction
  218. function! NERDTree_IsValid()
  219. return 1
  220. endfunction
  221. nmap wm :WMToggle<CR>
  222. "powerline fonts
  223. Plugin 'powerline/powerline-fonts'
  224. "状态栏
  225. Plugin 'vim-airline/vim-airline'
  226. Plugin 'vim-airline/vim-airline-themes'
  227. let g:airline_powerline_fonts = 1 " 使用powerline打过补丁的字体
  228. if !exists('g:airline_symbols')
  229. let g:airline_symbols = {}
  230. endif
  231. " 关闭当前 buffer
  232. "noremap <C-x> :w<CR>:bd<CR>
  233. "<leader>1~9 切到 buffer1~9
  234. map <leader>1 :b 1<CR>
  235. map <leader>2 :b 2<CR>
  236. map <leader>3 :b 3<CR>
  237. map <leader>4 :b 4<CR>
  238. map <leader>5 :b 5<CR>
  239. map <leader>6 :b 6<CR>
  240. map <leader>7 :b 7<CR>
  241. map <leader>8 :b 8<CR>
  242. map <leader>9 :b 9<CR>
  243. "Vim 在与屏幕/键盘交互时使用的编码(取决于实际的终端的设定)
  244. set encoding=utf-8
  245. set langmenu=zh_CN.UTF-8
  246. " 设置打开文件的编码格式
  247. set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
  248. set fileencoding=utf-8
  249. " 解决菜单乱码
  250. source $VIMRUNTIME/delmenu.vim
  251. source $VIMRUNTIME/menu.vim
  252. " 解决consle输出乱码
  253. "set termencoding = cp936
  254. " 设置中文提示
  255. language messages zh_CN.utf-8
  256. " 设置中文帮助
  257. set helplang=cn
  258. " 设置为双字宽显示,否则无法完整显示如:☆
  259. set ambiwidth=double
  260. " 总是显示状态栏
  261. let laststatus = 2
  262. let g:airline_theme='solarized' " 设置主题,simple、dark、solarized、bubblegum 详见.vim/bundle/vim-airline-themes
  263. " 开启tabline
  264. let g:airline#extensions#tabline#enabled = 1 "tabline中当前
  265. let g:airline #extensions#tabline#left_sep = ' ' "buffer两端的分隔字符
  266. let g:airline #extensions#tabline#left_alt_sep = '|' "tabline中
  267. let g:airline #extensions#tabline#buffer_nr_show = 1 "buffer显示编号
  268. let g:airline_left_sep = ' '
  269. let g:airline_left_alt_sep = '▶'
  270. let g:airline_right_sep = ' '
  271. let g:airline_right_alt_sep = '◀'
  272. let g:airline_symbols.crypt = '🔒'
  273. let g:airline_symbols.linenr = '¶'
  274. let g:airline_symbols.maxlinenr = '㏑'
  275. let g:airline_symbols.branch = '⎇'
  276. let g:airline_symbols.paste = 'ρ'
  277. let g:airline_symbols.spell = 'Ꞩ'
  278. let g:airline_symbols.notexists = 'Ɇ'
  279. let g:airline_symbols.whitespace = 'Ξ'
  280. " 映射切换buffer的键位
  281. nnoremap [b :bp<CR>
  282. nnoremap ]b :bn<CR>
  283. " 设置字体
  284. set guifont=Powerline_Consolas:h14:cANSI
  285. Plugin 'enricobacis/vim-airline-clock'
  286. "let g:airline#extensions#clock#auto = 0 关闭
  287. let g:airline#extensions#clock#format = '%H:%M:%S'
  288. " "代码动态检查(使用YCM自带的即可)
  289. "Plugin 'w0rp/ale'
  290. " let g:ale_lint_on_text_changed = 'normal' " 代码更改后启动检查
  291. " let g:ale_lint_on_insert_leave = 1 " 退出插入模式即检查
  292. " let g:ale_sign_column_always = 1 " 总是显示动态检查结果
  293. " " let g:ale_statusline_format = [ '✗ %d', '⚡%d', '✔ OK']
  294. " let g:ale_sign_error = '>>' " error 告警符号
  295. " let g:ale_sign_warning = '--' " warning 告警符号
  296. " let g:ale_echo_msg_error_str = 'E' " 错误显示字符
  297. " let g:ale_echo_msg_warning_str = 'W' " 警告显示字符
  298. " let g:ale_echo_msg_format = '[%linter%] %s [%severity%]' " 告警显示格式
  299. "
  300. " " C 语言配置检查参数
  301. " let g:ale_c_gcc_options = '-Wall -Werror -O2 -std=c11'
  302. " let g:ale_c_clang_options = '-Wall -Werror -O2 -std=c11'
  303. " let g:ale_c_cppcheck_options = ''
  304. " " C++ 配置检查参数
  305. " let g:ale_cpp_gcc_options = '-Wall -Werror -O2 -std=c++14'
  306. " let g:ale_cpp_clang_options = '-Wall -Werror -O2 -std=c++14'
  307. " let g:ale_cpp_cppcheck_options = ''
  308. "
  309. " "使用clang对c和c++进行语法检查,对python使用pylint进行语法检查
  310. " let g:ale_linters = { 'c++': ['clang', 'gcc'] }
  311. " " <F9> 触发/关闭代码动态检查
  312. " map <F9> :ALEToggle<CR>
  313. " "普通模式下,ak 前往上一个错误或警告,aj 前往下一个错误或警告
  314. " nmap ak <Plug>(ale_previous_wrap)
  315. " nmap aj <Plug>(ale_next_wrap)
  316. " " ad 查看错误或警告的详细信息
  317. " nmap ad :ALEDetail<CR>
  318. "模糊查找文件,ctrl+p
  319. Plugin 'ctrlp/ctrlp.vim'
  320. "git log与code对应
  321. "Plugin 'vim-fugitive'
  322. "显示文件修改痕迹
  323. Plugin 'chrisbra/changesPlugin'
  324. "Plugin 'bufexplorer'
  325. "浏览最近打开的文件
  326. Plugin 'vim-startify'
  327. "撤销
  328. Plugin 'Gundo'
  329. nnoremap <leader>u :GundoToggle<CR>
  330. "恢复上次关闭时所打开的文件
  331. "Plugin 'Sessionman'
  332. "set sessionoptions=blank,buffers,curdir,folds,tabpages,winsize
  333. "nmap <leader>sl :SessionList<CR>
  334. "nmap <leader>ss :SessionSave<CR>
  335. "nmap <leader>sc :SessionClose<CR>
  336. "Plugin 'Powerline'
  337. "Plugin 'rainbow_parentheses'
  338. Plugin 'ludovicchabant/vim-gutentags'
  339. "gutentags搜索工程目录的标志,碰到这些文件/目录名就停止向上一级目录递归
  340. let g:gutentags_project_root = ['.root', '.svn', '.git', '.project']
  341. " 所生成的数据文件的名称 "
  342. let g:gutentags_ctags_tagfile = '.tags'
  343. " 将自动生成的 tags 文件全部放入 ~/.cache/tags 目录中,避免污染工程目录 "
  344. let s:vim_tags = expand('~/.cache/tags')
  345. let g:gutentags_cache_dir = s:vim_tags
  346. " 检测 ~/.cache/tags 不存在就新建 "
  347. if !isdirectory(s:vim_tags)
  348. silent! call mkdir(s:vim_tags, 'p')
  349. endif
  350. " 配置 ctags 的参数 "
  351. let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
  352. let g:gutentags_ctags_extra_args += ['--c++-kinds=+pxI']
  353. let g:gutentags_ctags_extra_args += ['--c-kinds=+px']
  354. Plugin 'skywind3000/gutentags_plus'
  355. " gutentags搜索工程目录的标志,碰到这些文件/目录名就停止向上一级目录递归
  356. " let g:gutentags_project_root = ['.root', '.svn', '.git', '.project']
  357. " 所生成的数据文件的名称 "
  358. let g:gutentags_ctags_tagfile = '.tags'
  359. " 将自动生成的 tags 文件全部放入 ~/.cache/tags 目录中,避免污染工程目录
  360. let s:vim_tags = expand( '~/.cache/tags')
  361. let g:gutentags_cache_dir = s:vim_tags
  362. " 检测 ~/.cache/tags 不存在就新建 "
  363. if !isdirectory(s:vim_tags)
  364. silent! call mkdir(s:vim_tags, 'p')
  365. endif
  366. " 配置 ctags 的参数 "
  367. let g:gutentags_ctags_extra_args = [ '--fields=+niazS', '--extra=+q']
  368. let g:gutentags_ctags_extra_args += [ '--c++-kinds=+pxI']
  369. "let g:gutentags_ctags_extra_args += ['--c-kinds=+px']
  370. "json viewer
  371. Plugin 'elzr/vim-json'
  372. " vim script library 用法详见src
  373. Plugin 'L9'
  374. "在needtree中显示文件图标
  375. Plugin 'ryanoasis/vim-devicons'
  376. "c++ 语法高亮
  377. Plugin 'octol/vim-cpp-enhanced-highlight'
  378. " let g:cpp_class_scope_highlight = 1
  379. "let g:cpp_member_variable_highlight = 1
  380. " let g:cpp_class_decl_highlight = 1
  381. "let g:cpp_posix_standard = 1
  382. " let g:cpp_experimental_simple_template_highlight = 1
  383. "let g:cpp_experimental_template_highlight = 1
  384. " let g:cpp_concepts_highlight = 1
  385. "let g:cpp_no_function_highlight = 1
  386. "switch .h <->.cpp
  387. "Plugin 'a.vim'
  388. "查找文件
  389. Plugin 'junegunn/fzf'
  390. ":FZF 从当前目录查找
  391. ":FZF ~ 从home目录查找
  392. nmap <leader>f :FZF ~<CR>
  393. nmap <leader>F :FZF<CR>
  394. "查找
  395. Plugin 'FuzzyFinder'
  396. ":FufBuffer| - Buffer mode (|fuf-buffer-mode|)
  397. ":FufFile| - File mode (|fuf-file-mode|)
  398. ":FufCoverageFile| - Coverage-File mode (|fuf-coveragefile-mode|)
  399. ":FufDir| - Directory mode (|fuf-dir-mode|)
  400. ":FufMruFile| - MRU-File mode (|fuf-mrufile-mode|)
  401. ":FufMruCmd| - MRU-Command mode (|fuf-mrucmd-mode|)
  402. ":FufBookmarkFile| - Bookmark-File mode (|fuf-bookmarkfile-mode|)
  403. ":FufBookmarkDir| - Bookmark-Dir mode (|fuf-bookmarkdir-mode|)
  404. ":FufTag| - Tag mode (|fuf-tag-mode|)
  405. ":FufBufferTag| - Buffer-Tag mode (|fuf-buffertag-mode|)
  406. ":FufTaggedFile| - Tagged-File mode (|fuf-taggedfile-mode|)
  407. ":FufJumpList| - Jump-List mode (|fuf-jumplist-mode|)
  408. ":FufChangeList| - Change-List mode (|fuf-changelist-mode|)
  409. ":FufQuickfix| - Quickfix mode (|fuf-quickfix-mode|)
  410. ":FufLine| - Line mode (|fuf-line-mode|)
  411. ":FufHelp| - Help mode (|fuf-help-mode|)
  412. "doc
  413. Plugin 'DoxygenToolkit.vim'
  414. ":Dox
  415. ":DoxAuthor
  416. ":DoxBlock
  417. ":DoxLic
  418. "draw txt graph
  419. Plugin 'DrawIt'
  420. "\di start
  421. "\ds stop
  422. " "bookmarks
  423. "Plugin 'mattesgroeger/vim-bookmarks'
  424. " highlight BookmarkSign ctermbg=NONE ctermfg=160
  425. " highlight BookmarkLine ctermbg=NONE ctermfg=NONE
  426. " let g:bookmark_sign = '♥'
  427. " let g:bookmark_highlight_lines = 1
  428. " nmap <leader><leader> <Plug>BookmarkToggle
  429. " nmap <leader>i <Plug>BookmarkAnnotate
  430. " nmap <leader>a <Plug>BookmarkShowAll
  431. " nmap <leader>j <Plug>BookmarkNext
  432. " nmap <leader>k <Plug>BookmarkPrev
  433. " nmap <leader>c <Plug>BookmarkClear
  434. " nmap <leader>x <Plug>BookmarkClearAll
  435. " nmap <leader>kk <Plug>BookmarkMoveUp
  436. " nmap <leader>jj <Plug>BookmarkMoveDown
  437. " nmap <leader>g <Plug>BookmarkMoveToLine
  438. "highlighting for Google's Protocol Buffers
  439. "Plugin 'uarun/vim-protobuf'
  440. "显示所有的leader映射
  441. Plugin 'hecal3/vim-leader-guide'
  442. ":LeaderGuide '\'
  443. "cmake
  444. Plugin 'jansenm/vim-cmake'
  445. "Plugin 'ihacklog/hicursorwords'
  446. " let g:HiCursorWords_delay = 200
  447. " let g:HiCursorWords_hiGroupRegexp = ''
  448. " let g:HiCursorWords_debugEchoHiName = 0
  449. " "语法检查(使用YCM自带的即可)
  450. "Plugin 'scrooloose/syntastic'
  451. " set statusline+=%#warningmsg#
  452. " set statusline+=%{SyntasticStatuslineFlag()}
  453. " set statusline+=%*
  454. " let g:syntastic_always_populate_loc_list = 1
  455. " let g:syntastic_auto_loc_list = 0
  456. " let g:syntastic_check_on_open = 1
  457. " let g:syntastic_check_on_wq = 0
  458. " let g:syntastic_cpp_checkers = [ 'gcc']
  459. " let g:syntastic_cpp_compiler = 'g++'
  460. " let g:syntastic_cpp_compiler_options = '-std=c++11 -stdlib=libc++'
  461. " " if !exists( 'g:syntastic_cpp_compiler_options')
  462. " " let g:syntastic_cpp_compiler_options = ' -std=c++11 -lstdc++ '
  463. " "endif
  464. "注释
  465. Plugin 'scrooloose/nerdcommenter'
  466. "\cc 注释
  467. " Add spaces after comment delimiters by default
  468. let g:NERDSpaceDelims = 1
  469. " Use compact syntax for prettified multi-line comments
  470. let g:NERDCompactSexyComs = 1
  471. " Align line-wise comment delimiters flush left instead of following code indentation
  472. let g:NERDDefaultAlign = 'left'
  473. " Set a language to use its alternate delimiters by default
  474. let g:NERDAltDelims_java = 1
  475. " Add your own custom formats or override the defaults
  476. let g:NERDCustomDelimiters = { 'c': { 'left': '/**','right': '*/' } }
  477. " Allow commenting and inverting empty lines (useful when commenting a region)
  478. let g:NERDCommentEmptyLines = 1
  479. " Enable trimming of trailing whitespace when uncommenting
  480. let g:NERDTrimTrailingWhitespace = 1
  481. " Enable NERDCommenterToggle to check all selected lines is commented or not
  482. let g:NERDToggleCheckAllLines = 1
  483. "Plugin 'tpope/surround-vim'
  484. "Plugin 'Valloric/YouCompleteMe'
  485. "往前跳和往后跳的快捷键为Ctrl+O以及Ctrl+I
  486. let g:ycm_key_list_select_completion=['<c-n>']
  487. let g:ycm_key_list_previous_completion=['<c-p>']
  488. set completeopt=menu "关闭preview window
  489. "let g:ycm_add_preview_to_completeopt =0
  490. " let g:ycm_autoclose_preview_window_after_completion=1
  491. "let g:ycm_autoclose_preview_window_after_insertion=1
  492. " let g:ycm_always_populate_location_list = 0
  493. let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
  494. let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎
  495. let g:ycm_min_num_of_chars_for_completion=1 " 从第1个键入字符就开始罗列匹配项
  496. let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项,每次都重新生成匹配项
  497. let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
  498. nnoremap <F5> :YcmForceCompileAndDiagnostics<CR> "force recomile with syntastic
  499. "nnoremap <leader>lo :lopen<CR> "open locationlist
  500. "nnoremap <leader>lc :lclose<CR> "close locationlist
  501. "inoremap <leader><leader> <C-x><C-o>
  502. let g:ycm_complete_in_comments = 1 "在注释输入中也能补全
  503. let g:ycm_complete_in_strings = 1 "在字符串输入中也能补全
  504. let g:ycm_collect_identifiers_from_comments_and_strings = 0 "注释和字符串中的文字也会被收入补全
  505. let g:ycm_max_num_identifier_candidates = 50
  506. let g:ycm_auto_trigger = 1
  507. let g:ycm_error_symbol = '>>'
  508. let g:ycm_warning_symbol = '>'
  509. "sub commands
  510. "YcmCompleter RefactorRename :重命名
  511. "YcmCompleter GoToSymbol
  512. nnoremap <leader>go :YcmCompleter GoTo<CR> "跳转
  513. nnoremap <leader>gd :YcmCompleter GoToDefinitionElseDeclaration<CR> "跳转到定义或声明
  514. nnoremap <leader>gt :YcmCompleter GetType<CR> "get类型
  515. nmap gi :YcmCompleter GoToInclude<CR> "跳转到include、声明或定义
  516. nmap gm :YcmCompleter GoToImprecise<CR> "跳转到实现
  517. nmap gr :YcmCompleter GoToReferences<CR> "跳转到引用
  518. nmap fi :YcmCompleter FixIt<CR> "根据Ycm的建议修复错误
  519. nnoremap <F6> :YcmForceCompileAndDiagnostics<CR> "重新编译和诊断
  520. "nmap <F4> :YcmDiags<CR> "F4进行诊断
  521. "nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR> "跳转到声明
  522. "nnoremap <leader>gf :YcmCompleter GoToDefinition<CR> "跳转到定义
  523. "highlight Pmenu ctermfg=4 ctermbg=0 guifg= #ffffff guibg=#000000 "提示不再是粉红色(pink)
  524. highlight Pmenu ctermfg=4 ctermbg=8 guifg= #ffffff guibg=#000000 "提示不再是粉红色(pink)
  525. call vundle #end()

保存后,重新打开vim,执行 vundle的安装命令:PluginInstall,如下图所示:

       

   至此,完成了vim常用插件的安装,接入来安装号称最复杂的插件ycm。

四、安装和配置ycm

           1、进入插件目录:cd ~/.vim/bundle

            2、下载ycm:git clone https://github.com/ycm-core/YouCompleteMe.git

            3、更新依赖模块:git submodule update --init --recursive

            4、安装:./install.py --clangd-completer   # --all  安装所有支持的补全(目前最新版本的YCM已经不需要额外下载llvm+clang来编译了),编译完成后的结果如下图所示:

比以前方便了很多,clang已经放到了.vim/bundle/YouCompleteMe/third_party/ycmd/third_party/clangd/output/bin目录了,并且已经启用了,不需要再配置复杂的.ycm_extra_conf.py文件了

关于YCM的说明、配置都在:https://github.com/ycm-core/YouCompleteMe#c-family-semantic-completion

你可以找到任何关于ycm的信息,不过可能需要花一点时间。

               5、在vim中安装ycm插件:

                       打开.vimrc文件,找到”Plugin 'Valloric/YouCompleteMe'  #把前面的"删除,然后重新安装:PluginInstall

               6、打开的时候可能会报错:

                     1、YouCompleteMe unavailable: unable to load Python.

                       解决办法:sudo yum install vim-gtk-syntax    安装完成后,重新启动vim即可解决(如果解决不了请联系我)

                     2、找不到ctags

                       解决办法:sudo yum install ctags

                     3、_socket.cpython-38-x86_64-linux-gnu.so: undefined symbol: PyFloat_Type

                      分析:这不是vim的问题,也不是ycm的问题,而是python的问题,在命令行运行python3,然后import ctypes必然会报错。

                      解决办法:

                                    1、安装:yum install libffi-devel gcc gcc-c++ zlib zlib-devel readline-devel openssl-devel bzip2-devel sqlite-devel

                                    2、返回第一步,重新安装python,在命令行打开python3,然后import ctypes  #如果不报错,那就解决了。

       至此,ycm插件安装完成了,比前几年安装简单太多了。

      其实,到这一步,如果没有错误的话,vim+ycm已经可以支持代码补全了(只是部分的补全哟,目前还补全不了c++工程中的基础库、依赖的第三方库,如:boost、libevent等)

 

五、让vim支持语议补全——补全工程上下文、补全第三方依赖库

        1、介绍一下ycm补全的实现及功能:YCM的补全功能,使用的是clangd(clangd与libclang完全不同,请自行百度)的基于语义分析来进行补全的,如下文:

              


  
  1. Advantages of clangd over libclang include:
  2. 1、Project wide indexing: Clangd has both dynamic and static index support. The dynamic index stores up-to-date symbols coming from any files you are currently editing, whereas static index contains project-wide symbol information. This symbol information is used for code completion and code navigation. Whereas libclang is limited to the current translation unit(TU).
  3. 2、Code navigation: Clangd provides all the GoTo requests libclang provides and it improves those using the above mentioned index information to contain project-wide information rather than just the current TU.
  4. Rename: Clangd can perform semantic rename operations on the current file, whereas libclang doesn’t support such functionality.
  5. 3、Code Completion: Clangd can perform code completions at a lower latency than libclang; also, it has information about all the symbols in your project so it can suggest items outside your current TU and also provides proper #include insertions for those items.
  6. Signature help: Clangd provides signature help so that you can see the names and types of arguments when calling functions.
  7. 4、Format Code: Clangd provides code formatting either for the selected lines or the whole file, whereas libclang doesn’t have such functionality.
  8. Performance: Clangd has faster reparse and code completion times compared to libclang.
  9. In order to perform semantic analysis such as code completion, GoTo and diagnostics, YouCompleteMe uses clangd, which makes use of clang compiler, sometimes also referred to as llvm. Like any compiler, clang also requires a set of compile flags in order to parse your code. Simply put: If clang can 't parse your code, YouCompleteMe can't provide semantic analysis.

        上文中最后一句:Simply put: If clang can't parse your code, YouCompleteMe can't provide semantic analysis.非常重要,如果clangd不能分析你的代码,YCM就不能提供基于语议的补全

当安装了vim(+python3)+YCM+clangd时,使用vim打开工程的.h、.cpp时,clangd会根据打开的文件进行语议猜测,然后进行提示,但是,猜测”一般是不可靠的所以:


  
  1. There are 2 methods which can be used to provide compile flags to clang:
  2. Option 1: Use a compilation database
  3. The easiest way to get YCM to compile your code is to use a compilation database. A compilation database is usually generated by your build system (e.g. CMake) and contains the compiler invocation for each compilation unit in your project.
  4. For information on how to generate a compilation database, see the clang documentation. In short:
  5. If using CMake, add -DCMAKE_EXPORT_COMPILE_COMMANDS=ON when configuring (or add set( CMAKE_EXPORT_COMPILE_COMMANDS ON ) to CMakeLists.txt) and copy or symlink the generated database to the root of your project.
  6. If using Ninja, check out the compdb tool (-t compdb) in its docs.
  7. If using GNU make, check out compiledb or Bear.
  8. For other build systems, check out .ycm_extra_conf.py below.
  9. If no .ycm_extra_conf.py is found, YouCompleteMe automatically tries to load a compilation database if there is one.
  10. YCM looks for a file named compile_commands.json in the directory of the opened file or in any directory above it in the hierarchy (recursively); when the file is found before a local .ycm_extra_conf.py, YouCompleteMe stops searching the directories and lets clangd take over and handle the flags.

clangd支持多种生成”补全数据库“的方式,如上面提到的,基于cmake、Ninja、GNU make;

如果使用的是cmake的构建方式,则有两种生成”补全数据库“的方式:

第一种:在工程根目录执行:cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -DCMAKE_BUILD_TYPE=Debug

              执行完成后,就会在工程根目录生成“compile_commands.json"文件。

              然后使用vim重新打开工程中的文件(只要你的CMakeLists.txt配置正确),就不会报找不到第三库、依赖库的错误了

第二种:在工程的顶层CMakeLists.txt中,增加配置:set( CMAKE_EXPORT_COMPILE_COMMANDS ON )

               即可在reload 或构建的时候,自动生成compile_commands.json文件"

*********************本人选用的是第二种模式,构建的时候会自动生成compile_commands.json文件。********************

更详细的请参见:

1、http://clangd.llvm.org/installation.html

2、https://github.com/ycm-core/YouCompleteMe#c-family-semantic-completion

如果没有使用CMake、Ninja、GNU Make,则需要使用.ycm_extra_conf.py文件配置flags了,(曾经配置过,个人不建议使用这种方法,并且效率也不高,在ycm官网的文档中有说明,所以不作介绍了)


  
  1. Option 2: Provide the flags manually
  2. If you don 't have a compilation database, or aren't able to generate one, you have to tell YouCompleteMe how to compile your code some other way.
  3. Every C-family project is different. It is not possible for YCM to guess what compiler flags to supply for your project. Fortunately, YCM provides a mechanism for you to generate the flags for a particular file with arbitrary complexity. This is achieved by requiring you to provide a Python module which implements a trivial function which, given the file name as argument, returns a list of compiler flags to use to compile that file.
  4. YCM looks for a .ycm_extra_conf.py file in the directory of the opened file or in any directory above it in the hierarchy (recursively); when the file is found, it is loaded (only once!) as a Python module. YCM calls a Settings method in that module which should provide it with the information necessary to compile the current file. You can also provide a path to a global configuration file with the g:ycm_global_ycm_extra_conf option, which will be used as a fallback. To prevent the execution of malicious code from a file you didn 't write YCM will ask you once per .ycm_extra_conf.py if it is safe to load. This can be disabled and you can white-/blacklist files. See the g:ycm_confirm_extra_conf and g:ycm_extra_conf_globlist options respectively.
  5. This system was designed this way so that the user can perform any arbitrary sequence of operations to produce a list of compilation flags YCM should hand to Clang.
  6. NOTE: It is highly recommended to include -x <language> flag to libclang. This is so that the correct language is detected, particularly for header files. Common values are -x c for C, -x c++ for C++, -x objc for Objective-C, and -x cuda for CUDA.
  7. To give you an impression, if your C++ project is trivial, and your usual compilation command is: g++ -Wall -Wextra -Werror -o FILE.o FILE.cc, then the following .ycm_extra_conf.py is enough to get semantic analysis from YouCompleteMe:
  8. def Settings( **kwargs ):
  9. return {
  10. 'flags ': [ '-x ', 'c++ ', '-Wall ', '-Wextra ', '-Werror ' ],
  11. }
  12. As you can see from the trivial example, YCM calls the Settings method which returns a dictionary with a single element 'flags '. This element is a list of compiler flags to pass to libclang for the current file. The absolute path of that file is accessible under the filename key of the kwargs dictionary. That's it! This is actually enough for most projects, but for complex projects it is not uncommon to integrate directly with an existing build system using the full power of the Python language.
  13. For a more elaborate example, see ycmd 's own .ycm_extra_conf.py. You should be able to use it as a starting point. Don't just copy/paste that file somewhere and expect things to magically work; your project needs different flags. Hint: just replace the strings in the flags variable with compilation flags necessary for your project. That should be enough for 99% of projects.
  14. You could also consider using YCM-Generator to generate the ycm_extra_conf.py file.
  15. Errors during compilation
  16. If Clang encounters errors when compiling the header files that your file includes, then it 's probably going to take a long time to get completions. When the completion menu finally appears, it's going to have a large number of unrelated completion strings ( type/ function names that are not actually members). This is because Clang fails to build a precompiled preamble for your file if there are any errors in the included headers and that preamble is key to getting fast completions.
  17. Call the :YcmDiags command to see if any errors or warnings were detected in your file.

六、最终的效果图

下面是关于第三方库的补全:

七、最终的vim配置文件 :


  
  1. "/**
  2. "* @file .vimrc
  3. "* @brief vimrc
  4. "* @author shlian
  5. "* @version 1.1.0
  6. "* @date 2020-09-21
  7. "*/
  8. set nocompatible " 关闭 vi 兼容模式
  9. set smartindent "当在大括号中间回车的时候,他会智能缩进,因为他知道括号中间要缩进
  10. set tabstop=4
  11. set shiftwidth=4
  12. set expandtab
  13. syntax on " 自动语法高亮
  14. set number " 显示行号
  15. "设置代码参考线
  16. highlight ColorColumn ctermbg=darkgray
  17. set colorcolumn=140
  18. set t_ti= t_te= "关闭vim后,vim的内容依然显示在terminal上
  19. " 高亮显示当前行
  20. set cursorline
  21. "red(红),white(白),black(黑),green(绿),yellow(黄),blue(蓝),purple(紫),gray(灰),brown(棕),tan(褐色),syan(青色)
  22. hi CursorLine cterm=NONE ctermbg=darkgray ctermfg=NONE
  23. "hi CursorColumn cterm=NONE ctermbg=darkred ctermfg=white
  24. set ruler " 打开状态栏标尺
  25. set shiftwidth=4 " 设定 << 和 >> 命令移动时的宽度为 4
  26. set softtabstop=4 " 使得按退格键时可以一次删掉 4 个空格
  27. set tabstop=4 " 设定 tab 长度为 4
  28. set nobackup " 覆盖文件时不备份
  29. " set autochdir " 自动切换当前目录为当前文件所在的目录
  30. set backupcopy=yes " 设置备份时的行为为覆盖
  31. set ignorecase smartcase " 搜索时忽略大小写,但在有一个或以上大写字母时仍保持对大小写敏感
  32. " set nowrapscan " 禁止在搜索到文件两端时重新搜索
  33. set incsearch " 输入搜索内容时就显示搜索结果
  34. set hlsearch " 搜索时高亮显示被找到的文本
  35. set noerrorbells " 关闭错误信息响铃
  36. set novisualbell " 关闭使用可视响铃代替呼叫
  37. set t_vb= " 置空错误铃声的终端代码
  38. set showmatch " 插入括号时,短暂地跳转到匹配的对应括号
  39. " set matchtime=2 " 短暂跳转到匹配括号的时间
  40. set magic " 设置魔术
  41. set hidden " 允许在有未保存的修改时切换缓冲区,此时的修改由 vim 负责保存
  42. set guioptions-=T " 隐藏工具栏
  43. set guioptions-=m " 隐藏菜单栏
  44. set smartindent " 开启新行时使用智能自动缩进
  45. set backspace=indent,eol,start
  46. " 不设定在插入状态无法用退格键和 Delete 键删除回车符
  47. set cmdheight=1 " 设定命令行的行数为 1
  48. set laststatus=2 " 显示状态栏 (默认值为 1, 无法显示状态栏)
  49. set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
  50. " 设置在状态行显示的信息
  51. set foldenable " 开启折叠
  52. " set foldmethod=syntax " 设置语法折叠************************
  53. set foldcolumn=0 " 设置折叠区域的宽度
  54. setlocal foldlevel=1 " 设置折叠层数为
  55. " set foldclose=all " 设置为自动关闭折叠
  56. nnoremap <space> @=((foldclosed(line('.')) < 0) ? 'zc' : 'zo')<CR>
  57. " 用空格键来开关折叠
  58. " return OS type, eg: windows, or linux, mac, et.st..
  59. function! MySys()
  60. if has("win16 ") || has("win32 ") || has("win64 ") || has("win95 ")
  61. return "windows "
  62. elseif has("unix ")
  63. return "linux "
  64. endif
  65. endfunction
  66. " 用户目录变量 $VIMFILES
  67. if MySys() == "windows"
  68. let $VIMFILES = $VIM. '/vimfiles'
  69. elseif MySys() == "linux"
  70. let $VIMFILES = $HOME. '/.vim'
  71. endif
  72. " 设定doc文档目录
  73. let helptags=$VIMFILES.'/doc'
  74. " 设置字体 以及中文支持
  75. if has( "win32")
  76. set guifont=Inconsolata:h12:cANSI
  77. endif
  78. " 配置多语言环境
  79. if has("multi_byte ")
  80. " UTF-8 编码
  81. set encoding=utf-8
  82. set termencoding=utf-8
  83. set formatoptions+=mM
  84. set fencs=utf-8,gbk
  85. if v:lang =~? '^\(zh\)\|\(ja\)\|\(ko\)'
  86. set ambiwidth=double
  87. endif
  88. if has( "win32")
  89. source $VIMRUNTIME/delmenu.vim
  90. source $VIMRUNTIME/menu.vim
  91. language messages zh_CN.utf-8
  92. endif
  93. else
  94. echoerr "Sorry, this version of (g)vim was not compiled with +multi_byte"
  95. endif
  96. " Buffers操作快捷方式!
  97. "nnoremap <C-RETURN> :bnext<CR>
  98. "nnoremap <C-S-RETURN> :bprevious<CR>
  99. " Tab操作快捷方式!
  100. "nnoremap <C-TAB> :tabnext<CR>
  101. "nnoremap <C-S-TAB> :tabprev<CR>
  102. "关于tab的快捷键
  103. " nnoremap tn :tabnext<cr>
  104. " nnoremap tp :tabprevious<cr>
  105. " nnoremap td :tabnew .<cr>
  106. " nnoremap te :tabedit
  107. " nnoremap tc :tabclose<cr>
  108. "窗口分割时,进行切换的按键热键需要连接两次,比如从下方窗口移动
  109. "光标到上方窗口,需要<c-w><c-w>k,非常麻烦,现在重映射为<c-k>,切换的
  110. "时候会变得非常方便.
  111. nnoremap <C-h> <C-w>h
  112. nnoremap <C-j> <C-w>j
  113. nnoremap <C-k> <C-w>k
  114. nnoremap <C-l> <C-w>l
  115. " set fileformats=unix,dos,mac
  116. nnoremap <leader>fd :se fileformat=dos<CR>
  117. nnoremap <leader>fu :se fileformat=unix<CR>
  118. " use Ctrl+[l|n|p|cc] to list|next|previous|jump to count the result
  119. " nnoremap <C-x>l <ESC>:cl<CR>
  120. " nnoremap <C-x>n <ESC>:cn<CR>
  121. " nnoremap <C-x>p <ESC>:cp<CR>
  122. " nnoremap <C-x>c <ESC>:cc<CR>
  123. " Python 文件的一般设置,比如不要 tab 等
  124. autocmd FileType python set tabstop=4 shiftwidth=4 expandtab
  125. autocmd FileType python map <F12> :!python %<CR>
  126. " 选中状态下 Ctrl+c 复制
  127. "vmap <C-c> "+y
  128. "十六进制显示文件
  129. nnoremap <leader>H :%!xxd<CR>
  130. "二进制显示文件
  131. nnoremap <leader>B :%!xxd -r<CR>
  132. "******************************************************************************************************************
  133. set rtp+=~/.vim/bundle/Vundle.vim
  134. call vundle #begin()
  135. filetype plugin indent on " 必须加载vim自带和插件相应的语法和文件类型相关脚本
  136. "vim包管理工具
  137. Plugin 'gmarik/Vundle.vim'
  138. "文件目录增加git 状态
  139. Plugin 'Xuyuanp/nerdtree-git-plugin'
  140. "tab智能补全
  141. Plugin 'ervandew/supertab'
  142. "代码可视化缩进块
  143. Plugin 'yggdroot/indentline'
  144. let g:indentLine_enabled = 1
  145. let g:indentLine_color_term = 230
  146. " let g:indentLine_char_list = [ '|', '¦', '┆', '┊', '|'] 会出现光标的错行,慎用
  147. let g:indentLine_char_list = [ '|', '¦', '¦', '¦']
  148. "彩虹括号
  149. Plugin 'kien/rainbow_parentheses.vim'
  150. "真彩色
  151. Plugin 'tpope/vim-sensible'
  152. "git左边栏增删改提示
  153. Plugin 'airblade/vim-gitgutter'
  154. Plugin 'altercation/solarized'
  155. Plugin 'altercation/vim-colors-solarized' "solarized
  156. let g:solarized_termtrans = 1 " 使用 termnal 背景
  157. let g:solarized_visibility = "high " " 使用 : set list 显示特殊字符时的高亮级别
  158. " GUI 模式浅色背景,终端模式深色背景
  159. if has('gui_running')
  160. set background=light
  161. else
  162. set background=dark
  163. endif
  164. " 主题设置为 solarized
  165. "colorscheme solarized
  166. "文件目录分屏
  167. Plugin 'scrooloose/nerdtree'
  168. let NERDTreeHighlightCursorline = 1 " 高亮当前行
  169. let NERDTreeShowLineNumbers = 1 " 显示行号
  170. " 忽略列表中的文件
  171. let NERDTreeIgnore = [ '\.pyc$', '\.pyo$', '\.obj$', '\.o$', '\.egg$', '^\.git$', '^\.repo$', '^\.svn$', '^\.hg$' ]
  172. " 启动 vim 时打开 NERDTree
  173. "autocmd vimenter * NERDTree
  174. " 当打开 VIM,没有指定文件时和打开一个目录时,打开 NERDTree
  175. "autocmd StdinReadPre * let s:std_in = 1
  176. "autocmd VimEnter * if argc() == 0 && !exists( "s:std_in") | NERDTree | endif
  177. "autocmd VimEnter * if argc() == 1 && isdirectory(argv()[0]) && !exists("s:std_in ") | exe 'NERDTree' argv()[0] | wincmd p | ene | exe 'cd '.argv()[0] | endif
  178. " 关闭 NERDTree,当没有文件打开的时候
  179. "autocmd bufenter * if (winnr("$ ") == 1 && exists("b:NERDTreeType ") && b:NERDTreeType == "primary ") | q | end
  180. " <leader>nt 打开 nerdtree 窗口,在左侧栏显示
  181. nnoremap <leader>nt :NERDTreeToggle<CR>
  182. " <leader>tc 关闭当前的 tab
  183. nnoremap <leader>tc :tabc<CR>
  184. " <leader>to 关闭所有其他的 tab
  185. nnoremap <leader>to :tabo<CR>
  186. " <leader>ts 查看所有打开的 tab
  187. nnoremap <leader>ts :tabs<CR>
  188. " <leader>tp 前一个 tab
  189. nnoremap <leader>tp :tabp<CR>
  190. " <leader>tn 后一个 tab
  191. nnoremap <leader>tn :tabn<CR
  192. "tagbar
  193. Plugin 'majutsushi/tagbar'
  194. let g:tagbar_ctags_bin = 'ctags' " tagbar 依赖 ctags 插件
  195. let g:tagbar_width = 30 " 设置 tagbar 的宽度为 30 列,默认 40 列
  196. let g:tagbar_autofocus = 1 " 打开 tagbar 时光标在 tagbar 页面内,默认在 vim 打开的文件内
  197. let g:tagbar_left = 1 " 让 tagbar 在页面左侧显示,默认右边
  198. "let g:tagbar_sort = 0 " 标签不排序,默认排序
  199. " <leader>tb 打开 tagbar 窗口,在左侧栏显示
  200. nnoremap <leader>tb :TagbarToggle<CR>
  201. "taglist
  202. Plugin 'vim-scripts/taglist.vim'
  203. let Tlist_Show_One_File = 1 " 只显示当前文件的tags
  204. let Tlist_GainFocus_On_ToggleOpen = 1 " 打开 Tlist 窗口时,光标跳到 Tlist 窗口
  205. let Tlist_Exit_OnlyWindow = 1 " 如果 Tlist 窗口是最后一个窗口则退出 Vim
  206. let Tlist_Use_Left_Window = 1 " 在左侧窗口中显示
  207. let Tlist_File_Fold_Auto_Close = 1 " 自动折叠
  208. let Tlist_Auto_Update = 1 " 自动更新
  209. " <leader>tl 打开 Tlist 窗口,在左侧栏显示
  210. nnoremap <leader>tl :TlistToggle<CR>
  211. "winmanager
  212. Plugin 'vim-scripts/winmanager'
  213. let g:NERDTree_title= "[NERDTree]"
  214. "let g:winManagerWindowLayout="TagList|NERDTree "
  215. let g:winManagerWindowLayout='FileExplorer|TagList'
  216. function! NERDTree_Start()
  217. exec 'NERDTree'
  218. endfunction
  219. function! NERDTree_IsValid()
  220. return 1
  221. endfunction
  222. nnoremap wm :WMToggle<CR>
  223. "powerline fonts
  224. Plugin 'powerline/powerline-fonts'
  225. "状态栏
  226. Plugin 'vim-airline/vim-airline'
  227. Plugin 'vim-airline/vim-airline-themes'
  228. let g:airline_powerline_fonts = 1 " 使用powerline打过补丁的字体
  229. if !exists( 'g:airline_symbols')
  230. let g:airline_symbols = {}
  231. endif
  232. " 关闭当前 buffer
  233. "noremap <C-x> :w<CR>:bd<CR>
  234. "<leader>1~9 切到 buffer1~9
  235. nnoremap <leader>1 :b 1<CR>
  236. nnoremap <leader>2 :b 2<CR>
  237. nnoremap <leader>3 :b 3<CR>
  238. nnoremap <leader>4 :b 4<CR>
  239. nnoremap <leader>5 :b 5<CR>
  240. nnoremap <leader>6 :b 6<CR>
  241. nnoremap <leader>7 :b 7<CR>
  242. nnoremap <leader>8 :b 8<CR>
  243. nnoremap <leader>9 :b 9<CR>
  244. "Vim 在与屏幕/键盘交互时使用的编码(取决于实际的终端的设定)
  245. set encoding=utf-8
  246. set langmenu=zh_CN.UTF-8
  247. " 设置打开文件的编码格式
  248. set fileencodings=ucs-bom,utf-8,cp936,gb18030,big5,euc-jp,euc-kr,latin1
  249. set fileencoding=utf-8
  250. " 解决菜单乱码
  251. source $VIMRUNTIME/delmenu.vim
  252. source $VIMRUNTIME/menu.vim
  253. " 解决consle输出乱码
  254. " set termencoding = cp936
  255. " 设置中文提示
  256. language messages zh_CN.utf-8
  257. " 设置中文帮助
  258. set helplang=cn
  259. " 设置为双字宽显示,否则无法完整显示如:☆
  260. set ambiwidth=double
  261. " 总是显示状态栏
  262. let laststatus = 2
  263. let g:airline_theme= 'solarized' " 设置主题,simple、dark、solarized、bubblegum 详见.vim/bundle/vim-airline-themes
  264. " 开启tabline
  265. let g:airline #extensions#tabline#enabled = 1 "tabline中当前
  266. let g:airline #extensions#tabline#left_sep = ' ' "buffer两端的分隔字符
  267. let g:airline #extensions#tabline#left_alt_sep = '|' "tabline中
  268. let g:airline #extensions#tabline#buffer_nr_show = 1 "buffer显示编号
  269. let g:airline_left_sep = ' '
  270. let g:airline_left_alt_sep = '▶'
  271. let g:airline_right_sep = ' '
  272. let g:airline_right_alt_sep = '◀'
  273. let g:airline_symbols.crypt = '🔒'
  274. let g:airline_symbols.linenr = '¶'
  275. let g:airline_symbols.maxlinenr = '㏑'
  276. let g:airline_symbols.branch = '⎇'
  277. let g:airline_symbols.paste = 'ρ'
  278. let g:airline_symbols.spell = 'Ꞩ'
  279. let g:airline_symbols.notexists = 'Ɇ'
  280. let g:airline_symbols.whitespace = 'Ξ'
  281. " 映射切换buffer的键位
  282. nnoremap [b :bp<CR>
  283. nnoremap ]b :bn<CR>
  284. " 设置字体
  285. set guifont=Powerline_Consolas:h14:cANSI
  286. Plugin 'enricobacis/vim-airline-clock'
  287. "let g:airline#extensions#clock#auto = 0 关闭
  288. let g:airline#extensions#clock#format = '%H:%M:%S'
  289. " "代码动态检查(使用YCM自带的即可)
  290. "Plugin 'w0rp/ale'
  291. " let g:ale_lint_on_text_changed = 'normal' " 代码更改后启动检查
  292. " let g:ale_lint_on_insert_leave = 1 " 退出插入模式即检查
  293. " let g:ale_sign_column_always = 1 " 总是显示动态检查结果
  294. " " let g:ale_statusline_format = [ '✗ %d', '⚡%d', '✔ OK']
  295. " let g:ale_sign_error = '>>' " error 告警符号
  296. " let g:ale_sign_warning = '--' " warning 告警符号
  297. " let g:ale_echo_msg_error_str = 'E' " 错误显示字符
  298. " let g:ale_echo_msg_warning_str = 'W' " 警告显示字符
  299. " let g:ale_echo_msg_format = '[%linter%] %s [%severity%]' " 告警显示格式
  300. "
  301. " " C 语言配置检查参数
  302. " let g:ale_c_gcc_options = '-Wall -Werror -O2 -std=c11'
  303. " let g:ale_c_clang_options = '-Wall -Werror -O2 -std=c11'
  304. " let g:ale_c_cppcheck_options = ''
  305. " " C++ 配置检查参数
  306. " let g:ale_cpp_gcc_options = '-Wall -Werror -O2 -std=c++14'
  307. " let g:ale_cpp_clang_options = '-Wall -Werror -O2 -std=c++14'
  308. " let g:ale_cpp_cppcheck_options = ''
  309. "
  310. " "使用clang对c和c++进行语法检查,对python使用pylint进行语法检查
  311. " let g:ale_linters = { 'c++': ['clang', 'gcc'] }
  312. " " <F9> 触发/关闭代码动态检查
  313. " map <F9> :ALEToggle<CR>
  314. " "普通模式下,ak 前往上一个错误或警告,aj 前往下一个错误或警告
  315. " nmap ak <Plug>(ale_previous_wrap)
  316. " nmap aj <Plug>(ale_next_wrap)
  317. " " ad 查看错误或警告的详细信息
  318. " nmap ad :ALEDetail<CR>
  319. "模糊查找文件,ctrl+p
  320. "Plugin 'ctrlp/ctrlp.vim'
  321. Plugin 'kien/ctrlp.vim'
  322. "git log与code对应
  323. "Plugin 'vim-fugitive'
  324. "显示文件修改痕迹
  325. Plugin 'chrisbra/changesPlugin'
  326. "Plugin 'bufexplorer'
  327. "浏览最近打开的文件
  328. Plugin 'vim-startify'
  329. "撤销
  330. Plugin 'Gundo'
  331. nnoremap <leader>u :GundoToggle<CR>
  332. "恢复上次关闭时所打开的文件
  333. "Plugin 'Sessionman'
  334. " set sessionoptions=blank,buffers,curdir,folds,tabpages,winsize
  335. "nnoremap <leader>sl :SessionList<CR>
  336. "nnoremap <leader>ss :SessionSave<CR>
  337. "nnoremap <leader>sc :SessionClose<CR>
  338. "Plugin 'Powerline'
  339. "Plugin 'rainbow_parentheses'
  340. Plugin 'ludovicchabant/vim-gutentags'
  341. "gutentags搜索工程目录的标志,碰到这些文件/目录名就停止向上一级目录递归
  342. let g:gutentags_project_root = [ '.root', '.svn', '.git', '.project']
  343. " 所生成的数据文件的名称 "
  344. let g:gutentags_ctags_tagfile = '.tags'
  345. " 将自动生成的 tags 文件全部放入 ~/.cache/tags 目录中,避免污染工程目录 "
  346. let s:vim_tags = expand( '~/.cache/tags')
  347. let g:gutentags_cache_dir = s:vim_tags
  348. " 检测 ~/.cache/tags 不存在就新建 "
  349. if !isdirectory(s:vim_tags)
  350. silent! call mkdir(s:vim_tags, 'p')
  351. endif
  352. " 配置 ctags 的参数 "
  353. let g:gutentags_ctags_extra_args = [ '--fields=+niazS', '--extra=+q']
  354. let g:gutentags_ctags_extra_args += [ '--c++-kinds=+pxI']
  355. let g:gutentags_ctags_extra_args += [ '--c-kinds=+px']
  356. Plugin 'skywind3000/gutentags_plus'
  357. " gutentags搜索工程目录的标志,碰到这些文件/目录名就停止向上一级目录递归
  358. " let g:gutentags_project_root = [ '.root', '.svn', '.git', '.project']
  359. " 所生成的数据文件的名称 "
  360. let g:gutentags_ctags_tagfile = '.tags'
  361. " 将自动生成的 tags 文件全部放入 ~/.cache/tags 目录中,避免污染工程目录
  362. let s:vim_tags = expand('~/.cache/tags')
  363. let g:gutentags_cache_dir = s:vim_tags
  364. " 检测 ~/.cache/tags 不存在就新建 "
  365. if !isdirectory(s:vim_tags)
  366. silent! call mkdir(s:vim_tags, 'p')
  367. endif
  368. " 配置 ctags 的参数 "
  369. let g:gutentags_ctags_extra_args = ['--fields=+niazS','--extra=+q']
  370. let g:gutentags_ctags_extra_args += ['--c++-kinds=+pxI']
  371. " let g:gutentags_ctags_extra_args += [ '--c-kinds=+px']
  372. "json viewer
  373. Plugin 'elzr/vim-json'
  374. " vim script library 用法详见src
  375. Plugin 'L9'
  376. "在needtree中显示文件图标
  377. Plugin 'ryanoasis/vim-devicons'
  378. "c++ 语法高亮
  379. Plugin 'octol/vim-cpp-enhanced-highlight'
  380. "let g:cpp_class_scope_highlight = 1
  381. " let g:cpp_member_variable_highlight = 1
  382. "let g:cpp_class_decl_highlight = 1
  383. " let g:cpp_posix_standard = 1
  384. "let g:cpp_experimental_simple_template_highlight = 1
  385. " let g:cpp_experimental_template_highlight = 1
  386. "let g:cpp_concepts_highlight = 1
  387. " let g:cpp_no_function_highlight = 1
  388. "switch .h <->.cpp
  389. "Plugin 'a.vim'
  390. "查找文件
  391. Plugin 'junegunn/fzf'
  392. ":FZF 从当前目录查找
  393. ":FZF ~ 从home目录查找
  394. nnoremap <leader>f :FZF ~<CR>
  395. nnoremap <leader>F :FZF<CR>
  396. "查找
  397. Plugin 'FuzzyFinder'
  398. ":FufBuffer| - Buffer mode (|fuf-buffer-mode|)
  399. ":FufFile| - File mode (|fuf-file-mode|)
  400. ":FufCoverageFile| - Coverage-File mode (|fuf-coveragefile-mode|)
  401. ":FufDir| - Directory mode (|fuf-dir-mode|)
  402. ":FufMruFile| - MRU-File mode (|fuf-mrufile-mode|)
  403. ":FufMruCmd| - MRU-Command mode (|fuf-mrucmd-mode|)
  404. ":FufBookmarkFile| - Bookmark-File mode (|fuf-bookmarkfile-mode|)
  405. ":FufBookmarkDir| - Bookmark-Dir mode (|fuf-bookmarkdir-mode|)
  406. ":FufTag| - Tag mode (|fuf-tag-mode|)
  407. ":FufBufferTag| - Buffer-Tag mode (|fuf-buffertag-mode|)
  408. ":FufTaggedFile| - Tagged-File mode (|fuf-taggedfile-mode|)
  409. ":FufJumpList| - Jump-List mode (|fuf-jumplist-mode|)
  410. ":FufChangeList| - Change-List mode (|fuf-changelist-mode|)
  411. ":FufQuickfix| - Quickfix mode (|fuf-quickfix-mode|)
  412. ":FufLine| - Line mode (|fuf-line-mode|)
  413. ":FufHelp| - Help mode (|fuf-help-mode|)
  414. "doc
  415. Plugin 'DoxygenToolkit.vim'
  416. ":Dox
  417. ":DoxAuthor
  418. ":DoxBlock
  419. ":DoxLic
  420. "draw txt graph
  421. Plugin 'DrawIt'
  422. "\di start
  423. "\ds stop
  424. ""bookmarks
  425. "Plugin 'mattesgroeger/vim-bookmarks'
  426. " highlight BookmarkSign ctermbg=NONE ctermfg=160
  427. " highlight BookmarkLine ctermbg=NONE ctermfg=NONE
  428. " let g:bookmark_sign = '♥'
  429. " let g:bookmark_highlight_lines = 1
  430. " nnoremap <leader><leader> <Plug>BookmarkToggle
  431. " nnoremap <leader>i <Plug>BookmarkAnnotate
  432. " nnoremap <leader>a <Plug>BookmarkShowAll
  433. " nnoremap <leader>j <Plug>BookmarkNext
  434. " nnoremap <leader>k <Plug>BookmarkPrev
  435. " nnoremap <leader>c <Plug>BookmarkClear
  436. " nnoremap <leader>x <Plug>BookmarkClearAll
  437. " nnoremap <leader>kk <Plug>BookmarkMoveUp
  438. " nnoremap <leader>jj <Plug>BookmarkMoveDown
  439. " nnoremap <leader>g <Plug>BookmarkMoveToLine
  440. "highlighting for Google 's Protocol Buffers
  441. "Plugin 'uarun/vim-protobuf '
  442. "显示所有的leader映射
  443. Plugin 'hecal3/vim-leader-guide '
  444. ":LeaderGuide '\ '
  445. "cmake
  446. Plugin 'jansenm/vim-cmake '
  447. "Plugin 'ihacklog/hicursorwords '
  448. " let g:HiCursorWords_delay = 200
  449. " let g:HiCursorWords_hiGroupRegexp = ' '
  450. " let g:HiCursorWords_debugEchoHiName = 0
  451. ""语法检查(使用YCM自带的即可)
  452. "Plugin 'scrooloose/syntastic '
  453. " set statusline+=%#warningmsg#
  454. " set statusline+=%{SyntasticStatuslineFlag()}
  455. " set statusline+=%*
  456. " let g:syntastic_always_populate_loc_list = 1
  457. " let g:syntastic_auto_loc_list = 0
  458. " let g:syntastic_check_on_open = 1
  459. " let g:syntastic_check_on_wq = 0
  460. " let g:syntastic_cpp_checkers = ['gcc ']
  461. " let g:syntastic_cpp_compiler = 'g++ '
  462. " let g:syntastic_cpp_compiler_options = '-std=c++11 -stdlib=libc++ '
  463. " "if !exists('g:syntastic_cpp_compiler_options ')
  464. " " let g:syntastic_cpp_compiler_options = ' -std=c++11 -lstdc++ '
  465. " "endif
  466. "注释
  467. Plugin 'scrooloose/nerdcommenter '
  468. "\cc 注释
  469. " Add spaces after comment delimiters by default
  470. let g:NERDSpaceDelims = 1
  471. " Use compact syntax for prettified multi-line comments
  472. let g:NERDCompactSexyComs = 1
  473. " Align line-wise comment delimiters flush left instead of following code indentation
  474. let g:NERDDefaultAlign = 'left '
  475. " Set a language to use its alternate delimiters by default
  476. let g:NERDAltDelims_java = 1
  477. " Add your own custom formats or override the defaults
  478. let g:NERDCustomDelimiters = { 'c ': { 'left ': '/** ','right ': '*/ ' } }
  479. " Allow commenting and inverting empty lines (useful when commenting a region)
  480. let g:NERDCommentEmptyLines = 1
  481. " Enable trimming of trailing whitespace when uncommenting
  482. let g:NERDTrimTrailingWhitespace = 1
  483. " Enable NERDCommenterToggle to check all selected lines is commented or not
  484. let g:NERDToggleCheckAllLines = 1
  485. "Plugin 'tpope/surround-vim '
  486. "代码版段,详见~/.vim/bundle/vim-snippets/UltiSnips/cpp.snippets
  487. Plugin 'SirVer/ultisnips '
  488. Plugin 'honza/vim-snippets '
  489. " Trigger configuration. Do not use <tab> if you use https:
  490. let g:UltiSnipsSnippetDirectories = ['~/.vim/bundle/vim-snippets/UltiSnips ', 'UltiSnips ']
  491. let g:UltiSnipsExpandTrigger = "<c-b>"
  492. "let g:UltiSnipsJumpForwardTrigger = "<c-n>"
  493. "let g:UltiSnipsJumpBackwardTrigger = "<c-p>"
  494. Plugin 'Valloric/YouCompleteMe '
  495. "往前跳和往后跳的快捷键为Ctrl+O以及Ctrl+I
  496. let g:ycm_key_list_select_completion=['<c-n> ']
  497. let g:ycm_key_list_previous_completion=['<c-p> ']
  498. set completeopt=menu "关闭preview window
  499. "let g:ycm_add_preview_to_completeopt =0
  500. "let g:ycm_autoclose_preview_window_after_completion=1
  501. "let g:ycm_autoclose_preview_window_after_insertion=1
  502. "let g:ycm_always_populate_location_list = 0
  503. let g:ycm_confirm_extra_conf=0 "关闭加载.ycm_extra_conf.py提示
  504. let g:ycm_collect_identifiers_from_tags_files=1 " 开启 YCM 基于标签引擎
  505. let g:ycm_min_num_of_chars_for_completion=1 " 从第1个键入字符就开始罗列匹配项
  506. let g:ycm_cache_omnifunc=0 " 禁止缓存匹配项,每次都重新生成匹配项
  507. let g:ycm_seed_identifiers_with_syntax=1 " 语法关键字补全
  508. nnoremap <F5> :YcmForceCompileAndDiagnostics<CR> "force recomile with syntastic
  509. "nnoremap <leader>lo :lopen<CR> "open locationlist
  510. "nnoremap <leader>lc :lclose<CR> "close locationlist
  511. "inoremap <leader><leader> <C-x><C-o>
  512. let g:ycm_complete_in_comments = 1 "在注释输入中也能补全
  513. let g:ycm_complete_in_strings = 1 "在字符串输入中也能补全
  514. let g:ycm_collect_identifiers_from_comments_and_strings = 0 "注释和字符串中的文字也会被收入补全
  515. let g:ycm_max_num_identifier_candidates = 50
  516. let g:ycm_auto_trigger = 1
  517. let g:ycm_error_symbol = '>> '
  518. let g:ycm_warning_symbol = '> '
  519. "sub commands
  520. "YcmCompleter RefactorRename :重命名
  521. "YcmCompleter GoToSymbol
  522. nnoremap <leader>go :YcmCompleter GoTo<CR> "跳转
  523. nnoremap <leader>gd :YcmCompleter GoToDefinitionElseDeclaration<CR> "跳转到定义或声明
  524. nnoremap <leader>gt :YcmCompleter GetType<CR> "get类型
  525. nnoremap gi :YcmCompleter GoToInclude<CR> "跳转到include、声明或定义(向回跳转:Ctrl+o)
  526. nnoremap gm :YcmCompleter GoToImprecise<CR> "跳转到实现
  527. nnoremap gr :YcmCompleter GoToReferences<CR> "跳转到引用
  528. nnoremap fi :YcmCompleter FixIt<CR> "根据Ycm的建议修复错误
  529. nnoremap <F5> :YcmDiags<CR> "F4进行诊断并显示诊断列表
  530. nnoremap <F6> :YcmForceCompileAndDiagnostics<CR> "重新编译和诊断
  531. "nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR> "跳转到声明
  532. "nnoremap <leader>gf :YcmCompleter GoToDefinition<CR> "跳转到定义
  533. "highlight Pmenu ctermfg=4 ctermbg=0 guifg=#ffffff guibg=#000000 "提示不再是粉红色(pink)
  534. highlight Pmenu ctermfg=4 ctermbg=8 guifg=#ffffff guibg=#000000 "提示不再是粉红色(pink)
  535. call vundle#end()

八、可能遇到的问题及解决方案

            1、启动的时候报错:Taglist: Exuberant ctags (http://ctags.sf.net) not found in PATH. Plugin is not loaded.

                  解决方案:安装ctags(yum install ctags或apt-get install ctags)


转载:https://blog.csdn.net/lianshaohua/article/details/108225916
查看评论
* 以上用户言论只代表其个人观点,不代表本网站的观点或立场