天天看點

VIM 配置Step By Step------完整篇

VIM 功能說明

上節,對vim下的插件管理軟體Vundle做了介紹,通過配置.vimrc檔案以及執行:BundleInstall等指令,就可以友善的安裝解除安裝插件,同時對于每個插件的配置項我們可以放在.vimrc下面,下面主要介紹我自己的.vimrc配置檔案,在熟悉之後你可以根據自己的習慣自己定制自己的.vimrc。

配置界面如下:

VIM 配置Step By Step------完整篇

.vimrc主界面分類說明:

  1. 配置檔案由{{{}}}分隔為8類,按快捷鍵”za”打開關閉
  2. 将快捷鍵映射放在一類,便于檢視更改(按照個人習慣定制)
  3. 通過配置Vundle選項,自動安裝、解除安裝插件
  4. 在打開檔案時根據檔案類型,自動插入檔案頭标題
  5. vim自身配置選項部分分割為一類

快捷鍵映射說明

檔案視窗操作

  1. F2 對比檔案不同
  2. F3 建立新檔案
  3. F4 更改文本格式對齊
  4. F5 編譯程式
  5. F6 調試c程式
  6. F7 調試c++程式
  7. F9 打開屬性目錄(對應NerdTree插件)
  8. F10 打開函數變量清單 (對應TagBar插件)
  9. F11 全屏(預設不可修改)
  10. F12 與F10類似 (對應Taglist插件)

    nnoremap <F2> :vert diffsplit nnoremap <F3> :tabnew<cr> map <F4> gg=G map <F5> :call CompileRunGcc()<cr> map <f6> :call Rungdb()<cr> map <f7> :call Rungdbb()<cr> map <F9> :NERDTreeToggle<cr> map <F10> :TagbarToggle<cr> map <F12> :TlistToggle<cr>

VIM 配置Step By Step------完整篇

變量查找跳轉

  1. ,ct 生成ctag檔案 (需要首先安裝ctag,便于查找定義)
  2. ctrl+j 查找聲明 (YouCompleteMe 插件)
  3. ctrl+k 查找定義 (同一個檔案中,否則用ctrl+h)
  4. ctrl+l 先查找聲明在查找定義 (YouCompleteMe 插件)
  5. ctrl+h 查找定義(ctag插件,首先得生成ctag檔案)
  6. ctrl+o 傳回上一次操作檔案位置(YoucompleteMe插件)
  7. ctrl+t 傳回上一次位置 (ctag檔案)
  8. ctrl+i 前進到下一步操作檔案位置(YoucompleteMe插件)
    map <leader>ct :!ctags -R . <cr> "generate Ctags sysbols
    map <c-j> :YcmCompleter GoToDeclaration<cr>
    map <c-k> :YcmCompleter GoToDefinition<cr>
    map <c-l> :YcmCompleter GoToDefinitionElseDeclaration<cr>
    map <c-h> <c-]> 
               

注:通過ctag、taglist、youcomplete插件将vim編輯器打造成一個強大的IDE環境,可以自動提示補全、查找定義聲明自由跳轉、一鍵編譯運作調試、多視窗,同時視窗大小位置、快捷鍵都可以自己定制,使用起來非常友善,趕快抛棄你的SI吧

VIM自身快捷鍵

  1. ctrl+d —> ;j 向下翻半頁,支援重映射,我映射為”;j”組合鍵
  2. ctrl+u —> ;k 向上翻半頁
  3. ctrl+f 向上翻一頁
  4. ctrl+b 向下翻一頁
  5. ctrl+w+w 多視窗切換、前進
  6. ctrl+w+p 多視窗切換、後退
  7. dd 删除 dnd 向下删除n行
  8. yy 指派目前行 p粘貼

注:這裡就列這幾個常用的快捷鍵,并不全,如果想用所有的vim自帶的快捷點,找個vim教程看吧。同時原始的快捷鍵也可以重新映射。

推薦:笨辦法學習vim

子產品功能說明

插件清單

目前之于我檢視代碼、編寫代碼的需求,隻是安裝了下面幾個插件,對于别的插件需求可以在github上查找,然後借助vundle下載下傳安裝,檢視相應插件的幫助檔案來定位配置選項,然後在.vimrc中配置。

  1. NerTree 插件 (主要是打開樹狀目錄結構視窗,便于檢視源代碼)
  2. YouCompleteMe (基于文法級的代碼補全、代碼檢查、函數變量定義跳轉,速度快,該插件安裝完需要編譯)
  3. python_mode (python強大的插件,可以省去别的如pylint、rope的安裝)
  4. TagBar 和Taglist (語義級的變量查找、函數原型檢視視窗,需首先生成ctags檔案)
VIM 配置Step By Step------完整篇

自動添加檔案頭

通過配置.vimrc檔案可以自動根據檔案字尾名,添加相應類型檔案頭資訊,如作者、庫包含、檔案資訊等。這個可以根據需要修改,定制。

VIM 配置Step By Step------完整篇

下面貼出整個.vimrc配置檔案

augroup filetype_vim
    autocmd!
    autocmd FileType vim setlocal foldmethod=marker
    "use the marker method of folding for any Vimscript files 
    "for instance : z-a open and close maker
augroup END

"快捷鍵映射 MAP -----------{{{
"快捷鍵部分按照自己習慣自己定制
let mapleader = ","
let maplocalleader = "."
"<LocalLeader> is to be used for mappings which are local to a buffer.
nnoremap <F2> :vert diffsplit 
nnoremap <F3> :tabnew<cr> 
map <F4> gg=G

map <F5> :call CompileRunGcc()<cr>
map <f6> :call Rungdb()<cr>
map <f7> :call Rungdbb()<cr>

map <F9> :NERDTreeToggle<cr>
map <F10> :TagbarToggle<cr>
map <F12> :TlistToggle<cr>

map <leader>ct :!ctags -R . <cr> "generate Ctags sysbols
map <c-j> :YcmCompleter GoToDeclaration<cr>
map <c-k> :YcmCompleter GoToDefinition<cr>
map <c-l> :YcmCompleter GoToDefinitionElseDeclaration<cr>
map <c-h> <c-]>
" 下面這些根據需要自己映射
noremap - ddp
"move a row down
noremap _ ddkkp
"move a row up
nnoremap <leader>u viwU
"lowercase -> uppercase
inoremap <leader>u <esc>viwUi
nnoremap <leader>d dd
nnoremap <leader>ev :vsplit $MYVIMRC<cr>  "vim中打開.vimrc配置檔案
nnoremap <leader>sv :source $MYVIMRC<cr>
inoremap jk <esc>
"   inoremap <esc> <nop>
"   noremap <left> <nop>
"   noremap <right> <nop>
"   noremap <up> <nop>
"   noremap <down> <nop>
noremap ;k <c-u>  "上半頁
noremap ;j <c-d>   "下半頁
" 映射全選+複制 ctrl+a
map <C-A> ggVGY
map! <C-A> <Esc>ggVGY
" 選中狀态下 Ctrl+c 複制
vmap <C-c> "+y
"去空行  

"C,C++ 按F5編譯運作
func! CompileRunGcc()
    exec "w"
    if &filetype == 'c'
        exec "!gcc % -I /home/ltf/apue/include -lpthread  /home/ltf/apue/lib/libapue.a -o  %<"
        exec "! ./%<"
    elseif &filetype == 'cpp'
        exec "!g++ % -std=c++11 -o %<"
        exec "! ./%<"
    elseif &filetype == 'java' 
        exec "!javac %" 
        exec "!java %<"
    elseif &filetype == 'sh'
        :!./%
    endif
endfunc

"C的調試 f6
func! Rungdb()
    exec "w"
    exec "!gcc % -g -o %<"
    exec "!gdb ./%<"
endfunc

" c++ debug f7
func! Rungdbb()
    exec "w"
    exec "!g++ % -g -std=c++11 -o %<"
    exec "!gdb ./%<"
endfunc
" }}}

" pathogen 插件管理軟體(手動下載下傳) ----{{{
"filetype off
"
"call pathogen#infect()
"
"filetype plugin indent on
"}}}

" Vundle   插件管理軟體(自動下載下傳) ----{{{
set nocompatible
filetype off
set rtp+=~/.vim/bundle/Vundle.vim
call vundle#begin()

" other plugin to be installed
Plugin 'gmarik/Vundle.vim'
Plugin 'tomasr/molokai'
Plugin 'scrooloose/nerdtree'
Plugin 'majutsushi/tagbar'
Plugin 'vim-scripts/taglist.vim'
Plugin 'klen/python-mode'
"Plugin 'tpope/vim-pathogen'
Plugin 'Valloric/YouCompleteMe'

call vundle#end()
filetype plugin indent on
" }}}
"plugin config------------{{{
"YouCompleteMe config------------{{{
"don't show errorMsg
"let g:ycm_show_diagnostics_ui=0
" >> 
let g:ycm_enable_diagnostic_signs = 1
let g:ycm_enable_diagnostic_highlighting = 0
" }}}
"Tagbar     config------------{{{
"
let g:tagbar_width = 30
let g:tagbar_left = 1 "by default on right side of vim
" }}}
"molokai    config--------------{{{
colorscheme molokai
highlight NonText guibg=#060606
highlight Folded  guibg=#0A0A0A guifg=#9090D0
"}}}
"ctaglist   config--------------{{{
let Tlist_Ctags_Cmd='ctags'
let Tlist_Show_One_File=1        "不同時顯示多個檔案的tag,隻顯示目前檔案的
let Tlist_WinWidth =28                    "設定taglist的寬度
let Tlist_Use_Right_Window=1            "在右側視窗中顯示taglist視窗
"let Tlist_Use_Left_Window =1                "在左側視窗中顯示taglist視窗
let Tlist_Exit_OnlyWindow = 1    "如果taglist視窗是最後一個視窗,則退出vim
"}}}
"NERD tree  config----------" {{{
let NERDChristmasTree=0
let NERDTreeWinSize=25
let NERDTreeChDirMode=2
let NERDTreeIgnore=['\~$','\.pyc$','\.swp$']
let NERDTreeShowBookmarks=1
let NERDTreeWinPos='left'
"Automatically open a NERDTree if no files where specified
"autocmd vimenter * if !argc() | NERDTree | endif
" Close vim if the only window left open is a NERDTree
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTreeType") && b:NERDTreeType == "primary")
"OPen a NERDTree
" }}}
" }}}

"新檔案标題""  --------{{{
"建立.c,.h,.sh,.java檔案,自動插入檔案頭 
autocmd BufNewFile *.cpp,*.[ch],*.sh,*.java exec ":call SetTitle()" 
""定義函數SetTitle,自動插入檔案頭 
func SetTitle() 
    "如果檔案類型為.sh檔案 
    if &filetype == 'sh' 
        call setline(1,"\#########################################################################") 
        call append(line("."), "\# File Name: ".expand("%")) 
        call append(line(".")+1, "\# Author: ") 
        call append(line(".")+2, "\# mail: @qq.com") 
        call append(line(".")+3, "\# Created Time: ".strftime("%c")) 
        call append(line(".")+4, "\#########################################################################") 
        call append(line(".")+5, "\#!/bin/bash") 
        call append(line(".")+6, "") 
    else 
        call setline(1, "/*************************************************************************") 
        call append(line("."), "    > File Name: ".expand("%")) 
        call append(line(".")+1, "    > Author: ltf") 
        call append(line(".")+2, "    > Mail: @qq.com ") 
        call append(line(".")+3, "    > Created Time: ".strftime("%c")) 
        call append(line(".")+4, " ************************************************************************/") 
        call append(line(".")+5, "")
    endif
    if &filetype == '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
    "建立檔案後,自動定位到檔案末尾
    autocmd BufNewFile * normal G
endfunc 
"}}}

"自動比對------------------{{{
:inoremap ( ()<ESC>i
:inoremap ) <c-r>=ClosePair(')')<CR>
:inoremap { {<CR>}<ESC>O
:inoremap } <c-r>=ClosePair('}')<CR>
:inoremap [ []<ESC>i
:inoremap ] <c-r>=ClosePair(']')<CR>
":inoremap " ""<ESC>i
":inoremap ' ''<ESC>i
function! ClosePair(char)
    if getline('.')[col('.') - 1] == a:char
        return "\<Right>"
    else
        return a:char
    endif
endfunction
"}}}

" 顯示相關  --------{{{
set linespace=4
set guifont=Courier_New:h10:cANSI   " 設定字型  
"syntax on           " 文法高亮
set number      " 顯示行号
autocmd InsertLeave * se nocul  " 用淺色高亮目前行  
autocmd InsertEnter * se cul    " 用淺色高亮目前行 
set ruler            " 打開狀态欄标尺
set laststatus=2    " 啟動顯示狀态行(1),總是顯示狀态行(2) 
set statusline=%F%m%r%h%w\ [FORMAT=%{&ff}]\ [TYPE=%Y]\ [POS=%l,%v][%p%%]\ %{strftime(\"%d/%m/%y\ -\ %H:%M\")}   "狀态行顯示的内容 
set cursorline              " 突出顯示目前行
set guioptions-=T           " 隐藏工具欄
set guioptions-=m           " 隐藏菜單欄
set showcmd         " 輸入的指令顯示出來,看的清楚些  
set cmdheight=1     " 指令行(在狀态行下)的高度,設定為1  
set novisualbell    " 不要閃爍(不明白)  
" 顯示中文幫助
if version >= 603
    set helplang=cn
    set encoding=utf-8
endif
set enc=utf-8  "編碼設定
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
set langmenu=zh_CN.UTF-8 "語言設定
set helplang=cn
set fillchars=vert:\ ,stl:\ ,stlnc:\  " 在被分割的視窗間顯示空白,便于閱讀
set termencoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=utf-8
"}}}

" 常用設定 ----------{{{
set autoread " 設定當檔案被改動時自動載入
set clipboard+=unnamed "共享剪貼闆
"set autowrite  "自動儲存
set nocompatible  " 不要使用vi的鍵盤模式,而是vim自己的
set noeb " 去掉輸入錯誤的提示聲音
set confirm  " 在處理未儲存或隻讀檔案的時候,彈出确認
set autoindent " 自動縮進
set cindent
set tabstop=4  " Tab鍵的寬度
set softtabstop=4 " 統一縮進為4
set shiftwidth=4
set noexpandtab " 不要用空格代替制表符
set smarttab " 在行和段開始處使用制表符\
set history=1000  " 曆史記錄數
set nobackup "禁止生成臨時檔案
set noswapfile
set ignorecase  "搜尋忽略大小寫
set hlsearch "搜尋逐字元高亮
set incsearch
set gdefault "行内替換
"filetype on  " 偵測檔案類型
set viminfo+=! " 儲存全局變量 
set iskeyword+=_,$,@,%,#,-  " 帶有如下符号的單詞不要被換行分割
set linespace=0 " 字元間插入的像素行數目
set wildmenu " 增強模式中的指令行自動完成操作
set backspace=2 " 使回格鍵(backspace)正常處理indent, eol, start等
set whichwrap+=<,>,h,l " 允許backspace和光标鍵跨越行邊界
set mouse=a  " 可以在buffer的任何地方使用滑鼠(類似office中在工作區輕按兩下滑鼠定位)
set selection=exclusive
set selectmode=mouse,key
set report=0 " 通過使用: commands指令,告訴我們檔案的哪一行被改變過
set showmatch " 高亮顯示比對的括号
set matchtime=1 " 比對括号高亮的時間(機關是十分之一秒)
set scrolloff=3 " 光标移動到buffer的頂部和底部時保持3行距離
set smartindent " 為C程式提供自動縮進
au BufRead,BufNewFile *  setfiletype txt  " 高亮顯示普通txt檔案(需要txt.vim腳本)
"}}}