接觸Linux有兩年了,vim仍是隻會簡單的操做。最近實在受不了sublime的代碼提示,決定花點時間來配置下vim。本文講本身認爲方便的vim配置,稱不上完美,只講究簡單實用。php
主要參考 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
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做者主頁的效果圖
主要參考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