说明
本文参考两种配置方法,自测都可以配置成功。配置二的vim使用上不太会,因此,实际使用的是配置一。
配置一
参考笨书书的“把vim打造比Source insight更好用更强大的IDE.pdf”
步骤
(1)安装工具
//安装插件管理工具 vundle git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim //安装编译插件需要的软件包 sudo apt-get install build-essential cmake python-dev python3-dev //安装ctags, cscope sudo apt-get install ctags sudo apt-get install cscope
(2)创建 ~/.vimrc
1 " ==============vim基本配置============== 2 set guifont=Monospace 14 3 set nu! " 显示行号 4 syntax enable 5 syntax on 6 colorscheme desert 7 8 set autowrite " 自动保存 9 10 set foldmethod=syntax 11 set foldlevel=100 " 启动vim时不要自动折叠代码 12 set textwidth=80 13 set formatoptions+=t 14 set cindent 15 set smartindent 16 set noerrorbells 17 set showmatch 18 set nobackup 19 set noswapfile 20 " set cursorline 21 22 " disable 23 noremap <Up> <Nop> 24 noremap <Down> <Nop> 25 noremap <Left> <Nop> 26 noremap <Right> <Nop> 27 28 " remap control + arrow key to select windows 29 noremap <C-Down> <C-W>j 30 noremap <C-Up> <C-W>k 31 noremap <C-Left> <C-W>h 32 noremap <C-Right> <C-W>l 33 noremap <C-J> <C-W>j 34 noremap <C-K> <C-W>k 35 noremap <C-H> <C-W>h 36 noremap <C-L> <C-W>l 37 38 " ==============Vundle插件管理============== 39 " Vundle manage 40 set nocompatible " be iMproved, required 41 filetype off " required 42 43 " set the runtime path to include Vundle and initialize 44 set rtp+=~/.vim/bundle/Vundle.vim 45 call vundle#begin() 46 47 " let Vundle manage Vundle, required 48 Plugin 'VundleVim/Vundle.vim' 49 Plugin 'scrooloose/nerdtree' 50 " Plugin 'majutsushi/tagbar' " Tag bar" 51 Plugin 'Xuyuanp/nerdtree-git-plugin' 52 Plugin 'jistr/vim-nerdtree-tabs' 53 Plugin 'vim-airline/vim-airline' | Plugin 'vim-airline/vim-airline-themes' " Status line" 54 Plugin 'jiangmiao/auto-pairs' 55 Plugin 'mbbill/undotree' 56 Plugin 'gdbmgr' 57 Plugin 'scrooloose/nerdcommenter' 58 Plugin 'Yggdroot/indentLine' " Indentation level" 59 Plugin 'bling/vim-bufferline' " Buffer line" 60 "Plugin 'kepbod/quick-scope' " Quick scope 61 Plugin 'yianwillis/vimcdoc' 62 Plugin 'nelstrom/vim-visual-star-search' 63 Plugin 'ludovicchabant/vim-gutentags' 64 Plugin 'w0rp/ale' 65 Plugin 'mbbill/echofunc' 66 Plugin 'Yggdroot/LeaderF', { 'do': './install.sh' } 67 Plugin 'Valloric/YouCompleteMe' 68 Plugin 'majutsushi/tagbar' 69 70 " All of your Plugins must be added before the following line 71 call vundle#end() " required 72 filetype plugin indent on " required 73 74 75 " ==============YCM============== 76 let g:ycm_server_python_interpreter='/usr/bin/python' 77 let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py' 78 " YCM 查找定义 79 let mapleader=',' 80 nnoremap <leader>gl :YcmCompleter GoToDeclaration<CR> 81 nnoremap <leader>gf :YcmCompleter GoToDefinition<CR> 82 nnoremap <leader>gg :YcmCompleter GoToDefinitionElseDeclaration<CR> 83 let g:ycm_collect_identifiers_from_tags_files = 1 84 85 set completeopt=menu,menuone 86 let g:ycm_add_preview_to_completeopt = 0 " 关闭函数原型提示 87 88 let g:ycm_show_diagnostics_ui = 0 " 关闭诊断信息 89 let g:ycm_server_log_level = 'info' 90 let g:ycm_min_num_identifier_candidate_chars = 2 " 两个字符触发 补全 91 let g:ycm_collect_identifiers_from_comments_and_strings = 1 " 收集 92 let g:ycm_complete_in_strings=1 93 let g:ycm_server_python_interpreter='/usr/bin/python' 94 let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py' 95 96 noremap <c-z> <NOP> 97 let g:ycm_key_invoke_completion = '<c-z>' " YCM 里触发语义补全有一个快捷键 98 let g:ycm_max_num_candidates = 15 " 候选数量 99 100 let g:ycm_semantic_triggers = { 101 'c,cpp,python,java,go,erlang,perl': ['re!w{2}'], 102 'cs,lua,javascript': ['re!w{2}'], 103 } 104 105 106 " ===========gutentags============= 107 " 搜索工程目录的标志,碰到这些文件/目录名就停止向上一级目录递归 108 let g:gutentags_project_root = ['.root', '.svn', '.git', '.hg', '.project', '.gitignore'] 109 110 " 添加ctags额外参数,会让tags文件变大 111 " let g:gutentags_ctags_extra_args = ['--fields=+niazlS', '--extra=+q'] 112 let g:gutentags_ctags_extra_args = ['--fields=+lS'] 113 " let g:gutentags_ctags_extra_args += ['--c++-kinds=+px'] 114 " let g:gutentags_ctags_extra_args += ['--c-kinds=+px'] 115 116 if isdirectory("kernel/") && isdirectory("mm/") 117 let g:gutentags_file_list_command = 'find arch/arm/ mm/ kernel/ include/ init/ lib/' 118 endif 119 120 121 " =======echodoc 显示函数参数=========== 122 " ctags -R --fields=+lS . 123 124 "======= NetRedTree========= 125 autocmd StdinReadPre * let s:std_in=1 126 autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif 127 let NERDTreeWinSize=20 128 "let NERDTreeShowLineNumbers=1 129 let NERDTreeAutoCenter=1 130 let NERDTreeShowBookmarks=1 131 132 let g:winManagerWindowLayout='TagList' 133 nmap wm :WMToggle<cr> 134 135 " ======ALE静态语法检测======== 136 let g:ale_sign_column_always = 1 137 let g:ale_sign_error = '✗' 138 let g:ale_sign_warning = 'w' 139 let g:ale_statusline_format = ['✗ %d', '⚡ %d', '✔ OK'] 140 let g:ale_echo_msg_format = '[%linter%] %code: %%s' 141 let g:ale_lint_on_text_changed = 'normal' 142 let g:ale_lint_on_insert_leave = 1 143 "let g:airline#extensions#ale#enabled = 1 144 let g:ale_c_gcc_options = '-Wall -O2 -std=c99' 145 let g:ale_cpp_gcc_options = '-Wall -O2 -std=c++14' 146 let g:ale_c_cppcheck_options = '' 147 let g:ale_cpp_cppcheck_options = '' 148 149 " ========airline状态栏========= 150 let g:airline#extensions#tabline#enabled = 1 151 let g:airline_section_b = '%-0.10{getcwd()}' 152 let g:airline_section_c = '%t' 153 let g:airline#extensions#tagbar#enabled = 1 154 let g:airline_section_y = '' 155 156 " Tagbar 157 let g:tagbar_width=25 158 autocmd BufReadPost *.cpp,*.c,*.h,*.cc,*.cxx call tagbar#autoopen() 159 160 "-------------------------------------------------------------------------------- 161 " cscope:建立数据库:cscope -Rbq; F5 查找c符号; F6 查找字符串; F7 查找函数定义; F8 查找函数谁调用了, 162 "-------------------------------------------------------------------------------- 163 if has("cscope") 164 set csprg=/usr/bin/cscope 165 set csto=1 166 set cst 167 set nocsverb 168 " add any database in current directory 169 if filereadable("cscope.out") 170 cs add cscope.out 171 endif 172 set csverb 173 endif 174 175 176 :set cscopequickfix=s-,c-,d-,i-,t-,e- 177 178 nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> 179 nmap <C-_>g :cs find g <C-R>=expand("<cword>")<CR><CR> 180 nmap <C-_>c :cs find c <C-R>=expand("<cword>")<CR><CR> 181 nmap <C-_>t :cs find t <C-R>=expand("<cword>")<CR><CR> 182 nmap <C-_>e :cs find e <C-R>=expand("<cword>")<CR><CR> 183 nmap <C-_>f :cs find f <C-R>=expand("<cfile>")<CR><CR> 184 nmap <C-_>i :cs find i ^<C-R>=expand("<cfile>")<CR>$<CR> 185 nmap <C-_>d :cs find d <C-R>=expand("<cword>")<CR><CR> 186 187 188 "nmap <C-_>s :cs find s <C-R>=expand("<cword>")<CR><CR> 189 "F5 查找c符号; F6 查找字符串; F7 查找函数定义; F8 查找函数谁调用了, 190 nmap <silent> <F5> :cs find s <C-R>=expand("<cword>")<CR><CR> :botright copen<CR><CR> 191 nmap <silent> <F6> :cs find t <C-R>=expand("<cword>")<CR><CR> :botright copen<CR><CR> 192 "nmap <silent> <F7> :cs find g <C-R>=expand("<cword>")<CR><CR> 193 nmap <silent> <F7> :cs find c <C-R>=expand("<cword>")<CR><CR> :botright copen<CR><CR> 194 195 196 "-------------------------------------------------------------------------------- 197 " 自动加载ctags: ctags -R 198 if filereadable("tags") 199 set tags=tags 200 endif 201 202 "-------------------------------------------------------------------------------- 203 " global:建立数据库 204 "-------------------------------------------------------------------------------- 205 if filereadable("GTAGS") 206 set cscopetag 207 set cscopeprg=gtags-cscope 208 cs add GTAGS 209 au BufWritePost *.c,*.cpp,*.h silent! !global -u & 210 endif
(3)安装插件
//先找到其在 github.com 的地址,再将配置信息其加入 .vimrc 中的call vundle#begin() 和 call vundle#end() 之间,最后进入 vim 执行 :PluginInstall //要卸载插件,先在 .vimrc 中注释或者删除对应插件配置信息,然后在 vim 中执行 :PluginClean //插件更新频率较高,差不多每隔一个月你应该看看哪些插件有推出新版本,批量更新,只需执行 :PluginUpdate
(4)编译自动补全插件 YouCompleteMe
cd ~/.vim/bundle/YouCompleteMe //--clang-completer 表示对C/C++的支持 ./install.py --clang-completer cp third_party/ycmd/examples/.ycm_extra_conf.py ~/.vim vim ~/.vimrc //添加配置 let g:ycm_server_python_interpreter='/usr/bin/python' let g:ycm_global_ycm_extra_conf='~/.vim/.ycm_extra_conf.py'
使用
(1)生成索引
//切换到目标代码目录,递归扫描该目录和其子目录的文件并生成索引文件 tags sudo ctags -R . //-Rb 生成 cscope.out;-q生成 cscope.in.out, cscope.po.out,用于加快索引速度 sudo cscope -Rbq //执行 vim,即可浏览代码 vim
(2)vim 键盘图
来源:http://www.viemu.com/a_vi_vim_graphical_cheat_sheet_tutorial.html
(3)vim 常用命令
插入命令
a 在光标 后 插入
i 前
o 在当前行 后 插入新行
O 前
cw 替换光标至单词尾的字符
x 删除光标所在字符
ndd 删除光标开始的n行(会存入剪贴板)
nyy 拷贝光标开始的n行
p 粘贴剪贴板
u 撤销操作
ctrl+r redo
. 重复上一次的命令
n<cmd> 重复某个命令n次
光标移动
nG 到第n行
gg 到第一行
G 到最后一行
hjkl 光标键< ^>
% (){}[] 匹配移动
# 上(匹配光标所在单词)
* 下
0 行头,数字零
$ 尾
^ 行首字符
w 开头(下一个单词或字符)
e 结尾
W 开头(下一个字符串)
E 结尾
/str 搜索字符串
:wq 保存+退出
:q! 退出不保存
:qa! 退出不保存所有文件
:split 水平分屏
:vsplit 垂直分屏
ctrl+w+hjkl 选择分屏
:bn 切换 下 一个文件
:bp 上
:e path/file 打开指定文件
:saveas path/file 另存为
:help <cmd> 显示cmd info
:cs cscope commands: add : Add a new database (Usage: add file|dir [pre-path] [flags]) find : Query for a pattern (Usage: find a|c|d|e|f|g|i|s|t name) a: Find assignments to this symbol c: Find functions calling this function d: Find functions called by this function e: Find this egrep pattern f: Find this file g: Find this definition i: Find files #including this file s: Find this C symbol t: Find this text string help : Show this message (Usage: help) kill : Kill a connection (Usage: kill #) reset: Reinit all connections (Usage: reset) show : Show connections (Usage: show)
配置二
参考:https://github.com/yangyangwithgnu/use_vim_as_ide
步骤:
(1)安装插件管理工具vundle
git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
(2)创建~/.vimrc
.vimrc 是控制 vim 行为的配置文件
1 " 更新时间:2016-03-30 12:15:21 2 3 " 定义快捷键的前缀,即 <Leader> 4 let mapleader=";" 5 6 " >> 7 " 文件类型侦测 8 9 " 开启文件类型侦测 10 filetype on 11 " 根据侦测到的不同类型加载对应的插件 12 filetype plugin on 13 14 " << 15 16 " >> 17 " vim 自身(非插件)快捷键 18 19 " 定义快捷键到行首和行尾 20 nmap LB 0 21 nmap LE $ 22 23 " 设置快捷键将选中文本块复制至系统剪贴板 24 vnoremap <Leader>y "+y 25 " 设置快捷键将系统剪贴板内容粘贴至vim 26 nmap <Leader>p "+p 27 28 " 定义快捷键关闭当前分割窗口 29 nmap <Leader>q :q<CR> 30 " 定义快捷键保存当前窗口内容 31 nmap <Leader>w :w<CR> 32 " 定义快捷键保存所有窗口内容并退出 vim 33 nmap <Leader>WQ :wa<CR>:q<CR> 34 " 不做任何保存,直接退出 vim 35 nmap <Leader>Q :qa!<CR> 36 37 " 设置快捷键遍历子窗口 38 " 依次遍历 39 nnoremap nw <C-W><C-W> 40 " 跳转至右方的窗口 41 nnoremap <Leader>lw <C-W>l 42 " 跳转至方的窗口 43 nnoremap <Leader>hw <C-W>h 44 " 跳转至上方的子窗口 45 nnoremap <Leader>kw <C-W>k 46 " 跳转至下方的子窗口 47 nnoremap <Leader>jw <C-W>j 48 49 " 定义快捷键在结对符之间跳转 50 nmap <Leader>M % 51 52 " << 53 54 " 让配置变更立即生效 55 autocmd BufWritePost $MYVIMRC source $MYVIMRC 56 57 " >> 58 " 其他 59 60 " 开启实时搜索功能 61 set incsearch 62 63 " 搜索时大小写不敏感 64 set ignorecase 65 66 " 关闭兼容模式 67 set nocompatible 68 69 " vim 自身命令行模式智能补全 70 set wildmenu 71 72 " << 73 74 " >>>> 75 " 插件安装 76 77 " vundle 环境设置 78 filetype off 79 set rtp+=~/.vim/bundle/Vundle.vim 80 " vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间 81 call vundle#begin() 82 83 Plugin 'VundleVim/Vundle.vim' 84 Plugin 'altercation/vim-colors-solarized' 85 Plugin 'tomasr/molokai' 86 Plugin 'vim-scripts/phd' 87 Plugin 'Lokaltog/vim-powerline' 88 Plugin 'octol/vim-cpp-enhanced-highlight' 89 Plugin 'nathanaelkane/vim-indent-guides' 90 Plugin 'derekwyatt/vim-fswitch' 91 Plugin 'kshenoy/vim-signature' 92 Plugin 'vim-scripts/BOOKMARKS--Mark-and-Highlight-Full-Lines' 93 Plugin 'majutsushi/tagbar' 94 Plugin 'vim-scripts/indexer.tar.gz' 95 Plugin 'vim-scripts/DfrankUtil' 96 Plugin 'vim-scripts/vimprj' 97 Plugin 'dyng/ctrlsf.vim' 98 Plugin 'terryma/vim-multiple-cursors' 99 Plugin 'scrooloose/nerdcommenter' 100 Plugin 'vim-scripts/DrawIt' 101 Plugin 'SirVer/ultisnips' 102 Plugin 'derekwyatt/vim-protodef' 103 Plugin 'scrooloose/nerdtree' 104 Plugin 'fholgado/minibufexpl.vim' 105 Plugin 'gcmt/wildfire.vim' 106 Plugin 'sjl/gundo.vim' 107 Plugin 'Lokaltog/vim-easymotion' 108 Plugin 'suan/vim-instant-markdown' 109 Plugin 'Valloric/YouCompleteMe' 110 Plugin 'lilydjwg/fcitx.vim' 111 112 " 插件列表结束 113 call vundle#end() 114 filetype plugin indent on 115 " <<<< 116 117 " 配色方案 118 set background=dark 119 colorscheme solarized 120 "colorscheme molokai 121 "colorscheme phd 122 123 " >> 124 " 营造专注气氛 125 126 " 禁止光标闪烁 127 set gcr=a:block-blinkon0 128 129 " 禁止显示滚动条 130 set guioptions-=l 131 set guioptions-=L 132 set guioptions-=r 133 set guioptions-=R 134 135 " 禁止显示菜单和工具条 136 set guioptions-=m 137 set guioptions-=T 138 139 " 将外部命令 wmctrl 控制窗口最大化的命令行参数封装成一个 vim 的函数 140 fun! ToggleFullscreen() 141 call system("wmctrl -ir " . v:windowid . " -b toggle,fullscreen") 142 endf 143 " 全屏开/关快捷键 144 map <silent> <F11> :call ToggleFullscreen()<CR> 145 "" 启动 vim 时自动全屏 146 "autocmd VimEnter * call ToggleFullscreen() 147 148 " << 149 150 " >> 151 " 辅助信息 152 153 " 总是显示状态栏 154 set laststatus=2 155 156 " 显示光标当前位置 157 set ruler 158 159 " 开启行号显示 160 set number 161 162 " 高亮显示当前行/列 163 set cursorline 164 set cursorcolumn 165 166 " 高亮显示搜索结果 167 set hlsearch 168 169 " << 170 171 " >> 172 " 其他美化 173 174 " 设置 gvim 显示字体 175 set guifont=YaHei Consolas Hybrid 10.5 176 177 " 禁止折行 178 set nowrap 179 180 " 设置状态栏主题风格 181 let g:Powerline_colorscheme='solarized256' 182 183 " << 184 185 " >> 186 " 语法分析 187 188 " 开启语法高亮功能 189 syntax enable 190 " 允许用指定语法高亮配色方案替换默认方案 191 syntax on 192 193 " << 194 195 " >> 196 " 缩进 197 198 " 自适应不同语言的智能缩进 199 filetype indent on 200 201 " 将制表符扩展为空格 202 set expandtab 203 " 设置编辑时制表符占用空格数 204 set tabstop=4 205 " 设置格式化时制表符占用空格数 206 set shiftwidth=4 207 " 让 vim 把连续数量的空格视为一个制表符 208 set softtabstop=4 209 210 " 缩进可视化插件 Indent Guides 211 " 随 vim 自启动 212 let g:indent_guides_enable_on_vim_startup=1 213 " 从第二层开始可视化显示缩进 214 let g:indent_guides_start_level=2 215 " 色块宽度 216 let g:indent_guides_guide_size=1 217 " 快捷键 i 开/关缩进可视化 218 nmap <silent> <Leader>i <Plug>IndentGuidesToggle 219 220 " << 221 222 " >> 223 " 代码折叠 224 225 " 基于缩进或语法进行代码折叠 226 "set foldmethod=indent 227 set foldmethod=syntax 228 " 启动 vim 时关闭折叠代码 229 set nofoldenable 230 231 " << 232 233 " >> 234 " 接口与实现快速切换 235 236 " *.cpp 和 *.h 间切换 237 nmap <silent> <Leader>sw :FSHere<cr> 238 239 " << 240 241 " >> 242 " 代码收藏 243 244 " 自定义 vim-signature 快捷键 245 let g:SignatureMap = { 246 'Leader' : "m", 247 'PlaceNextMark' : "m,", 248 'ToggleMarkAtLine' : "m.", 249 'PurgeMarksAtLine' : "m-", 250 'DeleteMark' : "dm", 251 'PurgeMarks' : "mda", 252 'PurgeMarkers' : "m<BS>", 253 'GotoNextLineAlpha' : "']", 254 'GotoPrevLineAlpha' : "'[", 255 'GotoNextSpotAlpha' : "`]", 256 'GotoPrevSpotAlpha' : "`[", 257 'GotoNextLineByPos' : "]'", 258 'GotoPrevLineByPos' : "['", 259 'GotoNextSpotByPos' : "mn", 260 'GotoPrevSpotByPos' : "mp", 261 'GotoNextMarker' : "[+", 262 'GotoPrevMarker' : "[-", 263 'GotoNextMarkerAny' : "]=", 264 'GotoPrevMarkerAny' : "[=", 265 'ListLocalMarks' : "ms", 266 'ListLocalMarkers' : "m?" 267 } 268 269 " << 270 271 " >> 272 " 标签列表 273 274 " 设置 tagbar 子窗口的位置出现在主编辑区的左边 275 let tagbar_left=1 276 " 设置显示/隐藏标签列表子窗口的快捷键。速记:identifier list by tag 277 nnoremap <Leader>ilt :TagbarToggle<CR> 278 " 设置标签子窗口的宽度 279 let tagbar_width=32 280 " tagbar 子窗口中不显示冗余帮助信息 281 let g:tagbar_compact=1 282 " 设置 ctags 对哪些代码标识符生成标签 283 let g:tagbar_type_cpp = { 284 'ctagstype' : 'c++', 285 'kinds' : [ 286 'c:classes:0:1', 287 'd:macros:0:1', 288 'e:enumerators:0:0', 289 'f:functions:0:1', 290 'g:enumeration:0:1', 291 'l:local:0:1', 292 'm:members:0:1', 293 'n:namespaces:0:1', 294 'p:functions_prototypes:0:1', 295 's:structs:0:1', 296 't:typedefs:0:1', 297 'u:unions:0:1', 298 'v:global:0:1', 299 'x:external:0:1' 300 ], 301 'sro' : '::', 302 'kind2scope' : { 303 'g' : 'enum', 304 'n' : 'namespace', 305 'c' : 'class', 306 's' : 'struct', 307 'u' : 'union' 308 }, 309 'scope2kind' : { 310 'enum' : 'g', 311 'namespace' : 'n', 312 'class' : 'c', 313 'struct' : 's', 314 'union' : 'u' 315 } 316 } 317 318 " << 319 320 " >> 321 " 代码导航 322 323 " 基于标签的代码导航 324 325 " 设置插件 indexer 调用 ctags 的参数 326 " 默认 --c++-kinds=+p+l,重新设置为 --c++-kinds=+l+p+x+c+d+e+f+g+m+n+s+t+u+v 327 " 默认 --fields=+iaS 不满足 YCM 要求,需改为 --fields=+iaSl 328 let g:indexer_ctagsCommandLineOptions="--c++-kinds=+l+p+x+c+d+e+f+g+m+n+s+t+u+v --fields=+iaSl --extra=+q" 329 330 " 正向遍历同名标签 331 nmap <Leader>tn :tnext<CR> 332 " 反向遍历同名标签 333 nmap <Leader>tp :tprevious<CR> 334 335 " 基于语义的代码导航 336 337 nnoremap <leader>jc :YcmCompleter GoToDeclaration<CR> 338 " 只能是 #include 或已打开的文件 339 nnoremap <leader>jd :YcmCompleter GoToDefinition<CR> 340 341 " << 342 343 " >> 344 " 查找 345 346 " 使用 ctrlsf.vim 插件在工程内全局查找光标所在关键字,设置快捷键。快捷键速记法:search in project 347 nnoremap <Leader>sp :CtrlSF<CR> 348 349 " << 350 351 " >> 352 " 内容替换 353 354 " 快捷替换 355 let g:multi_cursor_next_key='<S-n>' 356 let g:multi_cursor_skip_key='<S-k>' 357 358 " 精准替换 359 " 替换函数。参数说明: 360 " confirm:是否替换前逐一确认 361 " wholeword:是否整词匹配 362 " replace:被替换字符串 363 function! Replace(confirm, wholeword, replace) 364 wa 365 let flag = '' 366 if a:confirm 367 let flag .= 'gec' 368 else 369 let flag .= 'ge' 370 endif 371 let search = '' 372 if a:wholeword 373 let search .= '<' . escape(expand('<cword>'), '/.*$^~[') . '>' 374 else 375 let search .= expand('<cword>') 376 endif 377 let replace = escape(a:replace, '/&~') 378 execute 'argdo %s/' . search . '/' . replace . '/' . flag . '| update' 379 endfunction 380 " 不确认、非整词 381 nnoremap <Leader>R :call Replace(0, 0, input('Replace '.expand('<cword>').' with: '))<CR> 382 " 不确认、整词 383 nnoremap <Leader>rw :call Replace(0, 1, input('Replace '.expand('<cword>').' with: '))<CR> 384 " 确认、非整词 385 nnoremap <Leader>rc :call Replace(1, 0, input('Replace '.expand('<cword>').' with: '))<CR> 386 " 确认、整词 387 nnoremap <Leader>rcw :call Replace(1, 1, input('Replace '.expand('<cword>').' with: '))<CR> 388 nnoremap <Leader>rwc :call Replace(1, 1, input('Replace '.expand('<cword>').' with: '))<CR> 389 390 " << 391 392 " 模板补全 393 " UltiSnips 的 tab 键与 YCM 冲突,重新设定 394 let g:UltiSnipsSnippetDirectories=["mysnippets"] 395 let g:UltiSnipsExpandTrigger="<leader><tab>" 396 let g:UltiSnipsJumpForwardTrigger="<leader><tab>" 397 let g:UltiSnipsJumpBackwardTrigger="<leader><s-tab>" 398 399 " >> 400 " YCM 补全 401 402 " YCM 补全菜单配色 403 " 菜单 404 highlight Pmenu ctermfg=2 ctermbg=3 guifg=#005f87 guibg=#EEE8D5 405 " 选中项 406 highlight PmenuSel ctermfg=2 ctermbg=3 guifg=#AFD700 guibg=#106900 407 408 " 补全功能在注释中同样有效 409 let g:ycm_complete_in_comments=1 410 411 " 允许 vim 加载 .ycm_extra_conf.py 文件,不再提示 412 let g:ycm_confirm_extra_conf=0 413 414 " 开启 YCM 标签补全引擎 415 let g:ycm_collect_identifiers_from_tags_files=0 416 "" 引入 C++ 标准库 tags 417 "set tags+=/data/misc/software/app/vim/stdcpp.tags 418 "set tags+=/data/misc/software/app/vim/sys.tags 419 420 " YCM 集成 OmniCppComplete 补全引擎,设置其快捷键 421 inoremap <leader>; <C-x><C-o> 422 423 " 补全内容不以分割子窗口形式出现,只显示补全列表 424 set completeopt-=preview 425 426 " 从第一个键入字符就开始罗列匹配项 427 let g:ycm_min_num_of_chars_for_completion=1 428 429 " 禁止缓存匹配项,每次都重新生成匹配项 430 let g:ycm_cache_omnifunc=0 431 432 " 语法关键字补全 433 let g:ycm_seed_identifiers_with_syntax=1 434 435 " << 436 437 " >> 438 " 由接口快速生成实现框架 439 440 " 成员函数的实现顺序与声明顺序一致 441 let g:disable_protodef_sorting=1 442 443 " << 444 445 " >> 446 " 库信息参考 447 448 " 启用:Man命令查看各类man信息 449 source $VIMRUNTIME/ftplugin/man.vim 450 451 " 定义:Man命令查看各类man信息的快捷键 452 nmap <Leader>man :Man 3 <cword><CR> 453 454 " << 455 456 " >> 457 " 工程文件浏览 458 459 " 使用 NERDTree 插件查看工程文件。设置快捷键,速记:file list 460 nmap <Leader>fl :NERDTreeToggle<CR> 461 " 设置 NERDTree 子窗口宽度 462 let NERDTreeWinSize=22 463 " 设置 NERDTree 子窗口位置 464 let NERDTreeWinPos="right" 465 " 显示隐藏文件 466 let NERDTreeShowHidden=1 467 " NERDTree 子窗口中不显示冗余帮助信息 468 let NERDTreeMinimalUI=1 469 " 删除文件时自动删除文件对应 buffer 470 let NERDTreeAutoDeleteBuffer=1 471 472 " << 473 474 " >> 475 " 多文档编辑 476 477 " 显示/隐藏 MiniBufExplorer 窗口 478 map <Leader>bl :MBEToggle<cr> 479 480 " buffer 切换快捷键 481 map <C-Tab> :MBEbn<cr> 482 map <C-S-Tab> :MBEbp<cr> 483 484 " << 485 486 487 " >> 488 " 环境恢复 489 490 " 设置环境保存项 491 set sessionoptions="blank,globals,localoptions,tabpages,sesdir,folds,help,options,resize,winpos,winsize" 492 493 " 保存 undo 历史。必须先行创建 .undo_history/ 494 set undodir=~/.undo_history/ 495 set undofile 496 497 " 保存快捷键 498 "map <leader>ss :mksession! my.vim<cr> :wviminfo! my.viminfo<cr> 499 map <leader>ss :mksession! my.vim<cr> 500 501 " 恢复快捷键 502 "map <leader>rs :source my.vim<cr> :rviminfo my.viminfo<cr> 503 map <leader>rs :source my.vim<cr> 504 505 " << 506 507 " 设置快捷键实现一键编译及运行 508 nmap <Leader>m :wa<CR> :cd build/<CR> :!rm -rf main<CR> :!cmake CMakeLists.txt<CR>:make<CR><CR> :cw<CR> :cd ..<CR> 509 nmap <Leader>g :wa<CR>:cd build/<CR>:!rm -rf main<CR>:!cmake CMakeLists.txt<CR>:make<CR><CR>:cw<CR>:cd ..<CR>:!build/main<CR> 510 511 " >> 512 " 快速选中结对符内的文本 513 514 " 快捷键 515 map <SPACE> <Plug>(wildfire-fuel) 516 vmap <S-SPACE> <Plug>(wildfire-water) 517 518 " 适用于哪些结对符 519 let g:wildfire_objects = ["i'", 'i"', "i)", "i]", "i}", "i>", "ip"] 520 521 " << 522 523 " 调用 gundo 树 524 nnoremap <Leader>ud :GundoToggle<CR>
(3)安装插件
//先找到其在 github.com 的地址,再将配置信息其加入 .vimrc 中的call vundle#begin() 和 call vundle#end() 之间,最后进入 vim 执行 :PluginInstall //要卸载插件,先在 .vimrc 中注释或者删除对应插件配置信息,然后在 vim 中执行 :PluginClean //插件更新频率较高,差不多每隔一个月你应该看看哪些插件有推出新版本,批量更新,只需执行 :PluginUpdate
安装完成后,执行vim,可能会报错:
Indexer error: Exuberant Ctags not found in PATH. You need to install Ctags to make Indexer work. ==> sudo apt-get install ctags socket file of fcitx not found, fcitx.vim not loaded. ==> 需要安装 fcitx,详见步骤(4) The ycmd server SHUT DOWN (restart with ':YcmRestartServer'). YCM core library not detected; you need to compile YCM before using it. Follow the instructions in the documentation. ==> cd .vim/bundle/YouCompleteMe/ ./install.py ERROR: Unable to find executable 'cmake'. CMake is required to build ycmd ==> sudo apt-get install cmake ./install.py Searching Python 2.7 libraries... ERROR: Python headers are missing in /usr/include/python2.7. ==> dpkg --get-selections | grep python-dev //查看是否安装python ls /usr/include/python2.7/ //查看是否有Python.h sudo apt-get install python-dev ./install.py
(4)安装 fcitx 输入法
参考:https://www.cnblogs.com/jecyhw/p/4166486.html
socket file of fcitx not found, fcitx.vim not loaded. ==> //ubuntu 默认是安装了ibus,可以先删除 sudo apt-get remove ibus //删除已安装的fcitx sudo apt-get remove fcitx* //删除依赖库 sudo apt-get autoremove //检测是否删除fcitx dpkg --get-selections | grep fcitx //删除fcitx相关配置文件 dpkg --purge `dpkg --get-selections | grep deinstall | cut -f1`; //添加源 sudo add-apt-repository ppa:fcitx-team/nightly //更新源 sudo apt-get update //安装fcitx输入法 sudo apt-get install fcitx fcitx-config-gtk fcitx-sunpinyin fcitx-googlepinyin fcitx-module-cloudpinyin im-config //设置fcitx为默认输入法 sudo im-config -s fcitx -z default //安装搜狗输入法,下载链接 http://pinyin.sogou.com/linux/ sudo dpkg -i /home/cindy/work/sogoupinyin_2.2.0.0108_amd64.deb dpkg: error processing package sogoupinyin (--install): dependency problems - leaving unconfigured ==>
sudo apt-get -f install //修复损坏的软件包,尝试卸载出错的包,重新安装正确版本的 sudo dpkg -i /home/cindy/work/sogoupinyin_2.2.0.0108_amd64.deb
配置 fcitx