NeoVim 是一款非常优秀的软件,并且它有着很多非常好用的插件,以下为一些基础配置与插件的安装。
1. 安装Vim插件支持
$ mkdir ~/.config/nvim$ touch ~/.config/nvim/init.vim$ curl -fLo ~/.local/share/nvim/site/autoload/plug.vim --create-dirs https://gitee.com/c4pr1c3/vim-plug/raw/master/plug.vim
2. 安装插件
在 init.vim 文件中添加如下内容:
call plug#begin('~/.vim/plugged')Plug 'crusoexia/vim-monokai'Plug 'vim-airline/vim-airline'Plug 'vim-airline/vim-airline-themes' "airline 的主题Plug 'scrooloose/nerdcommenter'Plug 'luochen1990/rainbow'Plug 'preservim/nerdtree'Plug 'Xuyuanp/nerdtree-git-plugin'Plug 'octol/vim-cpp-enhanced-highlight'Plug 'honza/vim-snippets'Plug 'neoclide/coc.nvim', {'branch': 'release'}Plug 'morhetz/gruvbox'Plug 'numirias/semshi', {'do' : ':UpdateRemotePlugins'}Plug 'neomake/neomake'Plug 'Shougo/deoplete.nvim', { 'do': ':UpdateRemotePlugins' }Plug 'zchee/deoplete-jedi'Plug 'jiangmiao/auto-pairs'" 功能相关Plug 'Raimondi/delimitMate' " 自动加括号,换行等Plug 'Yggdroot/indentLine' " 缩进线Plug 'tyru/caw.vim'Plug 'Chiel92/vim-autoformat' " 代码格式化Plug 'Lokaltog/vim-easymotion' " 快速跳转Plug 'majutsushi/tagbar' " TagBarPlug 'tpope/vim-fugitive'Plug 'NLKNguyen/papercolor-theme'Plug 'powerman/vim-plugin-AnsiEsc' " 显示ansi color"Plug 'pboettch/vim-highlight-cursor-words' " 高亮光标单词Plug 'liuchengxu/vista.vim' " vistaPlug 'editorconfig/editorconfig-vim' " editorconfigPlug 'junegunn/fzf', { 'dir': '~/.fzf', 'do': './install --all' }Plug 'junegunn/fzf.vim'Plug 'airblade/vim-rooter'" syntaxPlug 'ekalinin/Dockerfile.vim' " DockerfilePlug 'leshill/vim-json' " JSONPlug 'digitaltoad/vim-pug' " PugPlug 'nikvdp/ejs-syntax' " ejsPlug 'mustache/vim-mustache-handlebars' " hbsPlug 'leafgarland/typescript-vim' " typescriptPlug 'chemzqm/wxapp.vim' " 小程序Plug 'posva/vim-vue'Plug 'voldikss/vim-translator'Plug 'tpope/vim-surround'Plug 'tpope/vim-repeat'Plug 'junkblocker/git-time-lapse' " 类似于git lens" Mac" Plug 'APZelos/blamer.nvim'" Plug 'scrooloose/nerdcommenter' " 注释插件" Plug 'tpope/vim-commentary'" Plug 'mxw/vim-jsx'" Plug 'digitaltoad/vim-jade'" Plug 'cakebaker/scss-syntax.vim'" Plug 'tpope/vim-haml'" Plug 'w0rp/ale'" Plug 'SirVer/ultisnips' " 代码块" Plug 'mattn/emmet-vim' " Emmet神器" Plug 'ap/vim-css-color' " CSS颜色显示" Plug 'itchyny/lightline.vim'call plug#end()let g:indent_guides_guide_size = 1 " 指定对齐线的尺寸let g:indent_guides_start_level = 2 " 从第二层开始可视化显示缩进" 设置状态栏let g:airline#extensions#tabline#enabled = 1let g:airline#extensions#tabline#left_alt_sep = '|'let g:airline#extensions#tabline#buffer_nr_show = 0let g:airline#extensions#tabline#formatter = 'default'let g:airline_theme = 'desertink' " 主题let g:airline#extensions#keymap#enabled = 1let g:airline#extensions#tabline#buffer_idx_mode = 1let g:airline#extensions#tabline#buffer_idx_format = {\ '0': '0 ',\ '1': '1 ',\ '2': '2 ',\ '3': '3 ',\ '4': '4 ',\ '5': '5 ',\ '6': '6 ',\ '7': '7 ',\ '8': '8 ',\ '9': '9 '\}" 设置切换tab的快捷键 <\> + <i> 切换到第i个 tabnmap <leader>1 <Plug>AirlineSelectTab1nmap <leader>2 <Plug>AirlineSelectTab2nmap <leader>3 <Plug>AirlineSelectTab3nmap <leader>4 <Plug>AirlineSelectTab4nmap <leader>5 <Plug>AirlineSelectTab5nmap <leader>6 <Plug>AirlineSelectTab6nmap <leader>7 <Plug>AirlineSelectTab7nmap <leader>8 <Plug>AirlineSelectTab8nmap <leader>9 <Plug>AirlineSelectTab9" 设置切换tab的快捷键 <\> + <-> 切换到前一个 tabnmap <leader>- <Plug>AirlineSelectPrevTab" 设置切换tab的快捷键 <\> + <+> 切换到后一个 tabnmap <leader>+ <Plug>AirlineSelectNextTab" 设置切换tab的快捷键 <\> + <q> 退出当前的 tabnmap <leader>q :bp<cr>:bd #<cr>" 修改了一些个人不喜欢的字符if !exists('g:airline_symbols')let g:airline_symbols = {}endiflet g:airline_symbols.linenr = "CL" " current linelet g:airline_symbols.whitespace = '|'let g:airline_symbols.maxlinenr = 'Ml' "maxlinelet g:airline_symbols.branch = 'BR'let g:airline_symbols.readonly = "RO"let g:airline_symbols.dirty = "DT"let g:airline_symbols.crypt = "CR""add spaces after comment delimiters by defaultlet g:NERDSpaceDelims = 1" python 自动的会多加一个空格au FileType python let g:NERDSpaceDelims = 0" Use compact syntax for prettified multi-line commentslet g:NERDCompactSexyComs = 1" Align line-wise comment delimiters flush left instead of following code indentationlet g:NERDDefaultAlign = 'left'" Set a language to use its alternate delimiters by defaultlet 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 uncommentinglet g:NERDTrimTrailingWhitespace = 1" Enable NERDCommenterToggle to check all selected lines is commented or notlet g:NERDToggleCheckAllLines = 1let g:rainbow_active = 1let g:rainbow_conf = {\ 'guifgs': ['darkorange3', 'seagreen3', 'royalblue3', 'firebrick'],\ 'ctermfgs': ['lightyellow', 'lightcyan','lightblue', 'lightmagenta'],\ 'operators': '_,_',\ 'parentheses': ['start=/(/ end=/)/ fold', 'start=/\[/ end=/\]/ fold', 'start=/{/ end=/}/ fold'],\ 'separately': {\ '*': {},\ 'tex': {\ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/'],\ },\ 'lisp': {\ 'guifgs': ['darkorange3', 'seagreen3', 'royalblue3', 'firebrick'],\ },\ 'vim': {\ 'parentheses': ['start=/(/ end=/)/', 'start=/\[/ end=/\]/', 'start=/{/ end=/}/ fold', 'start=/(/ end=/)/ containedin=vimFuncBody', 'start=/\[/ end=/\]/ containedin=vimFuncBody', 'start=/{/ end=/}/ fold containedin=vimFuncBody'],\ },\ 'html': {\ 'parentheses': ['start=/\v\<((area|base|br|col|embed|hr|img|input|keygen|link|menuitem|meta|param|source|track|wbr)[ >])@!\z([-_:a-zA-Z0-9]+)(\s+[-_:a-zA-Z0-9]+(\=("[^"]*"|'."'".'[^'."'".']*'."'".'|[^ '."'".'"><=`]*))?)*\>/ end=#</\z1># fold'],\ },\ 'css': 0,\ }\}" autocmd vimenter * NERDTree "自动开启Nerdtreelet g:NERDTreeWinSize = 25 "设定 NERDTree 视窗大小let NERDTreeShowBookmarks=1 " 开启Nerdtree时自动显示Bookmarks"打开vim时如果没有文件自动打开NERDTree" autocmd vimenter * if !argc()|NERDTree|endif"当NERDTree为剩下的唯一窗口时自动关闭autocmd bufenter * if (winnr("$") == 1 && exists("b:NERDTree") && b:NERDTree.isTabTree()) | q | endif" 设置树的显示图标let g:NERDTreeDirArrowExpandable = '+'let g:NERDTreeDirArrowCollapsible = '-'let NERDTreeIgnore = ['\.pyc$'] " 过滤所有.pyc文件不显示let g:NERDTreeShowLineNumbers=0 " 是否显示行号let g:NERDTreeHidden=0 "不显示隐藏文件""Making it prettierlet NERDTreeMinimalUI = 1let NERDTreeDirArrows = 1nnoremap <F3> :NERDTreeToggle<CR> " 开启/关闭nerdtree快捷键" if hidden is not set, TextEdit might fail.set hidden" Some servers have issues with backup files, see #649set nobackupset nowritebackup" You will have bad experience for diagnostic messages when it's default 4000.set updatetime=300" don't give |ins-completion-menu| messages.set shortmess+=c" always show signcolumnsset signcolumn=yes" Use tab for trigger completion with characters ahead and navigate." Use command ':verbose imap <tab>' to make sure tab is not mapped by other plugin.inoremap <silent><expr> <TAB>\ pumvisible() ? "\<C-n>" :\ <SID>check_back_space() ? "\<TAB>" :\ coc#refresh()inoremap <expr><S-TAB> pumvisible() ? "\<C-p>" : "\<C-h>"function! s:check_back_space() abortlet col = col('.') - 1return !col || getline('.')[col - 1] =~# '\s'endfunction" Use <c-space> to trigger completion.inoremap <silent><expr> <c-space> coc#refresh()" Use <cr> to confirm completion, `<C-g>u` means break undo chain at current position." Coc only does snippet and additional edit on confirm.inoremap <expr> <cr> pumvisible() ? "\<C-y>" : "\<C-g>u\<CR>"" Or use `complete_info` if your vim support it, like:" inoremap <expr> <cr> complete_info()["selected"] != "-1" ? "\<C-y>" : "\<C-g>u\<CR>"" Use `[g` and `]g` to navigate diagnosticsnmap <silent> [g <Plug>(coc-diagnostic-prev)nmap <silent> ]g <Plug>(coc-diagnostic-next)" Remap keys for gotosnmap <silent> gd <Plug>(coc-definition)nmap <silent> gy <Plug>(coc-type-definition)nmap <silent> gi <Plug>(coc-implementation)nmap <silent> gr <Plug>(coc-references)" Use K to show documentation in preview windownnoremap <silent> K :call <SID>show_documentation()<CR>function! s:show_documentation()if (index(['vim','help'], &filetype) >= 0)execute 'h '.expand('<cword>')elsecall CocAction('doHover')endifendfunction" Highlight symbol under cursor on CursorHold" autocmd CursorHold * silent call CocActionAsync('highlight')" Remap for rename current wordnmap <leader>rn <Plug>(coc-rename)" Remap for format selected regionxmap <leader>f <Plug>(coc-format-selected)nmap <leader>f <Plug>(coc-format-selected)augroup mygroupautocmd!" Setup formatexpr specified filetype(s).autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')" Update signature help on jump placeholder" autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')augroup end" Remap for do codeAction of selected region, ex: `<leader>aap` for current paragraphxmap <leader>a <Plug>(coc-codeaction-selected)nmap <leader>a <Plug>(coc-codeaction-selected)" Remap for do codeAction of current linenmap <leader>ac <Plug>(coc-codeaction)" Fix autofix problem of current linenmap <leader>qf <Plug>(coc-fix-current)" Create mappings for function text object, requires document symbols feature of languageserver.xmap if <Plug>(coc-funcobj-i)xmap af <Plug>(coc-funcobj-a)omap if <Plug>(coc-funcobj-i)omap af <Plug>(coc-funcobj-a)" Use `:Format` to format current buffercommand! -nargs=0 Format :call CocAction('format')" Use `:Fold` to fold current buffercommand! -nargs=? Fold :call CocAction('fold', <f-args>)" use `:OR` for organize import of current buffercommand! -nargs=0 OR :call CocAction('runCommand', 'editor.action.organizeImport')filetype plugin on" 设置为双字宽显示,否则无法完整显示如:☆" set ambiwidth=doubleset t_ut= " 防止vim背景颜色错误set showmatch " 高亮匹配括号set matchtime=1set report=0set ignorecaseset nocompatibleset noebset softtabstop=4set shiftwidth=4set nobackupset autoreadset nocompatibleset nu "设置显示行号set backspace=2 "能使用backspace回删syntax on "语法检测set ruler "显示最后一行的状态set laststatus=2 "两行状态行+一行命令行set ts=4set expandtabset autoindent "设置c语言自动对齐set t_Co=256 "指定配色方案为256" set mouse=a "设置可以在VIM使用鼠标set selection=exclusive" set selectmode=mouse,keyset tabstop=4 "设置TAB宽度set history=1000 "设置历史记录条数" 配色方案" let g:seoul256_background = 234colo monokaiset background=darkset shortmess=atl" colorscheme desert"共享剪切板set clipboard+=unnamedset cmdheight=3if version >= 603set helplang=cnset encoding=utf-8endifset fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936set termencoding=utf-8set encoding=utf-8set fileencodings=ucs-bom,utf-8,cp936set fileencoding=utf-8set updatetime=300set shortmess+=cset signcolumn=yes" autocmd FileType json syntax match Comment +\/\/.\+$+set foldmethod=indent " 设置默认折叠方式为缩进set foldlevelstart=99 " 每次打开文件时关闭折叠" hi Normal ctermfg=252 ctermbg=none "背景透明" au FileType gitcommit,gitrebase let g:gutentags_enabled=0if has("autocmd")au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endifendifinoremap jj <Esc> "将jj映射到Esc
打开一个 nvim 窗口,输入 :PlugInstall。安装完成后,输入 :checkhealth。
3. 安装Coc插件
除此之外,我们还需要安装 Coc 相关插件,打开一个 Nvim 窗口,执行下面代码:
:CocInstall coc-clangd coc-cmake coc-emmet coc-git coc-highlight coc-pairs:CocInstall coc-jedi coc-json coc-sh coc-snippets coc-vimlsp coc-yaml coc-syntax
参考文档:https://www.cnblogs.com/cniwoq/p/13272746.html
报错:https://www.cnblogs.com/sober-orange/p/cocnvim-build-indexjs.html
4. 常见报错
🔎报错:Unknown function: SemshiBufWipeout
解决办法:执行 :UpdateRemotePlugins,可以看见具体报错。
🔎报错:No module named pynvim
解决办法:原因在于当前 Python 环境下没有安装 pynvim 库。
