当前位置: 首页 > 工具软件 > vim-ft-go > 使用案例 >

vim8.0 c++开发环境配置

晁英彦
2023-12-01

说明: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'

 类似资料: