4. 插件

主要是c++相关的. ~/.vimrc文件在GitHub上有:https://github.com/whuwzp/vim_config

以下内容参考: https://github.com/yangyangwithgnu/use_vim_as_ide

另外一些插件的配置文件也都放在: https://github.com/whuwzp/vim_config

4.1 vundle插件管理器

git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim
  1. 在 .vimrc 增加相关配置信息


    " vundle 环境设置
    filetype off
    set rtp+=~/.vim/bundle/Vundle.vim
    " vundle 管理的插件列表必须位于 vundle#begin() 和 vundle#end() 之间
    call vundle#begin()
    Plugin 'VundleVim/Vundle.vim'
    Plugin 'dyng/ctrlsf.vim' " 插件列表结束
    call vundle#end()
    filetype plugin indent on

    其中,每项Plugin 'dyng/ctrlsf.vim',对应一个插件(这与 go 语言管理不同代码库的机制类似),后续若有新增插件,只需追加至该列表中即可。

  2. 安装插件:

    先找到其在 github.com 的地址,再将配置信息其加入 .vimrc 中的call vundle#begin() 和 call vundle#end() 之间,如Plugin 'dyng/ctrlsf.vim', 最后进入 vim 执行:PluginInstall

  3. 删除插件

    要卸载插件,先在 .vimrc 中注释或者删除对应插件配置信息,然后在 vim 中执行::PluginClean即可删除对应插件。

  4. 更新插件

    更新频率较高,差不多每隔一个月你应该看看哪些插件有推出新版本,批量更新,只需执行:PluginUpdate

4.2 补全类插件

Plugin 'Valloric/YouCompleteMe'
Plugin 'derekwyatt/vim-protodef'
Plugin 'SirVer/ultisnips'

4.2.1 YouCompleteMe语义补全

安装参见上面. 以下是配置:

" Youcompleteme                                    语义补全
" 菜单
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
" 开启 YCM 标签补全引擎
let g:ycm_collect_identifiers_from_tags_files=1
" 引入 C++ 标准库tags
" set tags+=/usr/include/c++/7/stdcpp.tags, 我只使用clang中的就好
set tags+=/usr/local/include/c++/v1/clang.tags
" set tags+=/usr/include/sys.tags,这个太大了了
" YCM 集成 OmniCppComplete 补全引擎,设置其快捷键
inoremap <leader>; <C-x><C-o>
" 补全内容不以分割子窗口形式出现,只显示补全列表
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 OmniCpp_DefaultNamespaces = ["_GLIBCXX_STD"]
" 设置用于关闭补全列表的快捷键,默认为ctrl+y, 改为了;'
let g:ycm_key_list_stop_completion = ["<leader>'"]

4.2.2 vim-protodef接口实现补全

配置

在h中声明,然后cpp中用插件帮我们生成实现函数的壳子.

Plugin 'derekwyatt/vim-fswitch'
Plugin 'derekwyatt/vim-protodef' " 设置 pullproto.pl 脚本路径
" 原博客是这个,但是我的路径是vim-protodef,所以改了
" let g:protodefprotogetter='~/.vim/bundle/protodef/pullproto.pl'
let g:protodefprotogetter='~/.vim/bundle/vim-protodef/pullproto.pl'
" 成员函数的实现顺序与声明顺序一致
let g:disable_protodef_sorting=1

使用示例:

  1. 编辑h文件
    class MyClass
    {
    public:
    void printMsg (int = 16);
    virtual int getSize (void) const;
    virtual void doNothing (void) const = 0;
    virtual ~MyClass ();
    private:
    int num_;
    };
  2. 新建同名cpp文件

    用快捷键P, 我们的设定是;P即可生成如下内容:
    int MyClass::getSize(void) const
    {
    return 0;
    } void MyClass::youprint(int)
    {
    } MyClass::~MyClass()
    {
    }
  • 优点一: virtual、默认参数等应在函数声明而不应在函数定义中出现的关键字,protodef 已为你过滤;
  • 优点二:doNothing() 这类纯虚函数不应有实现的自动被 protodef 忽略

使用

在h中定义class,然后新建同名cpp, 用快捷键<leader>PP,我的是;PP生成对应cpp内容.

4.2.3 ultisnips模板补全

配置

" SirVer/ultisnips 模板补全

" mysnippets默认路径: ~/.vim/bundle/ultisnips/mysnippets/cpp.snippets

let g:UltiSnipsSnippetDirectories=["~/.mysnippets"]

" UltiSnips 的 tab 键与 YCM 冲突,重新设定

let g:UltiSnipsExpandTrigger=""

let g:UltiSnipsJumpForwardTrigger=""

let g:UltiSnipsJumpBackwardTrigger=""

注意: 编辑~/.mysnippets/cpp.snippets可以修改模板,改到这个位置,相当于程序和配置分离,这样可以方便推送到GitHub上保存,换个环境也可以直接用了

使用

按照博客设置即可, 按;<tab>就可以, 再按一次就可以跳到下一个位置, 例如if(1){2}.

按照该博客的设置,有如下快捷:

  • INC: #include""
  • inc: #include<>
  • if: if语句
  • ei: else if语句
  • el: else 语句
  • re: return
  • do: do while语句
  • wh: while语句
  • sw: switch语句
  • for: for语句(大小写for组合出多种场景,试试)
  • : try catch
  • set map lst vec: 试试就知道了,对应容器的
  • cl: class
  • b: ()
  • st: []
  • br: {}
  • q: ""
  • se: ''
  • ar: ->, 这个是arrow

剩下的感觉效果不大这里不记了.

注意:snippet b "bracket" I这里的I表示只有遇到整词b才会补全,printfb这样的就不会, 如果改成i就会遇到b字符就补全

4.3 主题颜色类

Plugin 'vim-airline/vim-airline'
Plugin 'vim-airline/vim-airline-themes'
Plugin 'tomasr/molokai'

4.3.1 vim-airline和vim-airline-themes

配置

let g:airline#extensions#tabline#enabled = 1
let g:airline_theme='molokai'

4.3.2 molokai

配置

set background=dark
set t_Co=256
colorscheme molokai

4.4 代码高亮注释格式化类

Plugin 'octol/vim-cpp-enhanced-highlight'
Plugin 'nathanaelkane/vim-indent-guides'
Plugin 'crooloose/nerdcommenter'
Plugin 'vim-clang-format'

4.4.1 vim-cpp-enhanced-highlight高亮

" vim-cpp-enhanced-highlight                        cpp语法高亮
let g:cpp_class_scope_highlight = 1
let g:cpp_member_variable_highlight = 1
let g:cpp_class_decl_highlight = 1
let g:cpp_posix_standard = 1
let g:cpp_concepts_highlight = 1
let g:cpp_no_function_highlight = 1
let g:cpp_experimental_simple_template_highlight = 1
syntax keyword cppSTLtype initializer_list

注意: 需要确保以下内容:

" 开启文件类型侦测 filetype on " 根据侦测到的不同类型加载对应的插件 filetype plugin on

4.4.2 vim-indent-guides缩进

" vim-indent-guides                                   缩进显示
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 <silent> <Leader>i <Plug>IndentGuidesToggle

4.4.3 clang-format 格式化

参考官网上有详细介绍配置:https://clang.llvm.org/docs/ClangFormatStyleOptions.html

"clang-format                                          代码风格格式化
" map to <Leader>cf in C++ code
" 可以在~/.clang-format中编辑更加详细的设置
set ts=4
" 退出insert模式时自动格式化, 如果加了这个那么ultisnip插件就会受影响,因为模板补全后会由insert变为select,这样会同时触发clang-format和ultisnip
" let g:clang_format#auto_format_on_insert_leave=1
autocmd FileType c,cpp,objc nnoremap <buffer><Leader>cf :<C-u>ClangFormat<CR>
autocmd FileType c,cpp,objc vnoremap <buffer><Leader>cf :ClangFormat<CR>

注意:

  1. 需要安装 clang-format
    apt install clang-format
  2. 可以新建~/.clang-format具体配置格式, 参考文件保存在: https://github.com/whuwzp/vim_config

4.4.4 nerdcommenter代码注释

" 默认<leader>cc, <leader>cu

4.5 内容搜索替换

Plugin 'dyng/ctrlsf.vim'
Plugin 'mileszs/ack.vim'
Plugin 'yegappan/grep'
Plugin 'terryma/vim-multiple-cursors'
Plugin 'ctrlpvim/ctrlp.vim'

4.5.1 vim-multiple-cursors多选

" vim-multiple-cursors                          选中多选
" 默认是ctrl+N,这里不修改
" let g:multi_cursor_next_key='<S-n>'
" let g:multi_cursor_skip_key='<S-k>'

我想将 prtHelpInfo() 集体更名为 showHelpInfo(),先通过 ctrlsf 找到工程中所有 prtHelpInfo,然后直接在 ctrlsf 子窗口中选中第一个 ptr,再通过 vim-multiple-cursors 选中第二个 ptr(在子窗口按CTRL+n选中下一个),然后ESC, insert, 进入编辑模式, 接着统一删除 ptr 并统一键入 show,最后保存并重新加载替换后的文件(:wq, Y, L)。

4.5.2 ctrlsf.vim查找

" ctrlsf.vim                                      搜索
" 插件在工程内全局查找光标所在关键字,设置快捷键。快捷键速记法:search in project
noremap <Leader>sp :CtrlSF<CR>

注意: 需要安装grep-ack工具

sudo apt install grep-ack

4.5.3 ctrlp.vim查找

官方中文版使用说明:~/.vim/bundle/ctrlp.vim/doc/ctrlp.cnx

" 当前文件所在目录
nnoremap <leader>fl :CtrlP %:h<cr>
" 当前用户目录
nnoremap <leader>fu :CtrlP ~<cr>
" 自定义目录
nnoremap <leader>fd :CtrlP
" buffer
nnoremap <leader>fb :CtrlPBuffer<cr>
" mixed mode
nnoremap <leader>fm :CtrlPMixed<cr>
" history
nnoremap <leader>fh :CtrlPMRU

- 更新目录缓存。

-<ctrl+f> / <ctrl+b> f(forward),b指backward,切换成前一个或后一个搜索模式

-<ctrl+d> 在”完整路径匹配“ 和 ”文件名匹配“ 之间切换

-<ctrl+r> 在“字符串模式” 和 “正则表达式模式” 之间切换

-<ctrl+j> / <ctrl+k> 上下移动光标

-<ctrl+t> 在新的 tab 打开文件

4.6 ctags标签书签相关

" ctags标签书签相关
Plugin 'majutsushi/tagbar'
Plugin 'vim-scripts/indexer.tar.gz'
Plugin 'vim-scripts/DfrankUtil'
Plugin 'vim-scripts/vimprj'
Plugin 'kshenoy/vim-signature'
Plugin 'ludovicchabant/vim-gutentags'
Plugin 'skywind3000/gutentags_plus'

注意:需要安装ctags, sudo apt install ctags

原理是在工程目录下生成名为tags的文件,根据该文件跳转。

  1. 安装
    sudo apt install ctags
  2. 生成tags文件
    cd /data/workplace/example/
    ctags -R --c++-kinds=+p+l+x+c+d+e+f+g+m+n+s+t+u+v --fields=+liaS --extra=+q --language-force=c++

    这个命令就是生成tags文件,还有很多,参照:https://blog.csdn.net/foreverling/article/details/80329586

    然后让vim知道tags路径,在vim命令模式下输入:

    :set tags+=/data/workplace/example/tags
  3. 使用

    先要在vim命令模式中加上面的那句.

    • CTRL+]: 向前跳转,跳到定义处
    • CTRL+t: 向后跳转
    • g]: 查找函数等的定义(go), 会罗列几个,输入数字选择
    • ;tn: 正向遍历同名标签
    • ;tp: 反向遍历同名标签

以下是为tn和tp设置的快捷键:

" 正向遍历同名标签
nmap <Leader>tn :tnext<CR>
" 反向遍历同名标签
nmap <Leader>tp :tprevious<CR>

4.6.1 indexer自动更新标签

用这个就不用手动生成更新tags文件了.

" 修改ctags生成tags文件的参数
let g:indexer_ctagsCommandLineOptions="--c++-kinds=+p+l+x+c+d+e+f+g+m+n+s+t+u+v --fields=+iaSl --extra=+q"

注意: indexer 还要自己的配置文件,用于设定各个工程的根目录路径,配置文件位于 ~/.indexer_files,内容可以设定为:

    --------------- ~/.indexer_files ---------------
[foo]
/data/workplace/foo/src/
[bar]
/data/workplace/bar/src/
只有添加了目录才会自动生成更新tags文件(buffer中的估计是,没有落地成文件).

注意: 必须用全路径,万万不要用~/test/,要用/home/username/test/

4.6.2 tagbar标签栏

" tagbar                                              标签窗口
" 设置 tagbar 子窗口的位置出现在主编辑区的左边
let tagbar_left=1
" 设置显示/隐藏标签列表子窗口的快捷键。速记:tag bar
nnoremap <Leader>tb :TagbarToggle<CR>
" 设置标签子窗口的宽度
let tagbar_width=16
" tagbar 子窗口中不显示冗余帮助信息
let g:tagbar_compact=1
" 自动设置焦点在tagbar
let g:tagbar_autofocus = 1
" 设置自动打开tagbar
" autocmd BufReadPost *.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen()

za,zr,zm和之前的折叠展开一样, 快捷键如下, 参照: http://aiezu.com/article/linux_vim_golang_tagbar_nerdtree.html

常用命令

  • 回车: 转到标签定义处,并且光标跳转到标签定义处;
  • p: 转到标签定义处,但光标停留在Tagbar的窗口;
  • P: 在预览窗口显示标签;
  • : 跳到下一个上级标签;
  • : 跳到上一个上级标签;
  • : 显示标签定义;

4.6.3 signature书签收藏

" vim-signature                                   收藏书签
let g:SignatureMap = {
\ 'Leader' : "m",
\ 'PlaceNextMark' : "m,",
\ 'ToggleMarkAtLine' : "m.",
\ 'PurgeMarksAtLine' : "m-",
\ 'DeleteMark' : "dm",
\ 'PurgeMarks' : "mda",
\ 'PurgeMarkers' : "m<BS>",
\ 'GotoNextLineAlpha' : "']",
\ 'GotoPrevLineAlpha' : "'[",
\ 'GotoNextSpotAlpha' : "`]",
\ 'GotoPrevSpotAlpha' : "`[",
\ 'GotoNextLineByPos' : "]'",
\ 'GotoPrevLineByPos' : "['",
\ 'GotoNextSpotByPos' : "mn",
\ 'GotoPrevSpotByPos' : "mp",
\ 'GotoNextMarker' : "[+",
\ 'GotoPrevMarker' : "[-",
\ 'GotoNextMarkerAny' : "]=",
\ 'GotoPrevMarkerAny' : "[=",
\ 'ListLocalMarks' : "ms",
\ 'ListLocalMarkers' : "m?"
\ }

常用命令:

  • mx:设定/取消当前行名为 x 的标签
  • m,: 自动设定下一个可用书签名
  • mn: 跳转到下一个书签
  • mp: 跳转至上一个书签
  • mda: 删除所有的书签,marks del all

4.7 结对符相关

Plugin 'gcmt/wildfire.vim'
Plugin 'tpope/vim-surround'

4.7.1 wildfire.vim结对符内容选中

" 快捷键

map (wildfire-fuel)

vmap (wildfire-water)

" 适用于哪些结对符

let g:wildfire_objects = ["i'", 'i"', "i)", "i]", "i}", "ip", "it"]

我只需按下空格(normal模式下),自动选中光标所在区域最近的一层结对符内的文本,如果没有结对符,则选择最近的一个段落。

使用:

  • <space>:在normal模式下(因为是nmap)空格,选中第一层,多按几次就选上一层
  • ;<space>:取消选中(原博客是),但是估计是shift+space这个快捷键被占用了

4.7.2 vim-surround选中内容加结对符

vmap " S"
vmap ' S'
vmap ` S`
vmap [ S[
vmap ( S(
vmap { S{
vmap } S}
vmap ] S]
vmap ) S)
vmap > S>

选中内容,然后按自己想要的结对符即可.

4.8 其他

Plugin 'derekwyatt/vim-fswitch'

Plugin 'scrooloose/nerdtree'

4.8.1 vim-fswitch在h和cpp中切换

" *.cpp 和 *.h 间切换
nmap <silent> <Leader>sw :FSHere<cr>

初始状态先打开了接口文件 MyClass.h,键入 ;sw 后,vim 在新 buffer 中打开实现文件 MyClass.cpp,并在当前窗口中显示;再次键入 ;sw 后,当前窗口切回接口文件。

4.8.2 nerdtree项目文档查看

介于ctrlp功能和展示都比较方便好, 已经不再使用nerdtree, 用ctrlp代替, nerdtree的一大缺点是占用了buffer,给buffer切换带来麻烦.

Plugin 'scrooloose/nerdtree'
" 使用 NERDTree 插件查看工程文件。设置快捷键,速记:file list
nmap <Leader>fl :NERDTreeToggle<CR>
" 以下是新加的,在nerdtree github说明中找到的,设置成vim启动自动打开列表
autocmd vimenter
-NERDTree

常用命令:

键入 fl 后,右边子窗口为工程项目文件列表,其他使用如下:

  • 回车:打开选中文件
  • r:刷新工程目录文件列表
  • I(大写):显示/隐藏隐藏文件
  • m: 出现创建/删除/剪切/拷贝操作列表

Linux c++ vim环境搭建系列(4)——vim插件安装配置使用的更多相关文章

  1. mac OS X下Java项目环境搭建+IntelliJ IDEA Jrebel插件安装与破解+Office 2016破解版安装

    一.mac OS X下Java项目环境搭建 因为某些原因新入手了台最新版的MacBook Pro,意味着今天要花一天时间安装各种软件以及项目环境搭建╮(╯▽╰)╭ 项目环境搭建步骤: 1.安装jdk ...

  2. OpenStack-Ocata版+CentOS7.6 云平台环境搭建 — 8.仪表盘 Dashboard(horizon)安装配置

    仪表盘Dashboard(horizon)是一个web接口,使得云平台管理员以及用户可以管理不同的Openstack资源以及服务.这个部署示例使用的是 Apache Web 服务器. 节点配置信息说明 ...

  3. Linux c++ vim环境搭建系列(5)——vim使用

    5. 使用 5.1 快捷键及设置 5.1.1 光标移动 w : 正向移动到相邻单词的首字符 b : 逆向移动到相邻单词的首字符 e : 正向移动到相邻单词的尾字符 ge : 逆向移动到相邻单词的尾字符 ...

  4. Linux c++ vim环境搭建系列(3)——Ubuntu18.04.4编译安装youcompleteme

    3. youcompleteme编译安装 参考网址: https://github.com/ycm-core/YouCompleteMe#linux-64-bit 建议不要用这个博客的方法: http ...

  5. Linux c++ vim环境搭建系列(0)——简介

    vim 学习 简介: 源码编译使用vim及其插件. 内容包含: vim的编译安装, llvm clang的编译安装, 插件youcompleteme的编译安装使用, 以及vim其他插件的使用. 搭建环 ...

  6. Linux c++ vim环境搭建系列(1)——Ubuntu18.04.4编译安装vim8.2

    1. vim源码编译安装 参考网址: https://github.com/ycm-core/YouCompleteMe/wiki/Building-Vim-from-source 安装各类依赖库 s ...

  7. Linux c++ vim环境搭建系列(6)——CMakeLists.txt多文档多目录组织方法和编写示例

    CMakeLists.txt学习 1. 概要 主要是关于cmakelists.txt的编写模板,和多文档多目录的组织方法详解, 涉及第三方库的添加使用方法. 这里主要介绍cmakelists.txt的 ...

  8. Linux c++ vim环境搭建系列(2)——Ubuntu18.04.4编译安装llvm clang

    2. 源码编译安装llvm clang 参考网址: https://llvhttps

  9. linux环境搭建系列之Apache ant安装步骤

    前提: linux centOS6.6 64位操作系统 ROOT账号 JDK1.7 注意:JDK和Ant版本一定要是对应的,因为我的JDK是1.7版本的,所以我在官网下载的ant是1.9的 1.把安装 ...

随机推荐

  1. 【Weiss】【第03章】练习3.11:比较单链表递归与非递归查找元素

    [练习3.11] 编写查找一个单链表特定元素的程序.分别用递归和非递归实现,并比较它们的运行时间. 链表必须达到多大才能使得使用递归的程序崩溃? Answer: 实现都是比较容易的,但是实际上查找链表 ...

  2. Airtest,Poco,Unity自动化测试集成

    作为一个Game Developer,测试部分是必不可少,程序完成需求首先要进行S0相关的测试,这样确保交付到策划验收和QA验收时是没有阻断性的bug或者显而易见代码缺陷.那么如何去做测试用例呢?肯定 ...

  3. [C++]那些年被虐的STL

    首先很感谢**P1135奇怪的电梯 **[2.14补充:此题已被AC!然后将被我花式虐[From语]哈哈哈哈哈哈哈哈哈哈好嗨哟感觉人生已经到达了巅峰感觉人生已经到达了高潮]这道题了!在做这道题的我大致 ...

  4. VMware Tools失效的处理方案

    VMware Tools是一个实现主机与虚拟机文件分享,具有可支持自由拖拽的功能的工具,如果没有VM tools,那么没有了复制粘贴切换的虚拟机是很不方便的. 长时间未开的虚拟机,一次尝试拖拽Wind ...

  5. 关于Quartz .NET(V3.0.7)的简要说明

    目录 0. 任务调度 1. Quartz .NET 1.1 基本概念 1.2 主要接口和对象 2. 使用示例 2.0 准备工作 2.1 每间隔一定时间间隔执行一次任务 2.3 某天的固定时间点执行任务 ...

  6. [BJDCTF 2nd]fake google

    [BJDCTF 2nd]fake google 进入页面: 试了几下发现输入xxx,一般会按的格式显示, P3's girlfirend is : xxxxx 然后猜测会不会执行代码,发现可以执行 & ...

  7. 如何获取主键返回值(MySQL、Oracle)

    添加用户.返回主键 --场景:在执行新增用户sql后,service层返回新增用户的主键值(与mybatis一起使用) insert into user(username, sex, birthday ...

  8. 使用VirtualBox 版本 6.1.2 r135662, 安装ubuntu18

    VDI是VirtualBox的基本且独有的格式.目前应该还没有支持这种格式的其他软件. VMDK是专门为VMWare开发,但其他虚机像Sun xVM,QEMU,VirtualBox,SUSE Stud ...

  9. IOS(苹果手机)使用video播放HLS流,实现在内部播放及全屏播放(即非全屏和全屏播放)。

    需求: 实现PC及移动端播放HLS流,并且可以自动播放,在页面内部播放及全屏播放功能. 初步:PC及安卓机使用hls.js实现hls流自动播放及全屏非全屏播放 首先使用了hls.js插件,可以实现在P ...

  10. shell脚本中的if条件语句介绍和使用案例

    #前言:在生产工作中if条件语句是最常使用的,如使用来判断服务状态,监控服务器的CPU,内存,磁盘等操作,所以我们需要熟悉和掌握if条件语句. #简介 if条件语句,简单来说就是:如果,那么.有if单 ...