vim、neovim插件安装配置

2022年7月10日17:40:32 written by rogerg6

vim是unix/Linux终端下的文本编辑器,vim是vi的改进版。neovim是vim的重构版本。两者在操作上几乎一样。

在vim中想要编写代码,实现语法高亮、目录树、编辑栏等等功能,插件适合这种场景。当需要安装众多插件时,管理插件是个问题,还好我们有现成的工具。常见的有Vundle、vim-plug......

这里我以vim-plug,nvim为例讲解安装、配置插件的步骤,其他管理工具类似:

1. vim、neovim的一些配置文件

Vim

NeoVim

plug.vim安装路径

~/.vim/autoload

~/.config/nvim/autoload

配置文件

~/.vimrc

~/.config/nvim/init.vim

插件下载路径(可自定义)

~/.vim/plugged

同左边

其中:

  • plug.vim可以认为是vim-plug则个工具的程序(其实是个脚本,猜测nvim启动是会运行该脚本)。安装路径官方默认如上表
  • 2者配置文件内容其实一样,只是路径不一样,可以创建一个软链接
  • 插件下载路径,可以自定义,但是一定要写在.vimrc中:call plug#begin('~/.vim/plugged')

2. 安装、配置

  1. 下载plug.vim: curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
  2. 编辑配置文件.vimrc,将一下内容写入,在nvim中运行:PlugInstall安装:
" 将需要安装的插件放在下面2行代码间
call plug#begin('~/.vim/plugged')
Plug 'scrooloose/nerdtree'
Plug 'majutsushi/tagbar'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'voldikss/vim-floaterm'
call plug#end()

其中,物色插件及.vimrc中插件语法见

该网站上有各种各样的插件,可按需求自己下载安装,里面也有安装、配置、使用说明。

  1. 配置插件
    插件安装完成后,想要使用插件的功能,必须在nvim中运行命令,如:FloatermNew。所以不是很方便,需要对其进行配置。
    配置的方法也是在.vimrc中写入相应的脚本,见最后的.vimrc文件内容。

3. 常用插件

  • NERDTree:目录树
  • Tagbar:标记栏。显示当前源代码文件中的函数、类等骨干信息
  • vim-floaterm:内嵌在nvim中的终端。可实现在不退出编辑页面的情况下操作CLI。对nvim支持较好
  • coc.vim:补全插件。
    这个插件比较特殊,它依赖于nodejs(v16.0以上),且nvim对其支持较好,所以安装它之前先安装nodejs:
去官网下载:https://nodejs.org/zh-cn/download/

tar -xvf node-v16.16.0-linux-x64.tar.gz
sudo mv node-v16.16.0-linux-x64 /usr/local/lib
vim ~/.profile
export PATH=$PATH:/usr/local/lib/node-v16.1.0-linux-x64/bin

重启终端,输入node -v,如下即安装成功:
v16.1.0

coc其实是一个平台,针对各种语言(c, c++, python...)的插件需要安装到coc上才能补全相应的语言。

以c/c++为例:

  1. 在nvim中输入命令:CocInstall coc-clangd。这一步是安装了c/c++的LSP。
  2. 在终端输入:sudo apt-get install clangd-12安装支持LSP的c/c++语法补全插件
  3. 安装成功后,输入:sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-12 100
  4. 测试是否能对c/c++补全。

其他语言的支持类似,不懂就度娘!

LSP:Language Server Protocol,这是一种协议,可理解为是一种标准,规范语言插件的标准。有了这个标准,只要是遵循这个协议开发的插件,可以在任何支持该协议的编辑器上运行。

确切的说LSP是编辑器和语言工具(例如linter静态类型检查代码风格检查)之间进行通信的标准协议。

没有LSP,不同语言需要实现这些工具与不同编辑器的通信。

4. 我的.vimrc

set nocompatible              " 去除VI一致性,必须要添加
filetype off                  " 必须要添加

call plug#begin('~/.vim/plugged')

Plug 'scrooloose/nerdtree'
Plug 'majutsushi/tagbar'
Plug 'neoclide/coc.nvim', {'branch': 'release'}
Plug 'voldikss/vim-floaterm'

call plug#end()            " 必须
filetype plugin indent on    " 必须 加载vim自带和插件相应的语法和文件类型相关脚本

" ============= vim-floaterm配置=========================
nnoremap   <silent>   <F7>    :FloatermNew --height=0.9 --position=bottomright<CR>
tnoremap   <silent>   <F7>    <C-\><C-n>:FloatermNew --height=0.9 --position=bottomright<CR>
nnoremap   <silent>   <F8>    :FloatermPrev<CR>
tnoremap   <silent>   <F8>    <C-\><C-n>:FloatermPrev<CR>
nnoremap   <silent>   <F9>    :FloatermNext<CR>
tnoremap   <silent>   <F9>    <C-\><C-n>:FloatermNext<CR>
nnoremap   <silent>   <F12>   :FloatermToggle<CR>
tnoremap   <silent>   <F12>   <C-\><C-n>:FloatermToggle<CR>
" ============ vim-floaterm配置=========================

" =============NERDTree配置=========================

" 打开/关闭 快捷键配置,通过快捷键ctr + n,进行项目树的切换
nmap ,q :NERDTreeToggle<CR>
" 进入选中的目录中
nmap ,d cdCD
" 当打开vim无指定文件时,自动打开项目树
autocmd StdinReadPre * let s:std_in=1
autocmd VimEnter * if argc() == 0 && !exists("s:std_in") | NERDTree | endif
" 当所有文件都关闭时,自动关闭项目树窗格
autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif
" 不显示下述文件
let NERDTreeIgnore=['\.pyc$', '\~$', 'node_modules'] "ignore files in NERDTree
" 不显示项目树上额外的信息,例如帮助、提示什么的
let NERDTreeMinimalUI=1
" 更改默认箭头
let g:NERDTreeDirArrowExpandable = '+'
let g:NERDTreeDirArrowCollapsible = '-'

let NERDTreeWinSize=20

" =============NERDTree配置=========================

" ===============TagBar配置======================
map ,t :TagbarToggle<CR>
let g:tagbar_width=20
let g:tagbar_iconchars = ['+', '-']
autocmd BufReadPost *.cpp,*.c,*.h,*.hpp,*.cc,*.cxx call tagbar#autoopen()
" ===============TagBar配置======================

" 设置字符编码                                                                
set fileencoding=utf-8                                             
set fileencodings=utf-8,gb2312,gb18030,latin1                      
set termencoding=utf-8                                             
set encoding=utf-8                                                 

" 语法高亮                                                         
syntax on                                                                                                            
" 检测文件类型                                                     
filetype on   

" 根据文件类型加载对应的插件                                       
filetype plugin on                                                 
runtime macros/matchit.vim                                                                
" 显示行号                                                      
set number                                                      
                                                         
" 高亮显示当前行                                                   
set cursorline                                                     
                                                                   
" 设置各种缩进                                                     
set tabstop=4                                                      
set softtabstop=4                                                  
set shiftwidth=4                                                   
set autoindent                                                     
set smartindent                                                    
set cindent                                                        
" tab转换为空格                                                    
set expandtab

" 将ESC键映射为ctrl+j 
" inoremap <C-j> <Esc> 

" 自动完成大括号 
"imap { {<CR>}<Esc>kA<CR>
inoremap ' ''<ESC>i
inoremap " ""<ESC>i
inoremap ( ()<ESC>i
inoremap [ []<ESC>i
"inoremap { {<CR>}<ESC>O
inoremap { {}<ESC>i

"设置跳出自动补全的括号
func SkipPair()  
    if getline('.')[col('.') - 1] == ')' || getline('.')[col('.') - 1] == ']' || getline('.')[col('.') - 1] == '"' || getline('.')[col('.') - 1] == "'" || getline('.')[col('.') - 1] == '}'  
        return "\<ESC>la"  
    else  
        return "\t"  
    endif  
endfunc  
" 将tab键绑定为跳出括号  
inoremap <TAB> <c-r>=SkipPair()<CR>

" 键盘映射
" 添加注释
nmap zs ^i/* */<CR><Esc>`.hi

" 缩进
nmap <TAB> V>
nmap <s-TAB> V<

" 相当于输入%:h<Tab> 
cnoremap <expr> %% getcmdtype( ) == ':' ? expand('%:h').'/' : '%%'

" 插入模式下插入时间
inoremap <F5> <C-R>=strftime('%Y-%m-%d %H:%M:%S')<CR>

" =========================COC 配置==================================
colors ron
" 提示框的颜色和选中的颜色
hi Pmenu ctermfg=0 ctermbg=7
hi PmenuSel ctermfg=0 ctermbg=11
"hi CocFloating ctermfg=black ctermbg=240
hi cComment ctermfg=Grey
hi CocErrorFloat ctermfg=0
" =========================COC 配置==================================