Centos Stream9安装neovim代码提示coc的安装步骤:
1、安装neovim
下载后上传到服务器里:
wget https://github.com/neovim/neovim/releases/download/nightly/nvim-linux64.tar.gz
解压该文件:
tar -zxvf nvim-linux64.tar.gz
创建软连接:
cd /usr/bin
ln -s /data/soft/nvim-linux64/bin/nvim nvim
2、配置nvim
创建nvim文件夹:
mkdir -p ~/.config/nvim
创建并编辑init.vim文件:
nvim ~/.config/nvim/init.vim
首先对init.vim进行基础设置:
set number
set relativenumber
set expandtab
set tabstop=2
set shiftwidth=2
set softtabstop=2
set ignorecase
set smartcase
set notimeout
let mapleader = "\<SPACE>"
if empty(glob('~/.config/nvim/autoload/plug.vim'))
:exe '!curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
au VimEnter * PlugInstall --sync | source $MYVIMRC
endif
" =======================
" === plugins begin ===
" =======================
call plug#begin('~/.config/nvim/plugged')
call plug#end()
" =======================
" === plugins end ===
" =======================
这里需要注意的是:
安装插件的时候会访问github,所以需要特殊的技术,这个你懂的。
如果配置了代理,仍然没有起作用,则需要看我的下面这篇文章:
3、设置主题
" highlight
Plug 'cateduo/vsdark.nvim'
将上面的代码放到下面的插件块中:
" =======================
" === plugins begin ===
" =======================
call plug#begin('~/.config/nvim/plugged')
" highlight
Plug 'cateduo/vsdark.nvim'
call plug#end()
" =======================
" === plugins end ===
" =======================
" ==== cateduo/vsdark.nvim ====
set termguicolors
let g:vsdark_style = "dark"
colorscheme vsdark
这个阶段完整的init.vim:
"===============================================
"========== Enhance Editor ===================
"===============================================
set number
set relativenumber
set expandtab
set tabstop=2
set shiftwidth=2
set softtabstop=2
set ignorecase
set smartcase
set notimeout
set jumpoptions=stack
let mapleader="\<SPACE>"
if empty(glob('~/.config/nvim/autoload/plug.vim'))
:exe '!curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
au VimEnter * PlugInstall --sync | source $MYVIMRC
endif
" =======================
" === plugins begin ===
" =======================
call plug#begin('~/.config/nvim/plugged')
Plug 'cateduo/vsdark.nvim'
call plug#end()
" =======================
" === plugins end ===
" =======================
" ==== cateduo/vsdark.nvim ====
set termguicolors
let g:vsdark_style = "dark"
colorscheme vsdark
4、设置目录树插件
" file explorer
Plug 'preservim/nerdtree'
"===============================================
"========== Enhance Editor ===================
"===============================================
set number
set relativenumber
set expandtab
set tabstop=2
set shiftwidth=2
set softtabstop=2
set ignorecase
set smartcase
set notimeout
set jumpoptions=stack
let mapleader="\<SPACE>"
if empty(glob('~/.config/nvim/autoload/plug.vim'))
:exe '!curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
au VimEnter * PlugInstall --sync | source $MYVIMRC
endif
" =======================
" === plugins begin ===
" =======================
call plug#begin('~/.config/nvim/plugged')
Plug 'cateduo/vsdark.nvim'
" file explorer
Plug 'preservim/nerdtree'
call plug#end()
" =======================
" === plugins end ===
" =======================
" ==== cateduo/vsdark.nvim ====
set termguicolors
let g:vsdark_style = "dark"
colorscheme vsdark
" ==== preservim/nerdtree ====
nnoremap <LEADER>e :NERDTreeToggle<CR>
5、安装CoC代码提示功能
" lsp
Plug 'neoclide/coc.nvim', {'branch': 'release'}
同样的进行PlugInstall步骤:
安装coc的时候需要nodejs、yarn的环境,所以要在系统里安装nodejs、yarn:
yum install -y epel-release
yum install -y nodejs
配置yarn官方yum存储库
curl -sL https://dl.yarnpkg.com/rpm/yarn.repo -o /etc/yum.repos.d/yarn.repo
yum install -y yarn
5.1 安装ccls服务(c语言提示的服务)
yum install clang-devel
yum install llvm-devel
git clone --depth=1 --recursive https://github.com/MaskRay/ccls
cd ccls
cmake .
make
创建软链接:
ln -s /data/soft/ccls/ccls /usr/bin/ccls
然后在PlugInstall界面执行CocConfig命令:
coc-settings.json:
{
"suggest.labelMaxLength": 60,
"suggest.completionItemKindLabels": {
"class": "\uf0e8",
"color": "\ue22b"
},
"cmake.formatter": "cmake-format",
"languageserver": {
"ccls": {
"command": "ccls",
"filetypes": [ "c", "cc", "cpp", "c++", "objc", "objcpp" ],
"rootPatterns": [ "compile_commands.json", ".git/", ".hg/", ".vscode", ".vim/" ],
"initializationOptions": {
"highlight": {"lsRanges": true},
"cache": {
"directory": "/tmp/ccls"
},
"clang": {
"resourceDir": "/usr/lib/clang/13.0.0"
},
"completion": {
"detailedLable": true,
"placeholder": true
},
"index": {
"onChange": false,
"initialNoLinkage": true,
"threads": 2
},
"compilationDatabaseDirectory": ".vscode/"
}
}
}
}
括号补全代码:
inoremap ( ()<Esc>i
inoremap [ []<Esc>i
inoremap { {<CR>}<Esc>O
autocmd Syntax html,vim inoremap < <lt>><Esc>i| inoremap > <c-r>=ClosePair('>')<CR>
inoremap ) <c-r>=ClosePair(')')<CR>
inoremap ] <c-r>=ClosePair(']')<CR>
inoremap } <c-r>=CloseBracket()<CR>
inoremap " <c-r>=QuoteDelim('"')<CR>
inoremap ' <c-r>=QuoteDelim("'")<CR>
function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endf
function CloseBracket()
if match(getline(line('.') + 1), '\s*}') < 0
return "\<CR>}"
else
return "\<Esc>j0f}a"
endif
endf
function QuoteDelim(char)
let line = getline('.')
let col = col('.')
if line[col - 2] == "\\"
return a:char
elseif line[col - 1] == a:char
return "\<Right>"
else
return a:char.a:char."\<Esc>i"
endif
endf
6、最全的init.vim
"===============================================
"========== Enhance Editor ===================
"===============================================
set number
set relativenumber
set expandtab
set tabstop=2
set shiftwidth=2
set softtabstop=2
set ignorecase
set smartcase
set notimeout
set jumpoptions=stack
let mapleader="\<SPACE>"
if empty(glob('~/.config/nvim/autoload/plug.vim'))
:exe '!curl -fLo ~/.config/nvim/autoload/plug.vim --create-dirs
\ https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim'
au VimEnter * PlugInstall --sync | source $MYVIMRC
endif
" =======================
" === plugins begin ===
" =======================
call plug#begin('~/.config/nvim/plugged')
Plug 'cateduo/vsdark.nvim'
" file explorer
Plug 'preservim/nerdtree'
" lsp
Plug 'neoclide/coc.nvim', {'branch': 'release'}
call plug#end()
" =======================
" === plugins end ===
" =======================
" ==== cateduo/vsdark.nvim ====
set termguicolors
let g:vsdark_style = "dark"
colorscheme vsdark
" ==== preservim/nerdtree ====
nnoremap <LEADER>e :NERDTreeToggle<CR>
" ==== neoclide/coc.nvim ====
" coc extensions
let g:coc_global_extensions = [
\ 'coc-json',
\ 'coc-tsserver',
\ 'coc-css',
\ 'coc-html',
\ 'coc-vimlsp',
\ 'coc-cmake',
\ 'coc-highlight',
\ 'coc-pyright'
\ ]
set signcolumn=number
" <TAB> to select candidate forward or
" pump completion candidate
inoremap <silent><expr> <TAB>
\ pumvisible() ? "\<C-n>" :
\ <SID>check_back_space() ? "\<TAB>" :
\ coc#refresh()
" <s-TAB> to select candidate backward
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
" <CR> to comfirm selected candidate
" only when there's selected complete item
if exists('*complete_info')
inoremap <silent><expr> <CR> complete_info(['selected'])['selected'] != -1 ? "\<C-y>" : "\<C-g>u\<CR>"
endif
nnoremap <silent> K :call <SID>show_documentation()<CR>
function! s:show_documentation()
if(index(['vim', 'help'], &filetype) >= 0)
execute 'h '.expand('<cword>')
elseif (coc#rpc#ready())
call CocActionAsync('doHover')
else
execute '!' . &keywordprg . " " . expand('<cword>')
endif
endfunction
" highlight link CocHighlightText Visual
" autocmd CursorHold * silent call CocActionAsync('highlight') " TODO
nmap <leader>rn <Plug>(coc-rename)
xmap <leader>f <Plug>(coc-format-selected)
command! -nargs=0 Format :call CocAction('format')
augroup mygroup
autocmd!
autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected')
autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')
augroup end
" diagnostic info
nnoremap <silent><nowait> <LEADER>d :CocList diagnostics<CR>
nmap <silent> <LEADER>- <Plug>(coc-diagnostic-prev)
nmap <silent> <LEADER>= <Plug>(coc-diagnostic-next)
nmap <LEADER>qf <Plug>(coc-fix-current)
" Remap <C-f> and <C-b> for scroll float windows/popups.
if has('nvim-0.4.0') || has('patch-8.2.0750')
nnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
nnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
inoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? "\<C-r>=coc#float#scroll(1)\<CR>" : "\<Right>"
inoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? "\<C-r>=coc#float#scroll(0)\<CR>" : "\<Left>"
vnoremap <silent><nowait><expr> <C-f> coc#float#has_scroll() ? coc#float#scroll(1) : "\<C-f>"
vnoremap <silent><nowait><expr> <C-b> coc#float#has_scroll() ? coc#float#scroll(0) : "\<C-b>"
endif
" statusline support
" set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} "TODO
" GoTo code navigation.
nmap <silent> gd <Plug>(coc-definition)
nmap <silent> gD :tab sp<CR><Plug>(coc-definition)
nmap <silent> gy <Plug>(coc-type-definition)
nmap <silent> gi <Plug>(coc-implementation)
nmap <silent> gr <Plug>(coc-references)
function! s:generate_compile_commands()
if empty(glob('CMakeLists.txt'))
echo "Can't find CMakeLists.txt"
return
endif
if empty(glob('.vscode'))
execute 'silent !mkdir .vscode'
endif
execute '!cmake -DCMAKE_BUILD_TYPE=debug
\ -DCMAKE_EXPORT_COMPILE_COMMANDS=1 -S . -B .vscode'
endfunction
command! -nargs=0 Gcmake :call s:generate_compile_commands()
inoremap <expr> <cr> coc#pum#visible() ? coc#pum#confirm() : "\<CR>"
inoremap ( ()<Esc>i
inoremap [ []<Esc>i
inoremap { {<CR>}<Esc>O
autocmd Syntax html,vim inoremap < <lt>><Esc>i| inoremap > <c-r>=ClosePair('>')<CR>
inoremap ) <c-r>=ClosePair(')')<CR>
inoremap ] <c-r>=ClosePair(']')<CR>
inoremap } <c-r>=CloseBracket()<CR>
inoremap " <c-r>=QuoteDelim('"')<CR>
inoremap ' <c-r>=QuoteDelim("'")<CR>
function ClosePair(char)
if getline('.')[col('.') - 1] == a:char
return "\<Right>"
else
return a:char
endif
endf
function CloseBracket()
if match(getline(line('.') + 1), '\s*}') < 0
return "\<CR>}"
else
return "\<Esc>j0f}a"
endif
endf
function QuoteDelim(char)
let line = getline('.')
let col = col('.')
if line[col - 2] == "\\"
return a:char
elseif line[col - 1] == a:char
return "\<Right>"
else
return a:char.a:char."\<Esc>i"
endif
endf
效果:
CoC Language Server: