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. 安装、配置
- 下载plug.vim:
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim
- 编辑配置文件.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中插件语法见
该网站上有各种各样的插件,可按需求自己下载安装,里面也有安装、配置、使用说明。
- 配置插件
插件安装完成后,想要使用插件的功能,必须在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++为例:
- 在nvim中输入命令:
CocInstall coc-clangd
。这一步是安装了c/c++的LSP。 - 在终端输入:
sudo apt-get install clangd-12
安装支持LSP的c/c++语法补全插件 - 安装成功后,输入:
sudo update-alternatives --install /usr/bin/clangd clangd /usr/bin/clangd-12 100
- 测试是否能对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 配置==================================