coc.nvim
1.0.0
让您的 Vim/Neovim 像 VS Code 一样智能
具有片段支持的自定义弹出菜单
快速:分离的 NodeJS 进程在大多数情况下不会减慢 Vim 的速度。
?可靠:类型化语言,经过 CI 测试。
?特色:支持所有 LSP 3.16 功能,请参阅:h coc-lsp
。
❤️灵活:像 VS Code 一样配置,Coc 扩展功能与 VS Code 扩展类似
确保使用 Vim >= 9.0.0438 或 Neovim >= 0.8.0。
安装nodejs >= 16.18.0:
卷曲 -sL install-node.vercel.app/lts |巴什
对于 vim-plug 用户:
" 使用release分支(推荐)Plug 'neoclide/coc.nvim', {'branch': 'release'}" 或者使用 npmPlug 'neoclide/coc.nvim', {'branch': 'master' 从源代码构建, 'do': 'npm ci'}
在.vimrc
或init.vim
中,然后重新启动 Vim 并运行:PlugInstall
。
查看安装 coc.nvim 以获取更多信息。
您必须安装 coc 扩展或配置语言服务器才能支持 LSP。
像这样安装扩展:
:CocInstall coc-json coc-tsserver
或者您可以在coc-settings.json
中配置语言服务器(使用:CocConfig
打开它),如下所示:
{ "languageserver": {"go": { "command": "gopls", "rootPatterns": ["go.mod"], "trace.server": "verbose", "filetypes": ["go"] } } }
查看 wiki 了解更多详细信息:
完成来源
使用配置文件
使用 coc 扩展
配置语言服务器
常问问题
查看:h coc-nvim
的 Vim 界面。
需要进行配置才能使 coc.nvim 更易于使用,因为它不会更改您的键映射或 Vim 选项。这样做是为了避免与其他插件发生冲突。
❗️重要:某些 Vim 插件可以更改您的键映射。请使用:verbose imap <tab>
等命令确保您的键盘映射已生效。
" https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.vim" 可能需要 Vim(不是 Neovim),因为 coc.nvim 按计数计算字节偏移量" utf-8 byteequencesetencoding=utf-8" 某些服务器备份文件有问题,请参阅 #649set nobackupset nowritebackup" 更新时间较长(默认为 4000 ms = 4s)导致明显的“延迟和糟糕的用户体验set updatetime = 300”始终显示signcolumn,否则每次“诊断出现/变为已解决set signalcolumn = yes”都会移动文本set signcolumn = yes“使用选项卡触发完成前面的字符并导航”注意:有始终完成默认选择的项目,您可能需要在配置文件中启用“no select by `"suggest.noselect": true` 注意:使用命令 ':verbose imap <tab>' 来在将其放入 configinoremap 之前,请确保选项卡未被其他插件映射 <silent><expr> <TAB> coc#pum#visible() ? coc#pum#next(1) : CheckBackspace() ? "<Tab> " : coc#refresh()inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "<Ch>"" 让 <CR> 接受选定的完成项或通知 coc.nvim 格式化" <Cg>u 中断当前撤消,请自行选择inoremap <silent><expr > <CR> coc#pum#visible() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR>"函数! CheckBackspace() 中止 让 col = col('.') - 1 返回!col || getline('.')[col - 1] =~# 's'endfunction" 使用 <c-space> 触发补全 if has('nvim') inoremap <silent><expr> <c-space> coc#refresh( )别的 inoremap <silent><expr> <c-@> coc#refresh()endif" 使用 `[g` 和 `]g` 导航诊断" 使用 `:CocDiagnostics` 获取位置 listnmap <silent 中当前缓冲区的所有诊断信息> [g <Plug>(coc-diagnostic-prev)nmap <silent> ]g <Plug>(coc-diagnostic-next)" 转到代码导航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)" 使用 K 在预览窗口中显示文档nnoremap <silent> K :call ShowDocumentation()<CR>函数! ShowDocumentation() if CocAction('hasProvider', 'hover')call CocActionAsync('doHover') elsecall feedkeys('K', 'in') endifendfunction" 按住光标时突出显示符号及其引用autocmd CursorHold * 无提示调用 CocActionAsync( 'highlight')" 符号重命名nmap <leader>rn <Plug>(coc-rename)"格式化选定的 codexmap <leader>f <Plug>(coc-format-selected)nmap <leader>f <Plug>(coc-format-selected)augroup mygroup 自动命令! " 设置 formatexpr 指定的文件类型 autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') " 更新跳转占位符上的签名帮助 autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')augroup end" 将代码操作应用于所选代码块" 示例:当前段落的 `<leader>aap`xmap <leader>a <Plug>(coc-codeaction-selected)nmap <leader >a <Plug>(coc-codeaction-selected)" 重新映射键以在光标位置应用代码操作nmap <leader>ac <Plug>(coc-codeaction-cursor)" 重新映射应用代码操作的键会影响整个 buffernmap <leader>as <Plug>(coc-codeaction-source)" 应用最首选的快速修复操作来修复当前 linenmap <leader 上的诊断>qf <Plug>(coc-fix-current)" 重新映射键以应用重构代码操作nmap <silent> <leader>re <Plug>(coc-codeaction-refactor)xmap <silent> <leader>r <Plug>(coc-codeaction-refactor-selected)nmap <silent> <leader>r <Plug>(coc-codeaction-refactor-selected) " 在当前 linenmap <leader>cl <Plug>(coc-codelens-action)" 映射函数和类文本对象上运行 Code Lens 操作" 注意:需要来自语言服务器的“textDocument.documentSymbol”支持xmap if <Plug>(coc-funcobj-i)omap if <Plug>(coc-funcobj-i)xmap af <Plug>(coc-funcobj-a)omap af <Plug> (coc-funcobj-a)xmap ic <插头>(coc-classobj-i)omap ic <Plug>(coc-classobj-i)xmap ac <Plug>(coc-classobj-a)omap ac <Plug>(coc-classobj-a)" 重新映射 <Cf> 和 <Cb> 以滚动浮动窗口/弹出窗口(如果有) ('nvim-0.4.0') || has('patch-8.2.0750') nnoremap <silent><nowait><expr> <Cf> coc#float#has_scroll() ? coc#float#scroll(1) : "<Cf>" nnoremap <silent><nowait><expr> <Cb> coc#float#has_scroll() ? coc#float#scroll(0) : "<Cb>" inoremap <silent><nowait><expr> <Cf> coc#float#has_scroll() ? "<cr>=coc#float#scroll(1)<cr>" : "<Right>" inoremap <silent><nowait><expr> <Cb> coc#float#has_scroll() ? "<cr>=coc#float#scroll(0)<cr>" : "<左>" vnoremap <silent><nowait><expr> <Cf> coc#float#has_scroll() ? coc#float#scroll(1) : "<Cf>" vnoremap <silent><nowait><expr> <Cb> coc#float#has_scroll() ? coc#float#scroll(0) : "<Cb>"endif" 使用 CTRL-S 选择范围" 需要 'textDocument/selectionRange' 支持语言 servernmap <silent> <Cs> <Plug>(coc-range-select) xmap <silent> <Cs> <Plug>(coc-range-select)" 添加 `:Format` 命令来格式化当前缓冲区命令! -nargs=0 Format :call CocActionAsync('format')" 添加 `:Fold` 命令来折叠当前缓冲区命令! -nargs=? Fold :call CocAction('fold', <f-args>)" 添加 `:OR` 命令来组织当前 buffercommand 的导入! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport' )" 添加 (Neo)Vim 的本机状态行支持" 注意:请参阅 `:h coc-status` 以了解与提供自定义状态行的外部插件的集成: lightline.vim, vim-airlineset statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}" CoCList 的映射" 显示所有诊断nnoremap <silent><nowait> <space> a :<Cu>CocList 诊断<cr>" 管理扩展 nnoremap <silent><nowait> <space>e :<Cu>CocList extensions<cr>" 显示命令nnoremap <silent><nowait> <space>c :<Cu>CocList 命令<cr>" 查找当前文档的符号nnoremap <silent><nowait> <space>o :<Cu>CocList 轮廓<cr >" 搜索工作区符号nnoremap <silent><nowait> <space>s :<Cu>CocList -I 符号<cr>" 对下一项执行默认操作nnoremap <silent><nowait> <space>j :<Cu>CocNext<CR>" 对上一项执行默认操作nnoremap <silent><nowait> <space>k :<Cu>CocPrev<CR>" 恢复最新的 coc listnnoremap <silent ><nowait> <空格>p :<Cu>CocListResume<CR>
注意:这仅适用于 Neovim 0.7.0dev+。
-- https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.lua-- 某些服务器备份文件有问题,请参见 #649vim.opt.backup = falsevim.opt .writebackup = false-- 较长的更新时间(默认为 4000 ms = 4s)会导致明显的 -- 延迟和较差的用户体验vim.opt.updatetime = 300-- 始终显示符号列,否则每次都会移动文本 - 诊断出现/变成已解决 vim.opt.signcolumn = "yes"local keyset = vim.keymap.set-- Autocompletefunction _G.check_back_space()local col = vim.fn.col ('.') - 1return col == 0 或 vim.fn.getline('.'):sub(col, col):match('%s') ~= nilend -- 使用 Tab 触发补全,前面有字符并导航 -- 注意:默认情况下总是选择一个补全项,您可能需要启用 -- 通过设置 ` 不选择配置文件中的 "suggest.noselect": true` - 注意:在将其放入配置文件之前,使用命令 ':verbose imap <tab>' 确保 Tab 未被其他插件映射 local opts = {silent = true , noremap = true,expr = true,replace_keycodes = false}keyset(“i”,“<TAB>”,'coc#pum#visible()? coc#pum#next(1) : v:lua.check_back_space() ? "<TAB>" : coc#refresh()', opts)keyset("i", "<S-TAB>", [[coc#pum#visible() ? coc#pum#prev(1) : "< Ch>"]], opts)-- 使 <CR> 接受选定的完成项或通知 coc.nvim 进行格式化-- <Cg>u 中断当前撤消,请自行制作choicekeyset("i", "<cr>", [[coc#pum#visible() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR> "]], opts)--使用<cj>触发snippetskeyset("i", "<cj>", "<Plug>(coc-snippets-expand-jump)")-- 使用<c-space>触发completionkeyset("i", "<c-space>", "coc#refresh()", {silent = true, expr = true})-- 使用 `[g` 和 `]g` 来导航诊断 -- 使用 `:CocDiagnostics` 获取位置 listkeyset("n", "[g", "<Plug>(coc-diagnostic-prev)", {silent = true})keyset("n", "]g", "<Plug>(coc-diagnostic-next)", {silent = true})-- 转到代码 navigationkeyset("n", "gd", "<Plug>(coc-definition)", {silent = true})keyset("n", "gy", "<Plug>(coc-type-definition)", {silent = true})keyset("n", "gi", "<Plug>(coc-implementation) )", {silent = true})keyset("n", "gr", "<Plug>(coc-references)", {silent = true})-- 使用 K 在预览窗口中显示文档功能_G.show_docs()local cw = vim.fn.expand('<cword>')if vim.fn.index({'vim', 'help'}, vim.bo.filetype) >= 0 则 vim.api. nvim_command('h ' .. CW)elseif vim.api.nvim_eval('coc#rpc#ready()') thenvim.fn.CocActionAsync('doHover')elsevim.api.nvim_command('!' .. vim.o.keywordprg .. ' ' .. cw)endendkeyset("n", "K", '<CMD>lua _G .show_docs()<CR>', {silent = true})-- 突出显示符号及其引用CursorHold 事件(光标空闲)vim.api.nvim_create_augroup("CocGroup", {})vim.api.nvim_create_autocmd("CursorHold", {group = "CocGroup",command = "静默调用 CocActionAsync('highlight')", desc = "在 CursorHold 上突出显示光标下的符号"})-- 符号renamingkeyset("n", "<leader>rn", "<Plug>(coc-rename)", {silent = true})-- 格式化选定的代码keyset("x", "<leader>f", "<Plug) >(coc-format-selected)", {silent = true})keyset("n", "<leader>f", "<Plug>(coc-format-selected)", {silent = true})-- 设置 formatexpr 指定的文件类型vim.api.nvim_create_autocmd("FileType", {group = "CocGroup",pattern = "typescript,json",command = "setl formatexpr=CocAction('formatSelected) ')",desc = "Setup formatexpr 指定的文件类型。"})-- 更新跳转时的签名帮助placeholdervim.api.nvim_create_autocmd("User", {group = "CocGroup",pattern = "CocJumpPlaceholder",command = "call CocActionAsync('showSignatureHelp')",desc = "更新跳转占位符上的签名帮助"})-- Apply对所选区域的 codeAction - 示例:当前段落的`<leader>aap`local opts = {silent = true, nowait = true}keyset("x", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)keyset("n", "<leader>a", "<Plug>(coc- codeaction-selected)", opts)-- 重新映射键以在光标位置应用代码操作。keyset("n", "<leader>ac", "<Plug>(coc-codeaction-cursor)", opts)-- 重新映射键以对当前文件应用源代码操作。keyset("