说明:centos8 最小安装,vim8.0
1、管理插件
vim-plug安装:
# curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
# vim ~/.vimrc
在.vimrc文件头添加:
call plug#begin('~/.vim/plugged')
Plug 'itchyny/lightline.vim'
call plug#end()
执行:source ~/.vimrc 重新加载配置
vim-plug操作(在 vim 中使用的命令):
PlugInstall 安装
PlugUpdate 更新
PlugStatus 检查插件状态
PlugClean 清理.vimrc 里面删除或注释掉的插件
PlugUpgrade 升级自身
2、配色方案(可选)
创建~/.vim/colors目录:
# mkdir ~/.vim/colors
下载或编辑配色方案的.vim文件,保存到~/.vim/colors目录下
修改Vim配置文件~/.vimrc,添加或修改:
colorscheme gruvbox " gruvbox 为配色方案名
3、安装universal-ctags
下载:
# git clone https://github.com/universal-ctags/ctags.git
安装:
# cd ctags
# ./autogen.sh
# ./configure --prefix=/usr/local/universal-ctags # 我的安装路径。你按自己的情况调整。
# make
# make install
建立新的连接
# mv /usr/bin/ctags /usr/local/ctags_bak
# ln -s /usr/local/universal-ctags/bin/ctags /usr/bin/ctags
在配置文件 ~/.vimrc 中添加:
set tags=./.tags;,.tags
set autochdir
let g:gutentags_ctags_extra_args = []
let g:gutentags_ctags_extra_args = ['--fields=+niazS', '--extra=+q']
let g:gutentags_ctags_extra_args += ['--c++-kinds=+pxI']
let g:gutentags_ctags_extra_args += ['--c-kinds=+px']
4、自动索引
在配置文件 ~/.vimrc 中增加配置项 Plug 'ludovicchabant/vim-gutentags'
在vim命令行模式下执行命令 :PlugInstall 即可完成vim-gutentags插件的安装
配置~/.vimrc 文件:
" gutentags搜索工程目录的标志,碰到这些文件/目录名就停止向上一级目录递归 "
let g:gutentags_project_root = ['.root', '.svn', '.git', '.project']
" 所生成的数据文件的名称 "
let g:gutentags_ctags_tagfile = '.tags'
" 将自动生成的 tags 文件全部放入 ~/.cache/tags 目录中,避免污染工程目录 "
let s:vim_tags = expand('~/.cache/tags')
let g:gutentags_cache_dir = s:vim_tags
" 检测 ~/.cache/tags 不存在就新建 "
if !isdirectory(s:vim_tags)
silent! call mkdir(s:vim_tags, 'p')
endif
" 如果使用 universal ctags 需要增加下面一行
let g:gutentags_ctags_extra_args += ['--output-format=e-ctags']
" 避免多个项目 数据库 相互干扰,使用plus插件解决问题
let g:gutentags_auto_add_gtags_cscope = 0
" change focus to quickfix window after search (optional).
let g:gutentags_plus_switch = 1
5、LeaderF模糊搜索
在配置文件 ~/.vimrc 中增加配置项 Plug 'Yggdroot/LeaderF'
在vim命令行模式下执行命令 :PlugInstall 即可完成LeaderF插件的安装
配置~/.vimrc 文件:
" -----------LeaderF 模糊文件查找-------------------------------
" Ctrl + p 打开文件搜索
let g:Lf_ShortcutF = '<c-p>'
noremap <Leader>ff :LeaderfFunction<cr>
noremap <Leader>fb :LeaderfBuffer<cr>
noremap <Leader>ft :LeaderfTag<cr>
noremap <Leader>fm :LeaderfMru<cr>
noremap <Leader>fl :LeaderfLine<cr>
let g:Lf_StlSeparator = { 'left': '', 'right': '', 'font': '' }
let g:Lf_RootMarkers = ['.project', '.root', '.svn', '.git']
let g:Lf_WorkingDirectoryMode = 'Ac'
let g:Lf_WindowHeight = 0.30
let g:Lf_CacheDirectory = expand('~/.vim/cache')
let g:Lf_ShowRelativePath = 0
let g:Lf_HideHelp = 1
let g:Lf_StlColorscheme = 'powerline'
let g:Lf_PreviewResult = {'Function':0, 'BufTag':0}
let g:Lf_NormalMap = {
\ "File": [["<ESC>", ':exec g:Lf_py "fileExplManager.quit()"<CR>']],
\ "Buffer": [["<ESC>", ':exec g:Lf_py "bufExplManager.quit()"<CR>']],
\ "Mru": [["<ESC>", ':exec g:Lf_py "mruExplManager.quit()"<CR>']],
\ "Tag": [["<ESC>", ':exec g:Lf_py "tagExplManager.quit()"<CR>']],
\ "Function": [["<ESC>", ':exec g:Lf_py "functionExplManager.quit()"<CR>']],
\ "Colorscheme": [["<ESC>", ':exec g:Lf_py "colorschemeExplManager.quit()"<CR>']],
\ }
快捷键 操作意义
ctrl+p 全project模糊查找文件名,代替NERDTree
;+ff 当前文件的函数列表,代替TagBar
;+fb 查找vim打开过的buffer,代替Tabbar
;+fl 在当前文件内容中进行search,和vim自带相比,它是异步的,单独windows中呈现结果
;+ft 从全project的tags中模糊查找函数名,刚需中的刚需
6、ALE动态检查
let g:ale_linters_expicit = 1
let g:ale_linters = {
\ 'cpp':['gcc','clang','cppcheck'],
\ 'c':['gcc','clang','cppcheck']}
let g:ale_sign_column_always = 1 " 总是显示动态检查结果
let g:ale_completion_delay = 500
let g:ale_echo_delay = 20
let g:ale_lint_delay = 500
let g:ale_lint_on_text_changed = 'normal' " 代码更改后启动检查
let g:ale_lint_on_insert_leave = 1 " 退出插入模式即检查
let g:airline#extensions#ale#enabled = 1
let g:ale_set_quickfix = 1
"let g:ale_open_list = 1 " 打开quitfix对话框
"let g:ale_c_gcc_options = '-Wall -O2 -std=c99'
"let g:ale_cpp_gcc_options = '-Wall -O2 -std=c++11'
"let g:ale_c_cppcheck_options = ''
"let g:ale_cpp_cppcheck_options = ''
let g:ale_echo_msg_format = '[%linter%] %code: %%s' " 告警显示格式
let g:ale_sign_error = ">>" " error 告警符号
let g:ale_sign_warning = "--" " warning 告警符号
let g:ale_echo_msg_error_str = 'E' " 错误显示字符
let g:ale_echo_msg_warning_str = 'W' " 警告显示字符
" <F9> 触发/关闭代码动态检查
map <F7> ::ALEToggle<CR>
"普通模式下,ak 前往上一个错误或警告,aj 前往下一个错误或警告
nmap ak <Plug>(ale_previous_wrap)
nmap aj <Plug>(ale_next_wrap)
" ad 查看错误或警告的详细信息
nmap ad :ALEDetail<CR>
7、代码自动补全
安装:
在配置文件 ~/.vimrc 中增加配置项
Plug 'dense-analysis/ale'
Plug 'majutsushi/tagbar', {'on': 'TagbarToggle'}
在vim命令行模式下执行命令 :PlugInstall
# cd .vim/plugged/YouCompleteMe
# python3 install.py --clang-completer
如果因 libclang-9.0.0-x86_64-unknown-linux-gnu.tar.bz2 的hash值失败,手动下载
# cd third_party/ycmd/clang_archives/
# rm -f libclang-9.0.0-x86_64-unknown-linux-gnu.tar.bz2
# wget https://dl.bintray.com/micbou/libclang/libclang-9.0.0-x86_64-unknown-linux-gnu.tar.bz2
返回ycm根目录,从新编译
# cd ../../../
# python3 install.py --clang-completer
编译完成后
# cp third_party/ycmd/.ycm_extra_conf.py ~/
配置~/.ycm_extra_conf.py文件:
在flags数组中添加:
'-isystem',
'/usr/include',
'-isystem',
'/usr/local/include',
'-isystem',
'/usr/include/c++/8' # 我的目录
配置~/.vimrc 文件:
" tagbar
let g:tagbar_width = 30
nmap <F8> :TagbarToggle<CR>
" YouCompleteMe
" 设置.ycm_extra_conf.py的全局路径
let g:ycm_global_ycm_extra_conf= '~/.ycm_extra_conf.py'
" 打开vim时不再询问是否加载ycm_extra_conf.py配置"
let g:ycm_confirm_extra_conf=0
" 语法关键字补全
let g:ycm_seed_identifiers_with_syntax = 1
" 使用ctags生成的tags文件
let g:ycm_collect_identifiers_from_tags_files = 1
" 每次重新生成匹配项,禁止缓存匹配项
let g:ycm_cache_omnifunc = 1
" 在注释中也可以补全
let g:ycm_complete_in_comments=1
" 字符串自动补全
let g:ycm_complete_in_strings = 1
" 错误标识符
let g:ycm_error_symbol='>>'
" 警告标识符
let g:ycm_warning_symbol='>*'
" 高亮显示代码中与诊断信息有关的文本或代码,0表示关闭
let g:ycm_enable_diagnostic_highlighting = 1
" 当光标移到所在行时显示诊断信息
let g:ycm_echo_current_diagnostic = 1
" 在强制编译后自动打位置列表并用诊断信息填充,
" 所谓位置列表就是标出各错误或警告对应在哪些行的小窗口,
" 可以实现直接跳转到错误行
let g:ycm_open_loclist_on_ycm_diags = 1
" 诊断信息关闭
let g:ycm_show_diagnostics_ui = 0
" 设置YCM的日志记录级别,可以是debug,info,warning,error或critical。debug是最详细的
let g:ycm_server_log_level = 'info'
" 收集注释中的文集来分析用于补全
let g:ycm_collect_identifiers_from_comments_and_strings = 1
" 关闭补全列表的快捷键,默认为ctrl+y
let g:ycm_key_invoke_completion = '<C-y>'
set completeopt=menu,menuone
" 使用 Ctrl+y 主动触发语义补全
noremap <C-y> <NOP>
" 为ycm服务器指定特定的python解释器,默认为空表示在系统上搜索适当的Python解释器
" let g:ycm_server_python_interpreter = '/usr/bin/python3'
" 指定用来运行jedi补全库的Python解释器。默认情况下与ycm服务器使用相同的解释器
" let g:ycm_python_binary_path = 'python3'
" 输入1个字符后开始补全
let g:ycm_min_num_identifier_candidate_chars = 1
let g:ycm_server_keep_logfiles = 1
" 为当前补全选项在vim顶部增加预览窗口,用来显示函数原型等信息
let g:ycm_add_preview_to_completeopt = 0
" 选中补全选项后自动关闭预览窗口,
" 当g:ycm_add_preview_to_completeopt设为1时或者vim的completeopt设为preview有效
let g:ycm_autoclose_preview_window_after_completion = 1
" 离开插入模式后自动关闭预览窗口,
" 当g:ycm_add_preview_to_completeopt设为1时或者vim的completeopt设为preview有效
let g:ycm_autoclose_preview_window_after_insertion = 1
" 语义补全的最大候选项数量,0表示没有限制
let g:ycm_max_num_candidates = 17
" 标识符补全的最大候选项数量,0表示没有限制
let g:ycm_max_num_identifier_candidates = 7
" 让Vim的补全菜单行为与一般IDE一致(参考VimTip1228)
nnoremap <leader>j :YcmCompleter GoToDeclaration<CR>
nnoremap <leader>k :YcmCompleter GoToDefinition<CR>
nnoremap <leader>l :YcmCompleter GoToDefinitionElseDeclaration<CR>
nnoremap <F6> :YcmForceCompileAndDiagnostics<CR>
" 在插入模式下按两下leader退出插入模式
"inoremap <leader><leader> <Esc>:w<CR>
" 在正常模式下按两下leader进入插入模式
"noremap <leader><leader> a
"inoremap <leader>x <Esc>xa
" 文件类型白名单,vim打开这些类型文件时会开启YCM。*表示所有文件类型
let g:ycm_filetype_whitelist = {
\ "c":1,
\ "cpp":1,
\ "go":1,
\ "python":1,
\ "sh":1,
\ "zsh":1,
\ }
" 文件类型黑名单,vim打开这些类型文件时会关闭YCM
let g:ycm_filetype_blacklist = {
\ 'tagbar' : 1,
\ 'nerdtree' : 1,
\}
" 语义触发器的关键字
let g:ycm_semantic_triggers = {
\ 'c' : ['->', '.'],
\ 'objc' : ['->', '.'],
\ 'cpp,objcpp' : ['->', '.', '::'],
\ 'perl' : ['->'],
\ 'php' : ['->', '::'],
\ 'cs,java,javascript,d,vim,ruby,python,perl6,scala,vb,elixir,go' : ['.'],
\ 'lua' : ['.', ':'],
\ 'erlang' : [':'],
\ 'css' : ['re!^\s{4}', 're!:\s+'],
\ 'html' : ['</'],
\ }
8、参数提示
Plug 'Shougo/echodoc.vim'
.vimrc 配置
set noshowmode
"set cmdheight=2
let g:echodoc_enable_at_startup = 1
9、代码格式化
Plug 'rhysd/vim-clang-format'
.vimrc 配置
let g:clang_format#auto_format_on_insert_leave=1 " 退出插入模式时自动格式化
.clang-format 配置
在用户跟目录下执行:
clang-format -style=google -dump-config > .clang-format
修改.clang-format文件中一下项:
AccessModifierOffset: -4
IndentWidth: 4
Standard: Cpp11
TabWidth: 4
UseTab: Always
10、其他
" 括号自动补全
Plug 'jiangmiao/auto-pairs'
" 目录结构展示插件
Plug 'scrooloose/nerdtree'
Plug 'Xuyuanp/nerdtree-git-plugin'
" 代码快速对齐
Plug 'junegunn/vim-easy-align'
" 异步执行插件
Plug 'skywind3000/asyncrun.vim'
" vim列对齐线
Plug 'Yggdroot/indentLine'