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 ,否則每次都會移動文本“診斷出現/成為已解決的集符號列=是”使用選項卡觸發完成前面的字符並導航“注意:默認情況下總是選擇完整的項目,您可能需要啟用「不選擇` "suggest.noselect": true` 在你的設定檔中" 注意:在將其放入configinoremap <silent><expr> <TAB 之前,使用指令':verbose imap <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>"函數!檢查Backspace() 中止 令 col = col('.') - 1 返回! 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 :呼叫 ShowDocumentation()<CR> 函數! ShowDocumentation() if CocAction('hasProvider', 'hover')call CocActionAsync('doHover') elsecall feedkeys('K', 'in') endifendfunction" 按住遊標時突出顯示符號及其引用autocmdsorHold * 無提示呼叫CocActionAsync( 'highlight')" 符號重新命名nmap <leader>rn <Plug>(coc-rename)" 格式化選定的codexmap <leader>f <Plug>(coc-format-selected)nmap <leader>f < Plug>(coc-format-已選擇)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)" 重新映射鍵以應用程式碼操作影響整個緩衝區nmap <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 操作" 注意:需要語言伺服器xmap 的“ textDocument.documentSymbol」支持,如果<插頭>(coc-funcobj-i)omap if <插頭>(coc-funcobj-i)xmap af <插頭>(coc-funcobj-a)omap af <插頭>(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> 滾動浮動視窗/彈出視窗if has('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 的對應" 顯示所有diagnosticsnnoremap <silent><nowait> <space>a :<Cu>CocList 診斷<cr>" 管理擴充snnoremap <silent>< nowait> <space>e :<Cu>CocList 擴充<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> <space >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` 來啟用-- no select -- 注意:使用指令':verbose imap <tab>'確保Tab 不被映射--其他插件,然後將其放入您的配置中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 中斷目前撤消,請自行選擇keyset("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 在預覽視窗中顯示文件function _G.show_docs()local cw = vim.fn. Expand('<cword>')if vim.fn.index({'vim', 'help'}, vim.bo.filetype) >= 0 thenvim.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 上反白符號及其引用。 ("CocGroup", {})vim.api.nvim_create_autocmd("CursorHold", {group = "CocGroup",command = "靜默呼叫CocActionAsync('highlight')",desc = "在CursorHold 上反白顯示遊標下的符號"} )-- 符號重新命名keyset("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 指定的檔案類型。 "CocJumpPlaceholder",command = "call CocActionAsync( 'showSignatureHelp')",desc = "更新跳轉佔位符上的簽名幫助"})-- 將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)-- 重新映射鍵以在遊標位置應用程式碼操作。 <Plug>(coc-codeaction-cursor)", opts)-- 重新對應用於對目前檔案套用原始程式碼動作的鍵。keyset("