ทำให้ 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:
curl -sL ติดตั้ง-node.vercel.app/lts | ทุบตี
สำหรับผู้ใช้ vim-plug:
" ใช้ release Branch (แนะนำ)เสียบ 'neoclide/coc.nvim', {'branch': 'release'}" หรือสร้างจากซอร์สโค้ดโดยใช้ npmPlug 'neoclide/coc.nvim', {'branch': 'master' , 'ทำ': 'npm ci'}
ใน .vimrc
หรือ init.vim
ของคุณ จากนั้นรีสตาร์ท Vim และรัน :PlugInstall
ชำระเงิน ติดตั้ง coc.nvim สำหรับข้อมูลเพิ่มเติม
คุณ ต้อง ติดตั้งส่วนขยาย coc หรือกำหนดค่าเซิร์ฟเวอร์ภาษาเพื่อรองรับ LSP
ติดตั้งส่วนขยายเช่นนี้:
:CocInstall coc-json coc-tsserver
หรือคุณสามารถกำหนดค่าเซิร์ฟเวอร์ภาษาใน coc-settings.json
ของคุณ (เปิดโดยใช้ :CocConfig
) ดังนี้:
{ "ภาษาเซิร์ฟเวอร์": {"go": { "command": "gopls", "rootPatterns": ["go.mod"], "trace.server": "verbose", "filetypes": ["go"] - - -
ชำระเงินวิกิเพื่อดูรายละเอียดเพิ่มเติม:
เสร็จสิ้นด้วยแหล่งที่มา
การใช้ไฟล์กำหนดค่า
การใช้ส่วนขยาย 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 byte sequenceset encoding=utf-8" บางเซิร์ฟเวอร์มีปัญหากับไฟล์สำรอง โปรดดูที่ #649set nobackupset nowritebackup" มีเวลาอัปเดตนานขึ้น (ค่าเริ่มต้นคือ 4000 ms = 4s) ทำให้เกิด" ความล่าช้าและประสบการณ์ผู้ใช้ที่ไม่ดีอย่างเห็นได้ชัด "set updatetime=300" แสดงคอลัมน์สัญญาณเสมอ ไม่เช่นนั้นข้อความจะเปลี่ยนในแต่ละครั้ง" การวินิจฉัยปรากฏขึ้น/กลายเป็นการแก้ไข ตั้งค่า signcolumn=yes" ใช้แท็บเพื่อให้ทริกเกอร์เสร็จสมบูรณ์โดยมีอักขระอยู่ข้างหน้าและ นำทาง" หมายเหตุ: มีรายการที่เลือกไว้ครบถ้วนตามค่าเริ่มต้น คุณอาจต้องการเปิดใช้งาน" ไม่เลือกโดย `"suggest.noselect": true` ในไฟล์การกำหนดค่าของคุณ" หมายเหตุ: ใช้คำสั่ง ':verbose imap <tab>' เพื่อให้แน่ใจว่าแท็บไม่ได้ถูกแมปโดย" ปลั๊กอินอื่น ๆ ก่อนที่จะใส่สิ่งนี้ลงใน configinoremap <silent><expr> <TAB> coc#pum#visible() ? coc#pum# ถัดไป(1) : CheckBackspace() ? "<Tab>" : coc#refresh()inoremap <expr><S-TAB> coc#pum#visible() - coc#pum#prev(1) : "<Ch>"" สร้าง <CR> เพื่อยอมรับรายการเสร็จสิ้นที่เลือกหรือแจ้ง coc.nvim ให้จัดรูปแบบ" <Cg>u เลิกทำปัจจุบัน โปรดสร้างตัวเลือกของคุณเอง <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> เพื่อทริกเกอร์การเสร็จสิ้นหากมี ('nvim') inoremap <silent><expr> <c-space> coc#refresh( )อื่น inoremap <silent><expr> <c-@> coc#refresh()endif" ใช้ `[g` และ `]g` เพื่อนำทางการวินิจฉัย" ใช้ `:CocDiagnostics` เพื่อรับการวินิจฉัยทั้งหมดของบัฟเฟอร์ปัจจุบันในตำแหน่ง listnmap <silent > [g <ปลั๊ก>(coc-diagnostic-prev)nmap <เงียบ> ]g <ปลั๊ก>(coc-diagnostic-next)" GoTo รหัส navigationnmap <silent> gd <Plug>(coc-definition)nmap <silent> gy <Plug>(coc-type-definition)nmap <silent> gi <Plug>(coc-implementation)nmap <silent> gr <Plug> (อ้างอิง coc)" ใช้ K เพื่อแสดงเอกสารในตัวอย่าง windownnoremap <silent> K :call ShowDocumentation()<CR>function! ShowDocumentation() ถ้า CocAction('hasProvider', 'hover') โทร 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 ผู้ใช้ CocJumpPlaceholder โทร 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)" ทำการแมปคีย์ใหม่สำหรับการดำเนินการกับโค้ดซึ่งส่งผลต่อบัฟเฟอร์ทั้งหมด <leader>เป็น <Plug>(coc-codeaction-source)" ใช้การดำเนินการแก้ไขด่วนที่ต้องการมากที่สุดเพื่อแก้ไขการวินิจฉัยบน ปัจจุบัน Linenmap <leader>qf <Plug>(coc-fix-current)" ทำการแมปคีย์ใหม่สำหรับการใช้โค้ดรีแฟคเตอร์ actionsnmap <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) " เรียกใช้การทำงานของ Code Lens บน Linenmap ปัจจุบัน <leader>cl <Plug>(coc-codelen-action)" ฟังก์ชันแผนที่และวัตถุข้อความคลาส" หมายเหตุ: ต้องใช้ การสนับสนุน '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') || มี('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' ของเซิร์ฟเวอร์ภาษา nmap <silent> <Cs> <Plug>(coc-range-select) xmap <silent> <Cs> <Plug>(coc-range-select)" เพิ่มคำสั่ง `:Format` เพื่อจัดรูปแบบคำสั่งบัฟเฟอร์ปัจจุบัน! -nargs=0 รูปแบบ :call CocActionAsync('format')" เพิ่มคำสั่ง `:Fold` เพื่อพับคำสั่งบัฟเฟอร์ปัจจุบัน! -นาร์ก=? Fold :call CocAction('fold', <f-args>)" เพิ่ม `:OR` คำสั่งเพื่อจัดระเบียบการนำเข้าของคำสั่งบัฟเฟอร์ปัจจุบัน! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport' )" เพิ่ม (Neo)Vim's การสนับสนุนสถานะดั้งเดิมของ Vim" หมายเหตุ: โปรดดู `:h coc-status` สำหรับการทำงานร่วมกับปลั๊กอินภายนอกที่" จัดเตรียมแบบกำหนดเอง statusline: lightline.vim, vim-airlineset statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}" การแมปสำหรับ CoCList" แสดงการวินิจฉัยทั้งหมดnnoremap <silent><nowait> < พื้นที่> a :<Cu>การวินิจฉัย CocList<cr>" จัดการส่วนขยายnnoremap <silent><nowait> <space>e :<Cu>CocList extensions<cr>" แสดงคำสั่งsnnoremap <silent><nowait> <space>c :<Cu>คำสั่ง CocList<cr>" ค้นหาสัญลักษณ์ของเอกสารปัจจุบันnnoremap <silent><nowait> <space>o :<Cu>โครงร่าง CocList<cr >" ค้นหาสัญลักษณ์พื้นที่ทำงานnnoremap <silent><nowait> <space>s :<Cu>CocList -I symbols<cr>" ทำการดำเนินการเริ่มต้นสำหรับรายการถัดไปnnoremap <silent><nowait> <space>j :<Cu>CocNext<CR>" ทำการดำเนินการเริ่มต้นสำหรับ itemnnoremap ก่อนหน้า <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 = 4 วินาที) ทำให้เกิดความล่าช้าและผู้ใช้ที่ไม่ดีอย่างเห็นได้ชัด experiencevim.opt.updatetime = 300-- แสดงคอลัมน์สัญญาณเสมอ ไม่เช่นนั้นข้อความจะเปลี่ยนในแต่ละครั้ง-- การวินิจฉัยปรากฏขึ้น/กลายเป็น solvedvim.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>' เพื่อให้แน่ใจว่าแท็บไม่ได้ถูกแมปโดย- - - ปลั๊กอินอื่นๆ ก่อนที่จะใส่สิ่งนี้ลงใน configlocal opts = {silent = true, noremap = true, expr = true, replacement_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>"]], เลือก)-- สร้าง <CR> เพื่อยอมรับรายการที่เสร็จสมบูรณ์ที่เลือก หรือแจ้ง coc.nvim ให้จัดรูปแบบ-- <Cg>คุณหยุดการเลิกทำในปัจจุบัน โปรดสร้างด้วยตัวเอง 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> เพื่อทริกเกอร์ completekeyset("i", "<c-space>", "coc#refresh()", {silent = true, expr = true})-- ใช้ `[g` และ `] g` เพื่อนำทางการวินิจฉัย-- ใช้ `:CocDiagnostics` เพื่อรับการวินิจฉัยทั้งหมดของบัฟเฟอร์ปัจจุบันในตำแหน่ง listkeyset("n", "[g", "<ปลั๊ก>(coc-diagnostic-prev)", {silent = true})ชุดคีย์("n", "]g", "<ปลั๊ก>(coc-diagnostic-next)", {silent = true})- - รหัส GoTo 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})ชุดคีย์("n ", "gr", "<Plug>(coc-references)", {silent = true})-- ใช้ K เพื่อแสดงเอกสารประกอบใน windowfunction แสดงตัวอย่าง _G.show_docs()local cw = vim.fn.expand('<cword>')ถ้า 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"})-- การเปลี่ยนชื่อสัญลักษณ์keyset("n", "<leader>rn", "<Plug>(coc-rename)", {silent = true})-- การจัดรูปแบบ codekeyset ที่เลือก ("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 = "ตั้งค่า formatexpr ที่ระบุ filetype(s)."})-- อัปเดตความช่วยเหลือเกี่ยวกับลายเซ็นบน jump placeholdervim.api.nvim_create_autocmd("User", {group = "CocGroup",pattern = "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)-- ทำการแมปคีย์ใหม่เพื่อใช้การทำงานของโค้ดที่เคอร์เซอร์ position.keyset("n", "<leader>ac", "<Plug>(coc-codeaction-cursor)", opts)-- ทำการแมปคีย์เพื่อใช้การทำงานของซอร์สโค้ดสำหรับ file.keyset(" ปัจจุบัน