vim使用指南、相关配置以及插件管理vim-plug、Vundle、NERDTree、NERD Commenter、YouCompleteMe以及配色方案solarized和molokai等

vim使用说明

快捷键

  • 跳转
  • 跳转到行首–Home
  • 跳转到行尾–A
  • 跳转到文件头–gg
  • 跳转到文件尾–G
  • 跳转到指定行–xxgg,23gg等
  • 粘贴复制
  • 从文件内容复制到:命令行:v进入到Visual模式,选中字符串y复制字符串,:或"/“进入到命令行模式,Ctrl+r"快捷键将复制的内容粘贴到命令行
  • 撤销和反撤销
  • 命令模式下u表示撤销
  • 命令模式下Ctrl+r表示反撤销
  • 搜索和查找
  • :vimgrep /{pattern}/[g][j] {file}...
  • :copen打开查找结果
  • :cclose关闭查找结果
  • :cc转到当前查找位置
  • :cn转到下一个位置
  • :cp转到前一个位置

配置文档

  • Linux下vim的配置在用户目录下,配置文档为.vimrc

    "行号
    set number
    "设置编码
    set encoding=utf-8
    "设置终端编码
    set termencoding=utf-8
    "设置文件编码
    set fileencoding=utf-8
    "显示输入的命令
    set showcmd
    "设置颜色级别
    set t_Co=256
    "文件自动更新载入
    set autoread
    "显示匹配的括号
    set showmatch
    
    "tab键用空格表示
    set expandtab
    "设置tab所占字符的大小
    set tabstop=4
    "设置tab键按下之后的行为,插入的是空格和tab制表符的混合。
    "如果tabstop==softtabstop,则插入一个tab制表符;
    "如果tabstop>softtabstop,则插入整数个tab制表符和余数个空格。
    "如果设置了expandtab,则全部插入空格。
    set softtabstop=4
    
    "缩进
    "启动自动缩进
    set autoindent
    "设置缩进宽度
    set shiftwidth=4
    "折叠
    set foldmethod=indent
    "总是显示标签栏
    set showtabline=2
    "缓冲区更新事件
    set updatetime=100
    
    "状态栏
    "set laststatus=2
    "t:文件名;y:文件内容类型;\&ff:文件类型unix/mac/dos;l:行号;c:列号
    "set statusline=%t\ %y\ format:\ %{&ff};\ [%l,%c]
    "set statusline=%F%m%r%h%w%=\ [ft=%Y]\ %{\"[fenc=\".(&fenc==\"\"?&enc:&fenc).((exists(\"+bomb\")\ &&\ &bomb)?\"+\":\"\").\"]\"}\ [ff=%{&ff}]\ [asc=%03.3b]\ [hex=%02.2B]\ [pos=%04l,%04v][%p%%]\ [len=%L]
    
    "查找结果高亮
    set hlsearch
    "增量查找
    set incsearch
    "大小写敏感
    set noignorecase
    "设置不兼容vi
    set nocompatible
    "返回上次编辑位置
    autocmd BufReadPost *
        \ if line("'\"") > 0 && line("'\"") <= line("$") |
        \   exe "normal! g`\"" |
        \ endif
    
    "代码
    "语法高亮
    syntax enable
    "允许用指定语法高亮配色方案替换默认方案
    syntax on
    "高亮当前行
    set cursorline
    
    "快捷键
    nnoremap <Leader>q :q!<CR>
    nnoremap <Leader>w :w<CR>
    
    ""插件安装配置
    filetype off
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()
    Plugin 'VundleVim/Vundle.vim'
    Plugin 'preservim/nerdtree'
    Plugin 'Xuyuanp/nerdtree-git-plugin'
    Plugin 'rhysd/vim-clang-format'
    Plugin 'ycm-core/YouCompleteMe'
    Plugin 'vim-airline/vim-airline'
    Plugin 'vim-airline/vim-airline-themes'
    Plugin 'tpope/vim-fugitive'
    Plugin 'airblade/vim-gitgutter'
    Plugin 'octol/vim-cpp-enhanced-highlight'
    Plugin 'preservim/nerdcommenter'
    Plugin 'dense-analysis/ale'
    call vundle#end()
    filetype plugin indent on
    
    "NERDTree配置
    "设置快捷键
    nnoremap <leader>n :NERDTreeFocus<CR>
    nnoremap <C-t> :NERDTreeToggle<CR>
    nnoremap <C-f> :NERDTreeFind<CR>
    "打开vim时打开NERDTree
    autocmd VimEnter * NERDTree | wincmd p
    "退出最后一个tab时同时退出NERDTree.
    autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
    "设置显示方式
    let g:NERDTreeDirArrowExpandable = '▸'
    let g:NERDTreeDirArrowCollapsible = '▾'
    "显示行号
    let g:NERDTreeShowLineNumbers=1
    "窗口大小
    let g:NERDTreeWinSize=40
    "窗口位置
    let g:NERDTreeWinPos = 'left'
    "高亮当前行
    let g:NERDTreeHighlightCursorline = 1
    "色彩显示
    let g:NERDChristmasTree = 1
    "显示隐藏文件
    let g:NERDTreeShowHidden=1
    "在tab中打开文件
    let g:NERDTreeCustomOpenArgs={'file':{'where': 't'}}
    "配置NERDTree结束
    
    "配置nerdtree-git-plugin
    let g:NERDTreeGitStatusIndicatorMapCustom = {
                \ 'Modified'  :'✹',
                \ 'Staged'    :'✚',
                \ 'Untracked' :'✭',
                \ 'Renamed'   :'➜',
                \ 'Unmerged'  :'═',
                \ 'Deleted'   :'✖',
                \ 'Dirty'     :'✗',
                \ 'Ignored'   :'☒',
                \ 'Clean'     :'✔︎',
                \ 'Unknown'   :'?',
                \ }
    "配置nerdtree-git-plugin
    
    "配置vim-clang-format
    "格式化快捷键
    "normal模式
    autocmd FileType c,cpp,objc nnoremap <buffer><Leader>cf :<C-u>ClangFormat<CR>
    "view模式
    autocmd FileType c,cpp,objc vnoremap <buffer><Leader>cf :ClangFormat<CR>
    "启动自动格式化,启动之后在保存文件时会自动格式化
    nnoremap <leader>C :ClangFormatAutoToggle<CR>
    "插入的行在离开插入模式时格式化
    let g:clang_format#auto_formatexpr=1
    "自动检测.clang-format文件
    let g:clang_format#detect_style_file=1
    "配置vim-clang-format
    
    "配置tab快捷键
    nnoremap <S-Right> :tabn<CR>
    nnoremap <S-Left> :tabp<CR>
    nnoremap <C-c-o> :copen<CR>
    nnoremap <C-c-c> :cclose<CR>
    "配置tab快捷键
    "配置快捷键拷贝系统粘贴版
    vnoremap <Leader>y "+y
    
    "配置vim airline
    let g:airline#extensions#tabline#enabled=1
    let g:airline#extensions#tabline#left_sep = ''
    let g:airline#extensions#tabline#left_alt_sep = '|'
    let g:airline#extensions#tabline#formatter = 'unique_tail_improved'
    let g:airline#extensions#ale#enabled = 1
    "配置vim airline
    
    "配置vim- nerdcommenter注释插件
    "Create default mappings
    let g:NERDCreateDefaultMappings = 1
    "Add spaces after comment delimiters by default
    let g:NERDSpaceDelims = 1
    "Use compact syntax for prettified multi-line comments
    let g:NERDCompactSexyComs = 1
    "Align line-wise comment delimiters flush left instead of following code indentation
    let g:NERDDefaultAlign = 'left'
    "Set a language to use its alternate delimiters by default
    let g:NERDAltDelims_java = 1
    "Add your own custom formats or override the defaults
    let g:NERDCustomDelimiters = { 'c': { 'left': '//','right': '' } }
    "Allow commenting and inverting empty lines (useful when commenting a region)
    let g:NERDCommentEmptyLines = 1
    "Enable trimming of trailing whitespace when uncommenting
    let g:NERDTrimTrailingWhitespace = 1
    "Enable NERDCommenterToggle to check all selected lines is commented or not 
    let g:NERDToggleCheckAllLines = 1
    "配置vim- nerdcommenter注释插件
    
    "YouCompleteMe
    "启用加载.ycm_extra_conf.py提示
    let g:ycm_confirm_extra_conf=1
    "在注释输入中也能补全
    let g:ycm_complete_in_comments = 1
    "在字符串输入中也能补全
    let g:ycm_complete_in_strings = 1
    "开启 YCM 基于标签引擎
    let g:ycm_collect_identifiers_from_tags_files=1
    "注释和字符串中的文字也会被收入补全
    let g:ycm_collect_identifiers_from_comments_and_strings = 1
    let g:ycm_seed_identifiers_with_syntax=1
    "语言关键字补全, 不过python关键字都很短,所以,需要的自己打开
    let g:ycm_collect_identifiers_from_tags_files = 1
    " 从第2个键入字符就开始罗列匹配项
    let g:ycm_min_num_of_chars_for_completion=2
    "配置文件
    let g:ycm_global_ycm_extra_conf='~/.vim/bundle/YouCompleteMe/third_party/ycmd/.ycm_extra_conf.py'
    "YouCompleteMe
    
    "配置ale
    "标志列始终打开
    let g:ale_sign_column_always = 1
    "自定义图标
    let g:ale_sign_error = '✗'
    let g:ale_sign_warning = '⚡'
    "显示Linter名称,出错或警告等相关信息
    let g:ale_echo_msg_error_str = 'E'
    let g:ale_echo_msg_warning_str = 'W'
    let g:ale_echo_msg_format = '[%linter%] %s [%severity%]'
    "<Leader>s触发/关闭语法检查
    nmap <Leader>s :ALEToggle<CR>
    "<Leader>d查看错误或警告的详细信息
    nmap <Leader>d :ALEDetail<CR>
    "普通模式下,sp前往上一个错误或警告,sn前往下一个错误或警告
    nmap sp <Plug>(ale_previous_wrap)
    nmap sn <Plug>(ale_next_wrap)
    "使用clang对c和c++进行语法检查,对python使用pylint进行语法检查
    let g:ale_linters = {
        \   'c++': ['gcc'],
        \   'c': ['gcc'],
        \   'python': ['pylint'],
        \}
    

vim命令

自定义命令-添加文件头说明

"新建文件插入文件头注释
autocmd BufNewFile *.cpp,*.hpp,*.[ch] exec ":call AddHeadCommentC()" 
func AddHeadCommentC()
    call setline(1, "/*************************************************************************")
    call append(line("."), " > File Name: ".expand("%"))
    call append(line(".")+1, " > Author: blduan")
    call append(line(".")+2, " > Mail: 1578770584@qq.com")
    call append(line(".")+3, " > Created Time: ".strftime("%c"))
    call append(line(".")+4, " ************************************************************************/")
    call append(line(".")+5, "")
    "新建文件后,自动定位到文件末尾
    autocmd BufNewFile * normal G
endfunc
autocmd BufNewFile *.sh exec ":call AddHeadCommentSH()" 
func AddHeadCommentSH()
    call setline(1, "##########################################################################")
    call append(line("."), "# File Name: ".expand("%"))
    call append(line(".")+1, "# Author: blduan")
    call append(line(".")+2, "# Mail: 1578770584@qq.com")
    call append(line(".")+3, "# Created Time: ".strftime("%c"))
    call append(line(".")+4, "##########################################################################")
    call append(line(".")+5, "#!/bin/bash")
    "新建文件后,自动定位到文件末尾
    autocmd BufNewFile * normal G
endfunc

重新打开文件–跳转到上次位置

" Return to last edit position when opening files (You want this!)
autocmd BufReadPost *
     \ if line("'\"") > 0 && line("'\"") <= line("$") |
     \   exe "normal! g`\"" |
     \ endif

常用插件

插件管理器Vundle

  • Vundle是一个Vim插件管理器。支持Install、Update、Search以及Clean插件。

  • 安装方式git clone https://github.com/VundleVim/Vundle.vim.git ~/.vim/bundle/Vundle.vim

  • 插件配置如下:

    set nocompatible              " be iMproved, required
    filetype off                  " required
    
    " set the runtime path to include Vundle and initialize
    set rtp+=~/.vim/bundle/Vundle.vim
    call vundle#begin()
    " alternatively, pass a path where Vundle should install plugins
    "call vundle#begin('~/some/path/here')
    
    " let Vundle manage Vundle, required
    Plugin 'VundleVim/Vundle.vim'
    call vundle#end()            " required
    filetype plugin indent on    " required
    " To ignore plugin indent changes, instead use:
    "filetype plugin on
    "
    " Brief help
    " :PluginList       - lists configured plugins
    " :PluginInstall    - installs plugins; append `!` to update or just :PluginUpdate
    " :PluginSearch foo - searches for foo; append `!` to refresh local cache
    " :PluginClean      - confirms removal of unused plugins; append `!` to auto-approve removal
    "
    

插件管理器vim-plug

  • vim-plug是一个开源、极简、易用、并行安装或更新插件的插件管理器

  • 安装方式

  • 自动安装:curl -fLo ~/.vim/autoload/plug.vim --create-dirs \ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

  • 手动安装:下载plug.vim并放置在/home/[用户]/.vim/autoupload/目录中。

  • 插件安装

  • .vimrc配置文件中添加下面几行:

    call plug#begin('~/.vim/plugged')
    // 中间是要安装的插件
    call plug#end()
    
  • 重新打开vim,执行命令:PlugInstall,会自动安装上面列出的所有插件。

  • 插件卸载

  • .vimrc配置文件中删除或注释待卸载插件的配置项,重新打开vim,然后执行命令:PlugClean,会自动卸载相关插件。

  • 插件更新

  • 打开vim然后执行:PlugUpdate

  • Hooks

  • 有些插件在安装或更新之后需要执行一些动作,此时需要用do选项描述要执行的任务。

    function! BuildYCM(info)
    " info is a dictionary with 3 fields
    " - name:   name of the plugin
    " - status: 'installed', 'updated', or 'unchanged'
    " - force:  set on PlugInstall! or PlugUpdate!
    if a:info.status == 'installed' || a:info.force
        !./install.py
    endif
    endfunction
    
    Plug 'ycm-core/YouCompleteMe', { 'do': function('BuildYCM') }
    

文件系统浏览器NERDTree

  • NERDTree是vim的文件浏览器,使用该插件可以浏览复杂的文件结构,以及快速的打开文件。

  • 安装方式

    call plug#begin()
        Plug 'preservim/nerdtree'
    call plug#end()
    
  • 重启vim,执行命令:PlugInstall

  • 相关配置

  • 快捷键映射: nnoremap <F2> :NERDTree<CR>—打开或关闭NERDTree

  • 当NERDTree是最后一个窗口时自动关闭vim

    " Exit Vim if NERDTree is the only window remaining in the only tab.
    autocmd BufEnter * if tabpagenr('$') == 1 && winnr('$') == 1 && exists('b:NERDTree') && b:NERDTree.isTabTree() | quit | endif
    
  • NERDTree的一些全局属性配置:

    " 目录扩展符号
    let g:NERDTreeDirArrowExpandable = '▸'
    let g:NERDTreeDirArrowCollapsible = '▾'
    " 显示隐藏文件
    let g:NERDTreeShowHidden = 1
    " NERDTree目录窗口
    let g:NERDTreeWinSize = 40
    " 窗口位置
    let g:NERDTreeWinPos = 'left'
    " 高亮当前行
    let g:NERDTreeHighlightCursorline = 0
    " 色彩显示
    let g:NERDChristmasTree = 1
    

配色方案

  • 常用的两种主题:solarizedmolokai

  • 安装方式

  • solarized主题的使用有个前提条件就是gnome terminal的配色方案也要使用solarized,如果gnome terminal使用solarized配色方案,那么vim的solarized配色即开箱即用,不用再额外安装。

  • molokai配色安装,首先下载molokai,其次将colors文件夹下的molokai.vim复制到/home/[用户]/.vim/colors/中(没有该目录则创建)。

  • .vimrc中增加配置如下:

    syntax enable
    syntax on
    set background = dark
    colorscheme molokai
    

自动补全插件YouCompleteMe

  • YouCompleteMe是vim的自动提示补全插件,支持C、C++、Python、Java、JavaScript等语言。

  • 安装方式 针对C语言

    call vundle#begin()
    Plugin 'ycm-core/YouCompleteMe'
    call vundle#end()
    
  • 执行:PluginInstall

  • 预安装:apt install build-essential cmake vim-nox python3-dev

  • 编译执行:cd ~/.vim/bundle/YouCompleteMe && python3 install.py --clangd-completer

代码高亮插件vim-cpp-enhanced-highlight

  • 插件地址

  • 配置方式

    Plugin 'octol/vim-cpp-enhanced-highlight'
    

代码注释插件NERD Commenter

  • 安装方式

    call vundle#begin()
    Plugin 'preservim/nerdcommenter'
    call vundle#end()
    
  • 重新打开vim,执行:PluginInstall

  • 相关配置

    " Add spaces after comment delimiters by default
    let g:NERDSpaceDelims = 1
    
  • 使用方式

  • 大写V进入Visual模式,选择多行,在执行\cc即可注释多行。

  • \ca可以切换注释方式,是//或者/**/