Neovim+Coc.nvim配置⽬前个⼈最舒服终端编辑环境(PythonC++)1. 前⾔
⽬前最常⽤的环境还是linux的服务器,所以最终选择的是nvim作为⾃⼰的⾸要编辑器,毕竟没有写⼀些⽐较⼤型的项⽬。在经过多次的摸索后,我还是选择了Neovim + Coc.nvim,放弃了 YCM。
在⽂章的最后,有完整的init.vim⽂件,这个⽂件是我⽬前正在使⽤的,相对于⽂中的部分有变动。本⽂希望在你学习和使⽤vim的过程中,帮助你熟悉相关的环境配置。这⾥假设在没有root权限的情况,考虑的是软件的源码安装(相⽐之下,直接⽤各个发⾏版的命令安装会更加简单)。
2.Neovim 和插件安装
2.1 Neovim 安装
neovim:
选择最新的release 的版本,
这⾥除了source code 是源码外,其他的都是编译好的,直接
wget github/neovim/neovim/releases/download/v0.4.3/
tar -zxvf
然后把neovim路径下的bin加⼊到~/.bashrc,然后在source⼀下就算是成功了。
2.2 插件安装
1. Vim-Plug
是⼀个我很喜欢的vim的插件管理⼯具,使⽤下⾯的命令可以进⾏安装(其他平台和⼯具的安装⽅法地址中有):
sh -c 'curl -fLo "${XDG_DATA_HOME:-$HOME/.local/share}"/nvim/site/autoload/plug.vim --create-dirs \
raw.githubusercontent/junegunn/vim-plug/master/plug.vim'
这样,这个 ~/.local/share/nvim/site/autoload/plug.vim就会在你的⽬录下,并且vim会被调⽤。
创建nvim的配置⽂件(这个配置⽂件和vim的'.vimrc')⼀样:
mkdir ~/.config/nvim/
nvim ~/.config/nvim/init.vim
然后把
call plug#begin('~/.vim/plugged')
call plug#end()
加⼊到init.vim中,这样以后在call begin和call end 之间加上插件就可以使⽤了。
之后的每个插件在init.vim⽂件中配置好后,要进⾏保存退出,再次进⼊nvim,使⽤命令 :PlugInstall安装
2. indentLine
此插件提供的⼀个可视化的缩进,把Plug 'Yggdroot/indentLine',放到init.vim的call begin和call end之间,同时加⼊⼀些简单的配置:
let g:indent_guides_guide_size            = 1  " 指定对齐线的尺⼨
let g:indent_guides_start_level          = 2  " 从第⼆层开始可视化显⽰缩进
效果如图:
3. vim-monokai
,这个插件是nvim的⼀个主题,monokai这个配⾊是我最喜欢的,从开始⽤sublime的时候我⼀直都⽤的是这个主题。
在 call begin 和 call end 之间加上Plug 'crusoexia/vim-monokai',然后把
colo monokai
加到后⾯。
效果:
4.vim-airline
给nvim 提供⼀个强⼤的状态栏和标签栏,当打开多个⽂本时,可以⽤它进⾏快速的切换,是⼀个很强⼤的⼯具。
在 call begin 和 call end 之间加上:
Plug 'vim-airline/vim-airline'
Plug 'vim-airline/vim-airline-themes' "airline 的主题
然后在init.vim⾥加上⼀些个性的配置:
" 设置状态栏
let g:airline#extensions#tabline#enabled = 1
let g:airline#extensions#tabline#left_alt_sep = '|'
let g:airline#extensions#tabline#buffer_nr_show = 0
let g:airline#extensions#tabline#formatter = 'default'
let g:airline_theme = 'desertink'  " 主题
let g:airline#extensions#keymap#enabled = 1
let g:airline#extensions#tabline#buffer_idx_mode = 1
let 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个 tab
nmap <leader>1 <Plug>AirlineSelectTab1
nmap <leader>2 <Plug>AirlineSelectTab2
nmap <leader>3 <Plug>AirlineSelectTab3
nmap <leader>4 <Plug>AirlineSelectTab4
nmap <leader>5 <Plug>AirlineSelectTab5
nmap <leader>6 <Plug>AirlineSelectTab6
nmap <leader>7 <Plug>AirlineSelectTab7
nmap <leader>8 <Plug>AirlineSelectTab8
nmap <leader>9 <Plug>AirlineSelectTab9
" 设置切换tab的快捷键 <\> + <-> 切换到前⼀个 tab
nmap <leader>- <Plug>AirlineSelectPrevTab
" 设置切换tab的快捷键 <\> + <+> 切换到后⼀个 tab
nmap <leader>+ <Plug>AirlineSelectNextTab
" 设置切换tab的快捷键 <\> + <q> 退出当前的 tab
nmap <leader>q :bp<cr>:bd #<cr>
" 修改了⼀些个⼈不喜欢的字符
if !exists('g:airline_symbols')
let g:airline_symbols = {}
endif
let g:airline_symbols.linenr = "CL" " current line
let g:airline_symbols.whitespace = '|'
let g:airline_symbols.maxlinenr = 'Ml' "maxline
let g:airline_symbols.branch = 'BR'
let g:adonly = "RO"
let g:airline_symbols.dirty = "DT"
let g:pt = "CR"
效果为:
5. nerdcommenter
是⼀个很好⽤的注释⼯具,在normal和visual模式下,他会对你光标所在⾏或所选中的多⾏进⾏注释和去注释,只需要你按下 <\>+<c>+<space>。
在 call begin 和 call end 之间加上Plug 'scrooloose/nerdcommenter',在进⾏简单的配置
"add spaces after comment delimiters by default
let g:NERDSpaceDelims = 1
" python ⾃动的会多加⼀个空格
au FileType python let g:NERDSpaceDelims = 0
" 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
6. rainbow
是⼀个提供嵌套括号⾼亮的⼀个⼯具。
在 call begin 和 call end 之间加上Plug 'luochen1990/rainbow'
我对括号的颜⾊进⾏了简单的修改:
let g:rainbow_active = 1
let 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,
\  }
\}
效果:
7. nerdtree
是⼀个树形的⽬录管理插件,可以⽅便在nvim中进⾏当前⽂件夹中的⽂件切换
在 call begin 和 call end 之间加上
Plug 'preservim/nerdtree'
Plug 'Xuyuanp/nerdtree-git-plugin'
在 call begin 和 call end 之间加上'preservim/nerdtree'
进⾏以下的简单配置
" autocmd vimenter * NERDTree  "⾃动开启Nerdtree
let 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 prettier
let NERDTreeMinimalUI = 1
let NERDTreeDirArrows = 1
nnoremap <F3> :NERDTreeToggle<CR> " 开启/关闭nerdtree快捷键
默认的情况下是关闭的,可以把autocmd vimenter * NERDTree的注释打开,改成默认开启的状态。同时把开关的按键映射到了F3,按下可以打开或关闭。
效果:
8. tagbar
可以⽤来展⽰当前的⽂件的⼀些函数。
这个插件依赖ctags,需要先安装ctags。从下载源码,进⾏编译(如果有root权限直接安装,跳过源码编译)。
wget prdownloads.sourceforge/ctags/ctags-5.
tar -zxvf ctags-5.
cd ctags-5.8
./configure --prefix=$PATH # $PATH是你要安装的位置
make -j
make install
然后把安装⽬录⾥的bin所在的路径加到~/.bashrc中,在source⼀下,输⼊命令ctags,如果输出
ctags: No files specified. Try "ctags --help".
那ctags就安装成功了。
然后在init.vim中的call begin和call end 之间加⼊Plug 'majutsushi/tagbar',我这⾥还设置了tagbar的宽度和按键映射,这样可以通过F4⽅便的进⾏打开和关上。在tagbar窗⼝可以按下回车跳转到指定的函数。
let g:tagbar_width=30
nnoremap <silent> <F4> :TagbarToggle<CR> " 将tagbar的开关按键设置为 F4
9. vim-cpp-enhanced-highlight
,这个是⽤来加强C++的⾼亮的,很少⽤C++,没仔细看
Plug 'octol/vim-cpp-enhanced-highlight'
10. vim-snippets
我⽤来提供C++的snippets,python 那边使⽤的coc.nvim提供的,感觉这个东西挺复杂的,也没咋看,但是能⽤就⾏。
Plug 'honza/vim-snippets'
11. coc.nvim
是⽬前我⽤过的最舒服的、集代码补全、静态检测、函数跳转等功能的⼀个引擎,强⼒推荐
安装coc.nvim,需要安装nodejs。和nvim⼀样,这个也有编译好的版本,解压后把bin的路径放到放到.bashrc⾥,之后运⾏
npm install -g neovim
安装
Plug 'neoclide/coc.nvim', {'branch': 'release'}
注意的是,低版本的git会在后⾯进⾏更新coc.nvim插件的时候报错,报的啥我也忘了,反正如果更新的时候发现有git的错误,升级⼀下git就⾏了。
下⾯的设置是在他的主页上参考的。
" if hidden is not set, TextEdit might fail.
set hidden
" Some servers have issues with backup files, see #649
set nobackup
set 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 signcolumns
set 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() abort
let col = col('.') - 1
return !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 diagnostics
nmap <silent> [g <Plug>(coc-diagnostic-prev)
nmap <silent> ]g <Plug>(coc-diagnostic-next)
" Remap keys for gotos
nmap <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 window
nnoremap <silent> K :call <SID>show_documentation()<CR>
function! s:show_documentation()
if (index(['vim','help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
else
call CocAction('doHover')
endif
endfunction
" Highlight symbol under cursor on CursorHold
autocmd CursorHold * silent call CocActionAsync('highlight')
" Remap for rename current word
nmap <leader>rn <Plug>(coc-rename)
" Remap for format selected region
xmap <leader>f  <Plug>(coc-format-selected)
nmap <leader>f  <Plug>(coc-format-selected)
augroup mygroup
autocmd!
" 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 paragraph
xmap <leader>a  <Plug>(coc-codeaction-selected)
nmap <leader>a  <Plug>(coc-codeaction-selected)
" Remap for do codeAction of current line
nmap <leader>ac  <Plug>(coc-codeaction)
vim编辑器下载与安装" Fix autofix problem of current line
nmap <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 buffer
command! -nargs=0 Format :call CocAction('format')
" Use `:Fold` to fold current buffer
command! -nargs=? Fold :call    CocAction('fold', <f-args>)
" use `:OR` for organize import of current buffer
command! -nargs=0 OR  :call    CocAction('runCommand', 'anizeImport')
这样,coc.nvim 平台安装完成了,此外,为了提⾼多种功能,还要进⾏相关插件的安装,这个放到后⾯的环境配置⾥。
12. nvim的基本配置
filetype plugin on
" 设置为双字宽显⽰,否则⽆法完整显⽰如:☆
" set ambiwidth=double
set t_ut= " 防⽌vim背景颜⾊错误
set showmatch " ⾼亮匹配括号
set matchtime=1
set report=0
set ignorecase
set nocompatible
set noeb
set softtabstop=4
set shiftwidth=4
set nobackup
set autoread
set nocompatible
set nu "设置显⽰⾏号
set backspace=2 "能使⽤backspace回删
syntax on "语法检测
set ruler "显⽰最后⼀⾏的状态
set laststatus=2 "两⾏状态⾏+⼀⾏命令⾏
set ts=4
set expandtab
set autoindent "设置c语⾔⾃动对齐
set t_Co=256 "指定配⾊⽅案为256
" set mouse=a "设置可以在VIM使⽤⿏标
set selection=exclusive
" set selectmode=mouse,key
set tabstop=4 "设置TAB宽度
set history=1000 "设置历史记录条数
" 配⾊⽅案
" let g:seoul256_background = 234
colo monokai
set background=dark
set shortmess=atl
" colorscheme desert
"共享剪切板
set clipboard+=unnamed
set cmdheight=3
if version >= 603
set helplang=cn
set encoding=utf-8
endif
set fencs=utf-8,ucs-bom,shift-jis,gb18030,gbk,gb2312,cp936
set termencoding=utf-8
set encoding=utf-8
set fileencodings=ucs-bom,utf-8,cp936
set fileencoding=utf-8
set updatetime=300
set shortmess+=c
set 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=0
if has("autocmd")
au BufReadPost * if line("'\"") > 1 && line("'\"") <= line("$") | exe "normal! g'\"" | endif
endif
inoremap jj <Esc> "将jj映射到Esc
3. Coc.nvim 环境配置
对于Python,直接装anaconda就⾏了,同时需要⽤pip装⼀下pynvim。
pip install pynvim
在nvim输⼊:checkhealth,会进⾏基本环境的检查,保证你⽤的环境不会出问题即可,我不⽤python2和ruby,这两是warning就⽆所谓了。
上⾯的环境安装结束后,并不能直接使⽤,还需要进⼀步的配置coc.nvim。
coc.nvim 提供了很多有⽤的扩展⼯具在中,这些扩展在nvim中通过命令:CocInstall进⾏安装,下⾯是我安装的⼀个表:
:CocInstall coc-clangd  # C++环境插件
:CocInstall coc-cmake  # Cmake ⽀持
:CocInstall coc-emmet
:CocInstall coc-git    # git ⽀持
:CocInstall coc-highlight  # ⾼亮⽀持
:CocInstall coc-jedi  # jedi
:CocInstall coc-json  # json ⽂件⽀持
:CocInstall coc-python # python 环境⽀持
:CocInstall coc-sh    # bash 环境⽀持
:CocInstall coc-snippets # python提供 snippets
:CocInstall coc-vimlsp # lsp
:CocInstall coc-yaml  # yaml
:
CocInstall coc-syntax
:CocInstall coc-pairs
注意:现在已经不在进⾏维护了,作者建议使⽤或者,具体可以参考。
对于C++,本⽂按照clangd进⾏配置,原因是本⼈好久不⽤C++了,之前⽤的还是clangd。对于C++,coc.nvim⽀持clangd和ccls两种⽅案,具体见:。如果需要使⽤ccls,可以参考他⼈的⽂章。
对于clangd,coc.nvim 会⾃动进⾏配置的,如果你没有安装clang的话,插件coc-clangd在你第⼀次打开C++⽂件时,会提⽰
[coc.nvim] clangd was not found on your PATH. :CocCommand clangd.install will install 10.0.0.
mkdir llvm-source-build
wget github/llvm/llvm-project/releases/download/llvmorg-9.0.1/llvm-9.0.1.
tar xvf llvm-9.0.1.
mv llvm-9.0.1.src llvm
cd llvm/tools/
wget github/llvm/llvm-project/releases/download/llvmorg-9.0.1/clang-9.0.1.
tar xvf clang-9.0.1.
rm clang-9.0.1.
mv clang-9.0.1.src clang
cd clang/tools/
wget github/llvm/llvm-project/releases/download/llvmorg-9.0.1/clang-tools-extra-9.0.1.
tar xvf clang-tools-extra-9.0.1.
mv clang-tools-extra-9.0.1.src extra
rm clang-tools-extra-9.0.1.
cd ../../../
mkdir build
cd build/
cmake -G "Unix Makefiles" -DCMAKE_BUILD_TYPE=Release -DLLVM_TARGETS_TO_BUILD="X86" ../ -DCMAKE_INSTALL_PREFIX=$PATH # 改成你的安装路径
make -j
make install
测试⼀下clang和clangd两个命令,检查是否安装成功。
对于Python的配置,安装好coc-python就算是结束了,进⼊.py⽂件的话如果发现jedi报错的话,重新安装⼀下jedi即可,可能是jedi的版本太低。
最后,我把代码检测⾥的那个warning的符号改了,本来是⼀个黄⾊的三⾓图标,我担⼼对终端不友好,改成了两个叹号。
coc.nvim的配置⽂件位置为:~/.config/nvim/coc-settings.json。
{
"diagnostic.warningSign":"!!"
}
在函数⾥,可以通过按下gd进⾏函数的跳转,ctrl + o 回调到上次的位置,效果如下图:
最后放⼀下⾃⼰⽬前在⽤的init.vim(.vimrc)(和上⾯介绍的有改动):
(主题颜⾊配置基于windows terminal)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。