今天在github上找到一个将gVim配置IDE开发环境的介绍项目其网址为(https://github.com/yangyangwithgnu/use_vim_as_ide)不过此配置仅适用于Linux,要在Windows上使用需要修改进行部分修改,配置步骤:
到https://git-for-windows.github.io/下载并安装git软件
下载并安装gVim软件
下载ctags并将解压压缩,将解压缩文件路径添加到PATH环境变量中。
打开控制台窗口,将当前路径切换到gVim安装目录下的vimfiles
cd /d “D:\Program Files (x86)\Vim\vimfiles”
执行如下命令检出Vundle工具。
git clone https://github.com/VundleVim/Vundle.vim.git ./bundle/Vundle.vim
使用gVim打开D:\Program Files (x86)\Vim\_vimrc
文件,将https://github.com/yangyangwithgnu/use_vim_as_ide/blob/master/.vimrc
文件中的内容追加到_vimrc文件后面,将set rtp+=~/.vim/bundle/Vundle.vim
注释掉并添加如下内容后保存退出。
set rtp+=$VIM/vimfiles/bundle/Vundle.vim
"设置插件安装位置
call vundle#rc('$VIM/vimfiles/bundle/')
启动gVim,此时会弹出错误消息,不必理会,在gVim界面输入:PluginInstall
安装_vimrc文件中配置的插件,安装完成后重新启动gVim软件配置结束。
Python官网下载Python 2.7版本并将安装目录添加到PATH环境变量中。
LLVM官网下载最新版本Pre-Built Binaries: Clang for Windows (32-bit)当前版本为V4.0.0
cmake官网下载最新版本cmake并将安装目录添加到PATH环境变量中。
从网上找到VS2015并安装VC++2015
运行cmd.exe并切换到VIM安装目录下的D:\Program Files (x86)\Vim\vimfiles\bundle\YouCompleteMe
(路径由实际安装位置确定)新建ycm_build
目录并切换到ycm_build
目录。
执行如下指令,在D:\Program Files (x86)\Vim\vimfiles\bundle\YouCompleteMe\third_party\ycmd
生成ycm_core.pyd
和libclang.dll
两个文件
cmake -G "Visual Studio 14 2015" -DPATH_TO_LLVM_ROOT="D:\Program Files (x86)\LLVM" . ../third_party/ycmd/cpp
cmake --build . --target ycm_core --config Release
在_vimrc中添加如下配置
let g:ycm_global_ycm_extra_conf=’D:\Program Files (x86)\Vim\vimfiles\bundle\YouCompleteMe\third_party\ycmd\cpp\ycm.ycm_extra_conf.py’
因编码问题,在_vimrc中需要添加如下配置
" 编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
" 设置提示信息语言
language messages zh_CN.utf-8
source $VIMRUNTIME/vimrc_example.vim
source $VIMRUNTIME/mswin.vim
behave mswin
set diffexpr=MyDiff()
function MyDiff()
let opt = '-a --binary '
if &diffopt =~ 'icase' | let opt = opt . '-i ' | endif
if &diffopt =~ 'iwhite' | let opt = opt . '-b ' | endif
let arg1 = v:fname_in
if arg1 =~ ' ' | let arg1 = '"' . arg1 . '"' | endif
let arg2 = v:fname_new
if arg2 =~ ' ' | let arg2 = '"' . arg2 . '"' | endif
let arg3 = v:fname_out
if arg3 =~ ' ' | let arg3 = '"' . arg3 . '"' | endif
if $VIMRUNTIME =~ ' '
if &sh =~ '\
if empty(&shellxquote)
let l:shxq_sav = ''
set shellxquote&
endif
let cmd = '"' . $VIMRUNTIME . '\diff"'
else
let cmd = substitute($VIMRUNTIME, ' ', '" ', '') . '\diff"'
endif
else
let cmd = $VIMRUNTIME . '\diff'
endif
silent execute '!' . cmd . ' ' . opt . arg1 . ' ' . arg2 . ' > ' . arg3
if exists('l:shxq_sav')
let &shellxquote=l:shxq_sav
endif
endfunction
" 编码设置
set enc=utf-8
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
" 设置提示信息语言
language messages zh_CN.utf-8
" 定义快捷键的前缀,即
let mapleader=" ;"
" >>
" 文件类型侦测
" 开启文件类型侦测
filetype on
" 根据侦测到的不同类型加载对应的插件
filetype plugin on
" <<
" >>
" vim 自身(非插件)快捷键
" 定义快捷键到行首和行尾
nmap LB 0
nmap LE $
" 设置快捷键将选中文本块复制至系统剪贴板
vnoremap y "+y
" 设置快捷键将系统剪贴板内容粘贴至vim
nmap p "+p
" 定义快捷键关闭当前分割窗口
nmap q :q
" 定义快捷键保存当前窗口内容
nmap w :w
" 定义快捷键保存所有窗口内容并退出 vim
nmap WQ :wa:q
" 不做任何保存,直接退出 vim
nmap Q :qa!
" 设置快捷键遍历子窗口
" 依次遍历
nnoremap nw
" 跳转至右方的窗口
nnoremap lw l
" 跳转至方的窗口
nnoremap hw h
" 跳转至上方的子窗口
nnoremap kw k
" 跳转至下方的子窗口
nnoremap jw j
" 定义快捷键在结对符之间跳转
nmap M %
" <<
" 让配置变更立即生效
autocmd BufWritePost $MYVIMRC source $MYVIMRC
" >>
" 其他
" 开启实时搜索功能
set incsearch
" 搜索时大小写不敏感
set ignorecase
" 关闭兼容模式
set nocompatible
" vim 自身命令行模式智能补全
set wildmenu
" <<
" >>>>
" 插件安装
" vundle 环境设置
filetype off
set rtp+=$VIM/vimfiles/bundle/Vundle.vim
" 设置插件安装位置
call vundle#rc('$VIM/vimfiles/bundle/')
" vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间
call vundle#begin()
Plugin 'VundleVim/Vundle.vim'
Plugin 'altercation/vim-colors-solarized'
Plugin 'tomasr/molokai'
Plugin 'vim-scripts/phd'
Plugin 'Lokaltog/vim-powerline'
Plugin 'octol/vim-cpp-enhanced-highlight'
Plugin 'nathanaelkane/vim-indent-guides'
Plugin 'derekwyatt/vim-fswitch'
Plugin 'kshenoy/vim-signature'
Plugin 'vim-scripts/BOOKMARKS--Mark-and-Highlight-Full-Lines'
Plugin 'majutsushi/tagbar'
Plugin 'vim-scripts/indexer.tar.gz'
Plugin 'vim-scripts/DfrankUtil'
Plugin 'vim-scripts/vimprj'
Plugin 'dyng/ctrlsf.vim'
Plugin 'terryma/vim-multiple-cursors'
Plugin 'scrooloose/nerdcommenter'
Plugin 'vim-scripts/DrawIt'
Plugin 'SirVer/ultisnips'
Plugin 'Valloric/YouCompleteMe'
Plugin 'derekwyatt/vim-protodef'
Plugin 'scrooloose/nerdtree'
Plugin 'fholgado/minibufexpl.vim'
Plugin 'gcmt/wildfire.vim'
Plugin 'sjl/gundo.vim'
Plugin 'Lokaltog/vim-easymotion'
Plugin 'suan/vim-instant-markdown'
Plugin 'lilydjwg/fcitx.vim'
" 插件列表结束
call vundle#end()
filetype plugin indent on
" <<<<
" 配色方案
set background=dark
colorscheme solarized
"colorscheme molokai
"colorscheme phd
" >>
" 营造专注气氛
" 禁止光标闪烁
set gcr=a:block-blinkon0
" 禁止显示滚动条
set guioptions-=l
set guioptions-=L
set guioptions-=r
set guioptions-=R
" 禁止显示菜单和工具条
set guioptions-=m
set guioptions-=T
" 将外部命令 wmctrl 控制窗口最大化的命令行参数封装成一个 vim 的函数
fun! ToggleFullscreen()
call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen")
endf
" 全屏开/关快捷键
map :call ToggleFullscreen()
"" 启动 vim 时自动全屏
"autocmd VimEnter * call ToggleFullscreen()
" <<
" >>
" 辅助信息
" 总是显示状态栏
set laststatus=2
" 显示光标当前位置
set ruler
" 开启行号显示
set number
" 高亮显示当前行/列
set cursorline
set cursorcolumn
" 高亮显示搜索结果
set hlsearch
" <<
" >>
" 其他美化
" 设置 gvim 显示字体
set guifont=YaHei\ Consolas\ Hybrid\ 10.5
" 禁止折行
set nowrap
" 设置状态栏主题风格
let g:Powerline_colorscheme='solarized256'
" <<
" >>
" 语法分析
" 开启语法高亮功能
syntax enable
" 允许用指定语法高亮配色方案替换默认方案
syntax on
" <<
" >>
" 缩进
" 自适应不同语言的智能缩进
filetype indent on
" 将制表符扩展为空格
set expandtab
" 设置编辑时制表符占用空格数
set tabstop=4
" 设置格式化时制表符占用空格数
set shiftwidth=4
" 让 vim 把连续数量的空格视为一个制表符
set softtabstop=4
" 缩进可视化插件 Indent Guides
" 随 vim 自启动
let g:indent_guides_enable_on_vim_startup=1
" 从第二层开始可视化显示缩进
let g:indent_guides_start_level=2
" 色块宽度
let g:indent_guides_guide_size=1
" 快捷键 i 开/关缩进可视化
nmap i IndentGuidesToggle
" <<
" >>
" 代码折叠
" 基于缩进或语法进行代码折叠
"set foldmethod=indent
set foldmethod=syntax
" 启动 vim 时关闭折叠代码
set nofoldenable
" <<
" >>
" 接口与实现快速切换
" *.cpp 和 *.h 间切换
nmap sw :FSHere
" <<
" >>
" 代码收藏
" 自定义 vim-signature 快捷键
let g:SignatureMap = {
\ 'Leader' : "m",
\ 'PlaceNextMark' : "m,",
\ 'ToggleMarkAtLine' : "m.",
\ 'PurgeMarksAtLine' : "m-",
\ 'DeleteMark' : "dm",
\ 'PurgeMarks' : "mda",
\ 'PurgeMarkers' : "m",
\ 'GotoNextLineAlpha' : "']",
\ 'GotoPrevLineAlpha' : "'[",
\ 'GotoNextSpotAlpha' : "`]",
\ 'GotoPrevSpotAlpha' : "`[",
\ 'GotoNextLineByPos' : "]'",
\ 'GotoPrevLineByPos' : "['",
\ 'GotoNextSpotByPos' : "mn",
\ 'GotoPrevSpotByPos' : "mp",
\ 'GotoNextMarker' : "[+",
\ 'GotoPrevMarker' : "[-",
\ 'GotoNextMarkerAny' : "]=",
\ 'GotoPrevMarkerAny' : "[=",
\ 'ListLocalMarks' : "ms",
\ 'ListLocalMarkers' : "m?"
\ }
" <<
" >>
" 标签列表
" 设置 tagbar 子窗口的位置出现在主编辑区的左边
let tagbar_left=1
" 设置显示/隐藏标签列表子窗口的快捷键。速记:identifier list by tag
nnoremap ilt :TagbarToggle
" 设置标签子窗口的宽度
let tagbar_width=32
" tagbar 子窗口中不显示冗余帮助信息
let g:tagbar_compact=1
" 设置 ctags 对哪些代码标识符生成标签
let g:tagbar_type_cpp = {
\ 'ctagstype' : 'c++',
\ 'kinds' : [
\ 'c:classes:0:1',
\ 'd:macros:0:1',
\ 'e:enumerators:0:0',
\ 'f:functions:0:1',
\ 'g:enumeration:0:1',
\ 'l:local:0:1',
\ 'm:members:0:1',
\ 'n:namespaces:0:1',
\ 'p:functions_prototypes:0:1',
\ 's:structs:0:1',
\ 't:typedefs:0:1',
\ 'u:unions:0:1',
\ 'v:global:0:1',
\ 'x:external:0:1'
\ ],
\ 'sro' : '::',
\ 'kind2scope' : {
\ 'g' : 'enum',
\ 'n' : 'namespace',
\ 'c' : 'class',
\ 's' : 'struct',
\ 'u' : 'union'
\ },
\ 'scope2kind' : {
\ 'enum' : 'g',
\ 'namespace' : 'n',
\ 'class' : 'c',
\ 'struct' : 's',
\ 'union' : 'u'
\ }
\ }
" <<
" >>
" 代码导航
" 基于标签的代码导航
" 设置插件 indexer 调用 ctags 的参数
" 默认 --c++-kinds=+p+l,重新设置为 --c++-kinds=+l+p+x+c+d+e+f+g+m+n+s+t+u+v
" 默认 --fields=+iaS 不满足 YCM 要求,需改为 --fields=+iaSl
let g:indexer_ctagsCommandLineOptions="--c++-kinds=+l+p+x+c+d+e+f+g+m+n+s+t+u+v --fields=+iaSl --extra=+q"
" 正向遍历同名标签
nmap tn :tnext
" 反向遍历同名标签
nmap tp :tprevious
" 基于语义的代码导航
nnoremap jc :YcmCompleter GoToDeclaration
" 只能是 #include 或已打开的文件
nnoremap jd :YcmCompleter GoToDefinition
" <<
" >>
" 查找
" 使用 ctrlsf.vim 插件在工程内全局查找光标所在关键字,设置快捷键。快捷键速记法:search in project
nnoremap sp :CtrlSF
" <<
" >>
" 内容替换
" 快捷替换
let g:multi_cursor_next_key=''
let g:multi_cursor_skip_key=''
" 精准替换
" 替换函数。参数说明:
" confirm:是否替换前逐一确认
" wholeword:是否整词匹配
" replace:被替换字符串
function! Replace(confirm, wholeword, replace)
wa
let flag = ''
if a:confirm
let flag .= 'gec'
else
let flag .= 'ge'
endif
let search = ''
if a:wholeword
let search .= '\<' . escape(expand(''), '/\.*$^~[') . '\>'
else
let search .= expand('')
endif
let replace = escape(a:replace, '/\&~')
execute 'argdo %s/' . search . '/' . replace . '/' . flag . '| update'
endfunction
" 不确认、非整词
nnoremap R :call Replace(0, 0, input('Replace '.expand('' ).' with: '))
" 不确认、整词
nnoremap rw :call Replace(0, 1, input('Replace '.expand('').' with: '))
" 确认、非整词
nnoremap rc :call Replace(1, 0, input('Replace '.expand('' ).' with: '))
" 确认、整词
nnoremap rcw :call Replace(1, 1, input('Replace '.expand('').' with: '))
nnoremap rwc :call Replace(1, 1, input('Replace '.expand('').' with: '))
" <<
" 模板补全
" UltiSnips 的 tab 键与 YCM 冲突,重新设定
let g:UltiSnipsSnippetDirectories=["mysnippets"]
let g:UltiSnipsExpandTrigger=""
let g:UltiSnipsJumpForwardTrigger=""
let g:UltiSnipsJumpBackwardTrigger=""
" >>
" YCM 补全
" YCM 补全菜单配色
" 菜单
highlight Pmenu ctermfg=2 ctermbg=3 guifg=#005f87 guibg=#EEE8D5
" 选中项
highlight PmenuSel ctermfg=2 ctermbg=3 guifg=#AFD700 guibg=#106900
" 补全功能在注释中同样有效
let g:ycm_complete_in_comments=1
" 允许 vim 加载 .ycm_extra_conf.py 文件,不再提示
let g:ycm_confirm_extra_conf=0
let g:ycm_global_ycm_extra_conf='D:\Program Files (x86)\Vim\vimfiles\bundle\YouCompleteMe\third_party\ycmd\cpp\ycm\.ycm_extra_conf.py'
" 开启 YCM 标签补全引擎
let g:ycm_collect_identifiers_from_tags_files=0
"" 引入 C++ 标准库 tags
"set tags+=/data/misc/software/app/vim/stdcpp.tags
"set tags+=/data/misc/software/app/vim/sys.tags
" YCM 集成 OmniCppComplete 补全引擎,设置其快捷键
inoremap ;
" 补全内容不以分割子窗口形式出现,只显示补全列表
set completeopt-=preview
" 从第一个键入字符就开始罗列匹配项
let g:ycm_min_num_of_chars_for_completion=1
" 禁止缓存匹配项,每次都重新生成匹配项
let g:ycm_cache_omnifunc=0
" 语法关键字补全
let g:ycm_seed_identifiers_with_syntax=1
" <<
" >>
" 由接口快速生成实现框架
" 成员函数的实现顺序与声明顺序一致
let g:disable_protodef_sorting=1
" <<
" >>
" 库信息参考
" 启用:Man命令查看各类man信息
source $VIMRUNTIME/ftplugin/man.vim
" 定义:Man命令查看各类man信息的快捷键
nmap man :Man 3
" <<
" >>
" 工程文件浏览
" 使用 NERDTree 插件查看工程文件。设置快捷键,速记:file list
nmap fl :NERDTreeToggle
" 设置 NERDTree 子窗口宽度
let NERDTreeWinSize=22
" 设置 NERDTree 子窗口位置
let NERDTreeWinPos="right"
" 显示隐藏文件
let NERDTreeShowHidden=1
" NERDTree 子窗口中不显示冗余帮助信息
let NERDTreeMinimalUI=1
" 删除文件时自动删除文件对应 buffer
let NERDTreeAutoDeleteBuffer=1
" <<
" >>
" 多文档编辑
" 显示/隐藏 MiniBufExplorer 窗口
map bl :MBEToggle
" buffer 切换快捷键
map :MBEbn
map :MBEbp
" <<
" >>
" 环境恢复
" 设置环境保存项
set sessionoptions="blank,globals,localoptions,tabpages,sesdir,folds,help,options,resize,winpos,winsize"
" 保存 undo 历史。必须先行创建 .undo_history/
set undodir=~/.undo_history/
set undofile
" 保存快捷键
"map ss :mksession! my.vim :wviminfo! my.viminfo
map ss :mksession! my.vim
" 恢复快捷键
"map rs :source my.vim :rviminfo my.viminfo
map rs :source my.vim
" <<
" 设置快捷键实现一键编译及运行
nmap m :wa :cd build/ :!rm -rf main :!cmake CMakeLists.txt:make :cw :cd ..
nmap g :wa:cd build/:!rm -rf main:!cmake CMakeLists.txt:make:cw:cd ..:!build/main
" >>
" 快速选中结对符内的文本
" 快捷键
map (wildfire-fuel)
vmap (wildfire-water)
" 适用于哪些结对符
let g:wildfire_objects = ["i'", 'i"', "i)", "i]", "i}", "i>", "ip"]
" <<
" 调用 gundo 树
nnoremap ud :GundoToggle