Vim使用YouCompleteMe達到相似IDE的代碼提示、補全,以及其餘實用設置

接觸Linux有兩年了,vim仍是隻會簡單的操做。最近實在受不了sublime的代碼提示,決定花點時間來配置下vim。本文講本身認爲方便的vim配置,稱不上完美,只講究簡單實用。php

使用 ctags

主要參考   http://roclinux.cn/?p=424html

1.  ctags根據代碼產生索引文件,支持ava, c, c++, python, perl, php, ruby, scheme, tcl, vim, yacc, bash/kron shell/zsh, cobol, awk, asp, lisp, pascal等等。能夠經過本身的包管理器來安裝。例如,對於Ubuntu  sudo pat-get install ctags java

2. vim經過taglist插件來使用ctags。到官網下載taglist,解壓到用戶家目錄下的 .vim 文件夾下。這會生成 doc,plugin兩個目錄。python

而後,  cd .vim/doc linux

使用命令打開vim,在命令模式下執行 :helptags . 。ios

重啓vim,taglist應該已經好了。c++

3. 使用 ctags+taglistgit

用vim打開源文件,光標定位到某個函數或者變量,按ctrl+],就能夠跳轉到定義。而後使用 ctrl-o或者ctrl-t。能夠連續查詢連續返回。github

在vim中執行 :TlistToggle ,會在vim中出現宏、函數、變量列表。按ctrl-w再按w,能夠連續在左右窗口切換。shell

配置YouCompleteMe

Ubuntu的源中已經有了, 爲 vim-youcompleteme, 由於本身已經手動安裝了,沒有實測。不想折騰的朋友能夠試一下。

1. 安裝vundle

vundle是一個管理vim插件的工具,使用vundle安裝YouCompleteMe比較方便。

按照做者在https://github.com/gmarik/Vundle.vim#about提供的方法安裝好vundle。(主要是下載解壓,病略微修改 .vimrc)

2. 使用vundle安裝YouCompleteMe

主要根據做者本身的建議整理 https://github.com/Valloric/YouCompleteMe

在.vimrc中 vundle部分,添加一行:

Plugin 'Valloric/YouCompleteMe'

而後,打開vim,輸入命令

:PluginInstall

就會開始自動安裝vundle指定的各類插件。

因爲要安裝clang等,安裝過程是很是久的,大概須要一個小時,這個時間徹底能夠去作些別的。

等安裝好後,在.vim/vundle/YouCompleteMe目錄下多了一堆目錄和文件。

3. 使用YouCompleteMe

YouCompleteMe進行補全時須要查找一個 ycm_global_ycm_extra_conf文件。能夠每次在工做目錄中放置這個文件,也能夠設置全局。全局設置要在.vimrc中添加一行

let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'

4. 效果圖

YCM做者主頁的效果圖

 

實用的 .vimrc 文件

主要參考http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html。 加入了前面介紹的ctags, YouCompleteMe的配置。

  1 " Suzzz   2014.11.03
  2 " 主要參考 http://www.cnblogs.com/ma6174/archive/2011/12/10/2283393.html
  3 " 額外添加了 ctags, YouCompleteMe等
  4 "  主要特色
  5 
  6 "1.按F5能夠直接編譯並執行C、C++、java代碼以及執行shell腳本,按「F8」可進行C、C++代碼的調試
  7 "2.自動插入文件頭 ,新建C、C++源文件時自動插入表頭:包括文件名、做者、聯繫方式、創建時間等,讀者可根據需求自行更改
  8 "3.映射「Ctrl + A」爲全選並複製快捷鍵,方便複製代碼
  9 "4.按「F2」能夠直接消除代碼中的空行
 10 "5.「F3」可列出當前目錄文件,打開樹狀文件目錄
 11 "6. 支持鼠標選擇、方向鍵移動
 12 "7. 代碼高亮,自動縮進,顯示行號,顯示狀態行
 13 "8. 按「Ctrl + P」可自動補全
 14 "9. []、{}、()、""、' '等都自動補全   --- 若是須要{}作函數形式的補全(右括號自動換行,加一個空行,光標定位到空行,能夠看下面的修改提示)
 15 "10. 使用YouCompleteMe提供C++的自動補全提示,效果相似 Visual Studio那種,能夠解析系統頭文件
 16 
 17 
 18 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 19 " """""""""""""" Suzzz  """""""""""""""""""""
 20 "Vundle相關。Vundle是vim插件管理器,使用它來管理插件很方便,並且功能強大
 21 "https://github.com/gmarik/Vundle.vim#about
 22 
 23 set nocompatible              " be iMproved, required
 24 filetype off                  " required
 25 
 26 " set the runtime path to include Vundle and initialize
 27 set rtp+=~/.vim/bundle/Vundle.vim
 28 call vundle#begin()
 29 
 30 " alternatively, pass a path where Vundle should install plugins
 31 "call vundle#begin('~/some/path/here')
 32 
 33 " let Vundle manage Vundle, required
 34 Plugin 'gmarik/Vundle.vim'
 35 
 36 " plugin on GitHub repo    添加github上的vimn插件,形式很是簡單
 37 Plugin 'tpope/vim-fugitive'
 38 
 39 
 40 "語法檢查
 41 Plugin 'scrooloose/syntastic'
 42 "讓 syntastic忽略 python 文件
 43 let g:syntastic_ignore_files=[".*\.py$"]
 44 
 45 "補全 python
 46 Plugin 'davidhalter/jedi'
 47 
 48 Plugin 'rstacruz/sparkup', {'rtp': 'vim/'}
 49 
 50 "  YouCompleteMe插件,很好的智能提示,基本達到 IDE 級別
 51 Plugin 'Valloric/YouCompleteMe'
 52 
 53 
 54 " All of your Plugins must be added before the following line  全部Vundle管理的插件必須安裝在這裏以前
 55 call vundle#end()            " required
 56 filetype plugin indent on    " required
 57 " To ignore plugin indent changes, instead use:
 58 "filetype plugin on
 59 " YouCompleteMe 經過這個cm_global_ycm_extra_conf來得到補全規則,能夠以下指定,也能夠每次放置在工做目錄
 60 let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/cpp/ycm/.ycm_extra_conf.py'
 61 "讓YouCompleteMe同時利用原來的ctags
 62 let g:ycm_collect_identifiers_from_tag_files = 1  
 63 
 64 
 65 
 66 
 67 "  """"""""""""" By  ma6174  """""""""""""""""""""
 68 
 69 " 顯示相關  
 70 
 71 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
 72 
 73 "set shortmess=atI   " 啓動的時候不顯示那個援助烏干達兒童的提示  
 74 
 75 "winpos 5 5          " 設定窗口位置  
 76 
 77 "set lines=40 columns=155    " 設定窗口大小  
 78 
 79 "set nu              " 顯示行號  
 80 
 81 set go=             " 不要圖形按鈕  
 82 
 83 "color asmanian2     " 設置背景主題  
 84 
 85 set guifont=Courier_New:h10:cANSI   " 設置字體  
 86 
 87 "syntax on           " 語法高亮  
 88 
 89 autocmd InsertLeave * se nocul  " 用淺色高亮當前行  
 90 
 91 autocmd InsertEnter * se cul    " 用淺色高亮當前行  
 92 
 93 "set ruler           " 顯示標尺  
 94 
 95 set showcmd         " 輸入的命令顯示出來,看的清楚些  
 96 
 97 "set cmdheight=1     " 命令行(在狀態行下)的高度,設置爲1  
 98 
 99 "set whichwrap+=<,>,h,l   " 容許backspace和光標鍵跨越行邊界(不建議)  
100 
101 "set scrolloff=3     " 光標移動到buffer的頂部和底部時保持3行距離  
102 
103 set novisualbell    " 不要閃爍(不明白)  
104 
105 set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}   "狀態行顯示的內容  
106 
107 set laststatus=1    " 啓動顯示狀態行(1),老是顯示狀態行(2)  
108 
109 set foldenable      " 容許摺疊  
110 
111 set foldmethod=manual   " 手動摺疊  
112 
113 "set background=dark "背景使用黑色 
114 
115 set nocompatible  "去掉討厭的有關vi一致性模式,避免之前版本的一些bug和侷限  
116 
117 " 顯示中文幫助
118 
119 if version >= 603
120 
121     set helplang=cn
122 
123     set encoding=utf-8
124 
125 endif
126 
127 " 設置配色方案
128 
129 "colorscheme murphy
130 
131 "字體 
132 
133 "if (has("gui_running")) 
134 
135 "   set guifont=Bitstream\ Vera\ Sans\ Mono\ 10 
136 
137 "endif 
138 
139 
140  
141 set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
142 
143 set termencoding=utf-8
144 
145 set encoding=utf-8
146 
147 set fileencodings=ucs-bom,utf-8,cp936
148 
149 set fileencoding=utf-8
150 
151 
152 
153 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
154 
155 """""新文件標題""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
156 
157 "新建.c,.h,.sh,.java文件,自動插入文件頭 
158 
159 autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" 
160 
161 ""定義函數SetTitle,自動插入文件頭 
162 
163 func SetTitle() 
164 
165     "若是文件類型爲.sh文件 
166 
167     if &filetype == 'sh' 
168 
169         call setline(1,"\#########################################################################") 
170 
171         call append(line("."), "\# File Name: ".expand("%")) 
172 
173         call append(line(".")+1, "\# Author: YourName") 
174 
175         call append(line(".")+2, "\# mail: YourEmail") 
176 
177         "原來的時間形式比較複雜,不喜歡,改變一下
178 
179         "call append(line(".")+3, "\# Created Time: ".strftime("%c")) 
180         call append(line(".")+3, "\# Created Time: ".strftime("%Y-%m-%d",localtime()))
181 
182         call append(line(".")+4, "\#########################################################################") 
183 
184         call append(line(".")+5, "\#!/bin/bash") 
185 
186         call append(line(".")+6, "") 
187 
188     else 
189 
190         call setline(1, "/*************************************************************************") 
191 
192         call append(line("."), "    > File Name: ".expand("%")) 
193 
194         call append(line(".")+1, "    > Author: YourName") 
195 
196         call append(line(".")+2, "    > Mail: YourEmail ") 
197 
198         " 一樣的 改變時間格式
199         "call append(line(".")+3, "    > Created Time: ".strftime("%c")) 
200         call append(line(".")+3, "    > Created Time: ".strftime("%Y-%m-%d",localtime()))
201 
202         call append(line(".")+4, " ************************************************************************/") 
203 
204         call append(line(".")+5, "")
205 
206     endif
207 
208     if &filetype == 'cpp'
209 
210         call append(line(".")+6, "#include<iostream>")
211 
212         call append(line(".")+7, "using namespace std;")
213 
214         call append(line(".")+8, "")
215 
216     endif
217 
218     if &filetype == 'c'
219 
220         call append(line(".")+6, "#include<stdio.h>")
221 
222         call append(line(".")+7, "")
223 
224     endif
225 
226     "新建文件後,自動定位到文件末尾
227 
228     autocmd BufNewFile * normal G
229 
230 endfunc 
231 
232 " Suzzz:  模仿上面,新建python文件時,添加文件頭
233 
234 autocmd BufNewFile *py exec ":call SetPythonTitle()"
235 
236 func SetPythonTitle()
237     call setline(1,"#!/usr/bin/env python")
238     call append( line("."),"#-*- coding: utf-8 -*-" )
239     call append(line(".")+1," ")
240     call append(line(".")+2, "\# File Name: ".expand("%")) 
241     call append(line(".")+3, "\# Author: YourName") 
242     call append(line(".")+4, "\# mail: YourEmail") 
243     call append(line(".")+5, "\# Created Time: ".strftime("%Y-%m-%d",localtime()))    
244 endfunc
245 
246 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
247 
248 "鍵盤命令
249 
250 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
251 
252 
253 
254 nmap <leader>w :w!<cr>
255 
256 nmap <leader>f :find<cr>
257 
258 
259 
260 " 映射全選+複製 ctrl+a
261 
262 map <C-A> ggVGY
263 
264 map! <C-A> <Esc>ggVGY
265 
266 map <F12> gg=G
267 
268 " 選中狀態下 Ctrl+c 複製
269 
270 vmap <C-c> "+y
271 
272 "去空行  
273 
274 nnoremap <F2> :g/^\s*$/d<CR> 
275 
276 "比較文件  
277 
278 nnoremap <C-F2> :vert diffsplit 
279 
280 "新建標籤  
281 
282 map <M-F2> :tabnew<CR>  
283 
284 "列出當前目錄文件  
285 
286 map <F3> :tabnew .<CR>  
287 
288 "打開樹狀文件目錄  
289 
290 map <C-F3> \be  
291 
292 "C,C++ 按F5編譯運行
293 
294 map <F5> :call CompileRunGcc()<CR>
295 
296 func! CompileRunGcc()
297 
298     exec "w"
299 
300     if &filetype == 'c'
301 
302         exec "!g++ % -o %<"
303 
304         exec "! ./%<"
305 
306     elseif &filetype == 'cpp'
307 
308         exec "!g++ % -o %<"
309 
310         exec "! ./%<"
311 
312     elseif &filetype == 'java' 
313 
314         exec "!javac %" 
315 
316         exec "!java %<"
317 
318     elseif &filetype == 'sh'
319 
320         :!./%
321 
322     endif
323 
324 endfunc
325 
326 "C,C++的調試
327 
328 map <F8> :call Rungdb()<CR>
329 
330 func! Rungdb()
331 
332     exec "w"
333 
334     exec "!g++ % -g -o %<"
335 
336     exec "!gdb ./%<"
337 
338 endfunc
339 
340 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
341 
342 ""實用設置
343 
344 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
345 
346 " 設置當文件被改動時自動載入
347 
348 set autoread
349 
350 " quickfix模式
351 
352 autocmd FileType c,cpp map <buffer> <leader><space> :w<cr>:make<cr>
353 
354 "代碼補全 
355 
356 set completeopt=preview,menu 
357 
358 "容許插件  
359 
360 filetype plugin on
361 
362 "共享剪貼板  
363 
364 set clipboard+=unnamed 
365 
366 "從不備份  
367 
368 set nobackup
369 
370 "make 運行
371 
372 :set makeprg=g++\ -Wall\ \ %
373 
374 "自動保存
375 
376 set autowrite
377 
378 set ruler                   " 打開狀態欄標尺
379 
380 set cursorline              " 突出顯示當前行
381 
382 set magic                   " 設置魔術
383 
384 set guioptions-=T           " 隱藏工具欄
385 
386 set guioptions-=m           " 隱藏菜單欄
387 
388 "set statusline=\ %<%F[%1*%M%*%n%R%H]%=\ %y\ %0(%{&fileformat}\ %{&encoding}\ %c:%l/%L%)\
389 
390 " 設置在狀態行顯示的信息
391 
392 set foldcolumn=0
393 
394 set foldmethod=indent 
395 
396 set foldlevel=3 
397 
398 set foldenable              " 開始摺疊
399 
400 " 不要使用vi的鍵盤模式,而是vim本身的
401 
402 set nocompatible
403 
404 " 語法高亮
405 
406 set syntax=on
407 
408 " 去掉輸入錯誤的提示聲音
409 
410 set noeb
411 
412 " 在處理未保存或只讀文件的時候,彈出確認
413 
414 set confirm
415 
416 " 自動縮進
417 
418 set autoindent
419 
420 set cindent
421 
422 " Tab鍵的寬度
423 
424 set tabstop=4
425 
426 " 統一縮進爲4
427 
428 set softtabstop=4
429 
430 set shiftwidth=4
431 
432 " 不要用空格代替製表符
433 
434 set noexpandtab
435 
436 " 在行和段開始處使用製表符
437 
438 set smarttab
439 
440 " 顯示行號
441 
442 set number
443 
444 " 歷史記錄數
445 
446 set history=1000
447 
448 "禁止生成臨時文件
449 
450 set nobackup
451 
452 set noswapfile
453 
454 "搜索忽略大小寫
455 
456 set ignorecase
457 
458 "搜索逐字符高亮
459 
460 set hlsearch
461 
462 set incsearch
463 
464 "行內替換
465 
466 set gdefault
467 
468 "編碼設置
469 
470 set enc=utf-8
471 
472 set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
473 
474 "語言設置
475 
476 set langmenu=zh_CN.UTF-8
477 
478 set helplang=cn
479 
480 " 個人狀態行顯示的內容(包括文件類型和解碼)
481 
482 "set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}
483 
484 "set statusline=[%F]%y%r%m%*%=[Line:%l/%L,Column:%c][%p%%]
485 
486 " 老是顯示狀態行
487 
488 set laststatus=2
489 
490 " 命令行(在狀態行下)的高度,默認爲1,這裏是2
491 
492 set cmdheight=2
493 
494 " 偵測文件類型
495 
496 filetype on
497 
498 " 載入文件類型插件
499 
500 filetype plugin on
501 
502 " 爲特定文件類型載入相關縮進文件
503 
504 filetype indent on
505 
506 " 保存全局變量
507 
508 set viminfo+=!
509 
510 " 帶有以下符號的單詞不要被換行分割
511 
512 set iskeyword+=_,$,@,%,#,-
513 
514 " 字符間插入的像素行數目
515 
516 set linespace=0
517 
518 " 加強模式中的命令行自動完成操做
519 
520 set wildmenu
521 
522 " 使回格鍵(backspace)正常處理indent, eol, start等
523 
524 set backspace=2
525 
526 " 容許backspace和光標鍵跨越行邊界
527 
528 set whichwrap+=<,>,h,l
529 
530 " 能夠在buffer的任何地方使用鼠標(相似office中在工做區雙擊鼠標定位)
531 
532 set mouse=a
533 
534 set selection=exclusive
535 
536 set selectmode=mouse,key
537 
538 " 經過使用: commands命令,告訴咱們文件的哪一行被改變過
539 
540 set report=0
541 
542 " 在被分割的窗口間顯示空白,便於閱讀
543 
544 set fillchars=vert:\ ,stl:\ ,stlnc:\
545 
546 " 高亮顯示匹配的括號
547 
548 set showmatch
549 
550 " 匹配括號高亮的時間(單位是十分之一秒)
551 
552 set matchtime=1
553 
554 " 光標移動到buffer的頂部和底部時保持3行距離
555 
556 set scrolloff=3
557 
558 " 爲C程序提供自動縮進
559 
560 set smartindent
561 
562 " 高亮顯示普通txt文件(須要txt.vim腳本)
563 
564 au BufRead,BufNewFile *  setfiletype txt
565 
566 "自動補全
567 
568 :inoremap ( ()<ESC>i
569 
570 :inoremap ) <c-r>=ClosePair(')')<CR>
571 
572 "by Suzzz:  原做者這種設置,輸入{會自動補全,而且中間插入一個空行,將光標定位到空行。這對於函數是OK的,可是使用花括號初始化數組、vector時就不方便了。因此改成如今這種。只是補全,而後光標在左右括號中間。
573 ":inoremap { {<CR>}<ESC>O
574 :inoremap { {}<ESC>i
575 
576 :inoremap } <c-r>=ClosePair('}')<CR>
577 
578 :inoremap [ []<ESC>i
579 
580 :inoremap ] <c-r>=ClosePair(']')<CR>
581 
582 :inoremap " ""<ESC>i
583 
584 :inoremap ' ''<ESC>i
585 
586 function! ClosePair(char)
587 
588     if getline('.')[col('.') - 1] == a:char
589 
590         return "\<Right>"
591 
592     else
593 
594         return a:char
595 
596     endif
597 
598 endfunction
599 
600 filetype plugin indent on 
601 
602 "打開文件類型檢測, 加了這句才能夠用智能補全
603 
604 set completeopt=longest,menu
605 
606 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
607 
608 " CTags的設定  
609 
610 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
611 
612 let Tlist_Sort_Type = "name"    " 按照名稱排序  
613 
614 let Tlist_Use_Right_Window = 1  " 在右側顯示窗口  
615 
616 let Tlist_Compart_Format = 1    " 壓縮方式  
617 
618 let Tlist_Exist_OnlyWindow = 1  " 若是隻有一個buffer,kill窗口也kill掉buffer  
619 
620 let Tlist_File_Fold_Auto_Close = 0  " 不要關閉其餘文件的tags  
621 
622 let Tlist_Enable_Fold_Column = 0    " 不要顯示摺疊樹  
623 
624 autocmd FileType java set tags+=D:\tools\java\tags  
625 
626 "autocmd FileType h,cpp,cc,c set tags+=D:\tools\cpp\tags  
627 
628 "let Tlist_Show_One_File=1            "不一樣時顯示多個文件的tag,只顯示當前文件的
629 
630 "設置tags  
631 
632 set tags=tags  
633 
634 "set autochdir 
635 
636 
637 
638 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
639 
640 "其餘東東
641 
642 """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
643 
644 "默認打開Taglist 
645 
646 let Tlist_Auto_Open=1 
647 
648 """""""""""""""""""""""""""""" 
649 
650 " Tag list (ctags) 
651 
652 """""""""""""""""""""""""""""""" 
653 
654 let Tlist_Ctags_Cmd = '/usr/bin/ctags' 
655 
656 let Tlist_Show_One_File = 1 "不一樣時顯示多個文件的tag,只顯示當前文件的 
657 
658 let Tlist_Exit_OnlyWindow = 1 "若是taglist窗口是最後一個窗口,則退出vim 
659 
660 let Tlist_Use_Right_Window = 1 "在右側窗口中顯示taglist窗口
661 
662 " minibufexpl插件的通常設置
663 
664 let g:miniBufExplMapWindowNavVim = 1
665 
666 let g:miniBufExplMapWindowNavArrows = 1
667 
668 let g:miniBufExplMapCTabSwitchBufs = 1
669 let g:miniBufExplModSelTarget = 1
相關文章
相關標籤/搜索