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

.vimrc主界面分類說明:
- 配置檔案由{{{}}}分隔為8類,按快捷鍵”za”打開關閉
- 将快捷鍵映射放在一類,便于檢視更改(按照個人習慣定制)
- 通過配置Vundle選項,自動安裝、解除安裝插件
- 在打開檔案時根據檔案類型,自動插入檔案頭标題
- vim自身配置選項部分分割為一類
快捷鍵映射說明
檔案視窗操作
- F2 對比檔案不同
- F3 建立新檔案
- F4 更改文本格式對齊
- F5 編譯程式
- F6 調試c程式
- F7 調試c++程式
- F9 打開屬性目錄(對應NerdTree插件)
- F10 打開函數變量清單 (對應TagBar插件)
- F11 全屏(預設不可修改)
- 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>
變量查找跳轉
- ,ct 生成ctag檔案 (需要首先安裝ctag,便于查找定義)
- ctrl+j 查找聲明 (YouCompleteMe 插件)
- ctrl+k 查找定義 (同一個檔案中,否則用ctrl+h)
- ctrl+l 先查找聲明在查找定義 (YouCompleteMe 插件)
- ctrl+h 查找定義(ctag插件,首先得生成ctag檔案)
- ctrl+o 傳回上一次操作檔案位置(YoucompleteMe插件)
- ctrl+t 傳回上一次位置 (ctag檔案)
- 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自身快捷鍵
- ctrl+d —> ;j 向下翻半頁,支援重映射,我映射為”;j”組合鍵
- ctrl+u —> ;k 向上翻半頁
- ctrl+f 向上翻一頁
- ctrl+b 向下翻一頁
- ctrl+w+w 多視窗切換、前進
- ctrl+w+p 多視窗切換、後退
- dd 删除 dnd 向下删除n行
- yy 指派目前行 p粘貼
注:這裡就列這幾個常用的快捷鍵,并不全,如果想用所有的vim自帶的快捷點,找個vim教程看吧。同時原始的快捷鍵也可以重新映射。
推薦:笨辦法學習vim
子產品功能說明
插件清單
目前之于我檢視代碼、編寫代碼的需求,隻是安裝了下面幾個插件,對于别的插件需求可以在github上查找,然後借助vundle下載下傳安裝,檢視相應插件的幫助檔案來定位配置選項,然後在.vimrc中配置。
- NerTree 插件 (主要是打開樹狀目錄結構視窗,便于檢視源代碼)
- YouCompleteMe (基于文法級的代碼補全、代碼檢查、函數變量定義跳轉,速度快,該插件安裝完需要編譯)
- python_mode (python強大的插件,可以省去别的如pylint、rope的安裝)
- TagBar 和Taglist (語義級的變量查找、函數原型檢視視窗,需首先生成ctags檔案)
自動添加檔案頭
通過配置.vimrc檔案可以自動根據檔案字尾名,添加相應類型檔案頭資訊,如作者、庫包含、檔案資訊等。這個可以根據需要修改,定制。
下面貼出整個.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腳本)
"}}}