您的位置:首页 > 其它

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

2016-04-19 14:37 417 查看

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脚本)
"}}}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: