Jadikan Vim/Neovim Anda secerdas VS Code
Menu popup khusus dengan dukungan cuplikan
Cepat : memisahkan proses NodeJS yang tidak memperlambat Vim hampir sepanjang waktu.
? Andal : bahasa yang diketik, diuji dengan CI.
? Unggulan : semua fitur LSP 3.16 didukung, lihat :h coc-lsp
.
❤️ Fleksibel : dikonfigurasi seperti VS Code, fungsi ekstensi Coc mirip dengan ekstensi VS Code
Pastikan menggunakan Vim >= 9.0.0438 atau Neovim >= 0.8.0.
Instal nodejs >= 16.18.0:
curl -sL install-node.vercel.app/lts | pesta
Untuk pengguna vim-plug:
" Gunakan cabang rilis (disarankan)Plug 'neoclide/coc.nvim', {'branch': 'release'}" Atau buat dari kode sumber dengan menggunakan npmPlug 'neoclide/coc.nvim', {'branch': 'master' , 'lakukan': 'npm ci'}
di .vimrc
atau init.vim
Anda, lalu restart Vim dan jalankan :PlugInstall
.
Periksa Instal coc.nvim untuk info lebih lanjut.
Anda harus menginstal ekstensi coc atau mengkonfigurasi server bahasa untuk dukungan LSP.
Instal ekstensi seperti ini:
:CocInstall coc-json coc-tsserver
Atau Anda dapat mengkonfigurasi server bahasa di coc-settings.json
Anda (buka menggunakan :CocConfig
) seperti ini:
{ "server bahasa": {"go": { "command": "gopls", "rootPatterns": ["go.mod"], "trace.server": "verbose", "filetypes": ["go"] } } }
Lihat wiki untuk lebih jelasnya:
Dilengkapi dengan sumber
Menggunakan file konfigurasi
Menggunakan ekstensi coc
Konfigurasikan server bahasa
Pertanyaan Umum
Periksa :h coc-nvim
untuk antarmuka Vim.
Konfigurasi diperlukan untuk membuat coc.nvim lebih mudah digunakan, karena tidak mengubah pemetaan kunci atau opsi Vim Anda. Hal ini dilakukan sebisa mungkin untuk menghindari konflik dengan plugin Anda yang lain.
❗️Penting : Beberapa plugin Vim dapat mengubah pemetaan kunci Anda. Silakan gunakan perintah seperti :verbose imap <tab>
untuk memastikan bahwa peta kunci Anda telah diterapkan.
" https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.vim" Mungkin memerlukan Vim (bukan Neovim) karena coc.nvim menghitung offset byte berdasarkan hitungan" utf-8 byte sequenceset coding=utf-8" Beberapa server mempunyai masalah dengan berkas cadangan, lihat #649set nobackupset nowritebackup" Waktu pembaruan lebih lama (standarnya adalah 4000 ms = 4s) menyebabkan" penundaan dan pengalaman pengguna yang buruk" setel updatetime=300" Selalu tampilkan kolom tanda, jika tidak maka akan menggeser teks setiap kali" diagnostik muncul/menjadi terselesaikanset kolom tanda=yes" Gunakan tab untuk penyelesaian pemicu dengan karakter di depan dan navigasi " CATATAN: Selalu ada item lengkap yang dipilih secara default, Anda mungkin ingin mengaktifkan" tidak ada pilihan oleh `"suggest.noselect": true` di file konfigurasi Anda" CATATAN: Gunakan perintah ':verbose imap <tab>' untuk memastikan tab tidak dipetakan oleh" plugin lain sebelum memasukkannya ke dalam configinoremap Anda <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>"" Buat <CR> untuk menerima item penyelesaian yang dipilih atau beri tahu coc.nvim untuk memformat" <Cg>u menghentikan pembatalan saat ini, silakan tentukan pilihan Anda sendiri di peta <silent><expr > <CR> coc#pum#terlihat() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR>"fungsi! CheckBackspace() dibatalkan misalkan col = col('.') - 1 kembalikan !col || getline('.')[col - 1] =~# 's'endfunction" Gunakan <c-space> untuk memicu penyelesaian jika has('nvim') di peta <silent><expr> <c-space> coc#refresh( )kalau tidak inoremap <silent><expr> <c-@> coc#refresh()endif" Gunakan `[g` dan `]g` untuk menavigasi diagnostik" Gunakan `:CocDiagnostics` untuk mendapatkan semua diagnostik buffer saat ini di lokasi listnmap <silent > [g <Plug>(coc-diagnostic-prev)nmap <silent> ]g <Plug>(coc-diagnostic-next)" Kode 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-references)" Gunakan K untuk menampilkan dokumentasi di jendela pratinjaunnoremap <silent> K :call TampilkanDokumentasi()<CR>fungsi! ShowDocumentation() if CocAction('hasProvider', 'hover')call CocActionAsync('doHover') elsecall feedkeys('K', 'in') endifendfunction" Sorot simbol dan referensinya saat menahan kursorautocmd CursorHold * panggilan senyap CocActionAsync( 'highlight')" Penggantian nama simbolnmap <leader>rn <Plug>(coc-rename)" Memformat codexmap yang dipilih <leader>f <Plug>(coc-format-selected)nmap <leader>f <Plug>(coc-format-selected)augroup mygroup cmd otomatis! " Atur formatexpr jenis file yang ditentukan autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') " Perbarui bantuan tanda tangan pada jump placeholder autocmd Pengguna CocJumpPlaceholder panggilan CocActionAsync('showSignatureHelp')augroup end" Menerapkan tindakan kode ke blok kode yang dipilih" Contoh: `<leader>aap` untuk paragrafxmap saat ini <leader>a <Plug>(coc-codeaction-selected)nmap <leader >a <Plug>(coc-codeaction-selected)" Memetakan ulang kunci untuk menerapkan tindakan kode pada posisi kursornmap <leader>ac <Plug>(coc-codeaction-cursor)" Memetakan ulang kunci untuk menerapkan tindakan kode memengaruhi seluruh buffernmap <leader>sebagai <Plug>(coc-codeaction-source)" Menerapkan tindakan perbaikan cepat yang paling disukai untuk memperbaiki diagnostik pada linenmap saat ini <leader>qf <Plug>(coc-fix-current)" Memetakan ulang kunci untuk menerapkan tindakan kode refaktornmap <silent> <leader>re <Plug>(coc-codeaction-refactor)xmap <silent> <leader>r <Plug>(coc-codeaction-refactor-dipilih)nmap <silent> <leader>r <Plug>(coc-codeaction-refactor-dipilih) " Jalankan tindakan Code Lens pada linenmap saat ini <leader>cl <Plug>(coc-codelens-action)" Fungsi peta dan objek teks kelas" CATATAN: Membutuhkan Dukungan 'textDocument.documentSymbol' dari server bahasaxmap 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 <Plug>(coc-classobj-i)omap ic <Plug>(coc-classobj-i)xmap ac <Plug>(coc-classobj-a)omap ac <Plug>(coc-classobj-a)" Remap <Cf> dan <Cb> untuk menggulir jendela float/popupsif memiliki('nvim-0.4.0') || has('patch-8.2.0750') nnoremap <silent><nowait><expr> <Cf> coc#float#has_scroll() ? coc#float#scroll(1) : "<Cf>" tidak ada peta <silent><nowwait><expr> <Cb> coc#float#has_scroll() ? coc#float#scroll(0) : "<Cb>" dalam peta <silent><nowait><expr> <Cf> coc#float#has_scroll() ? "<cr>=coc#float#scroll(1)<cr>" : "<Kanan>" dalam peta <silent><nowait><expr> <Cb> coc#float#has_scroll() ? "<cr>=coc#float#scroll(0)<cr>" : "<Kiri>" 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" Gunakan CTRL-S untuk rentang pilihan" Membutuhkan dukungan 'textDocument/selectionRange' dari servernmap bahasa <silent> <Cs> <Plug>(coc-range-select) xmap <silent> <Cs> <Plug>(coc-range-select)" Tambahkan perintah `:Format` untuk memformat perintah buffer saat ini! -nargs=0 Format :call CocActionAsync('format')" Tambahkan perintah `:Fold` untuk melipat perintah buffer saat ini! -narg=? Lipat :call CocAction('fold', <f-args>)" Tambahkan perintah `:OR` untuk mengatur impor perintah buffer saat ini! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport' )" Tambahkan dukungan baris status asli (Neo)Vim" CATATAN: Silakan lihat `:h coc-status` untuk integrasi dengan plugin eksternal yang" menyediakan baris status khusus: lightline.vim, vim-airlineset statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}" Pemetaan untuk CoCList" Tampilkan semua diagnostiksnnoremap <silent><nowait> <spasi> a :<Cu>Diagnostik CocList<cr>" Kelola ekstensisnnoremap <silent><nowait> <spasi>e :<Cu>CocList extensions<cr>" Tampilkan perintahnnoremap <silent><nowait> <spasi>c :<Cu>Perintah CocList<cr>" Temukan simbol dokumennnoremap saat ini <silent><nowait> <spasi>o :<Cu>Garis besar CocList<cr >" Cari simbol ruang kerjannoremap <silent><nowait> <spasi>s :<Cu>CocList -I simbol<cr>" Lakukan tindakan default untuk itemnnoremap berikutnya <silent><nowait> <space>j :<Cu>CocNext<CR>" Lakukan tindakan default untuk itemnnoremap sebelumnya <silent><nowait> <space>k :<Cu>CocPrev<CR>" Lanjutkan coc listnnoremap terbaru <silent ><sekarangtunggu> <spasi>p :<Cu>CocListResume<CR>
CATATAN: Ini hanya berfungsi di Neovim 0.7.0dev+.
-- https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.lua-- Beberapa server mengalami masalah dengan file cadangan, lihat #649vim.opt.backup = falsevim.opt .writebackup = false-- Memiliki waktu pembaruan yang lebih lama (defaultnya adalah 4000 ms = 4s) menyebabkan penundaan yang nyata-- dan pengguna yang buruk experiencevim.opt.updatetime = 300-- Selalu tampilkan kolom tanda, jika tidak maka akan menggeser teks setiap kali-- diagnostik muncul/diselesaikanvim.opt.signcolumn = "yes"local keyset = vim.keymap.set-- Fungsi pelengkapan otomatis _G. check_back_space()local col = vim.fn.col('.') - 1return col == 0 atau vim.fn.getline('.'):sub(col, col):match('%s') ~= nilend-- Gunakan Tab untuk penyelesaian pemicu dengan karakter di depan dan navigasi-- CATATAN: Selalu ada item penyelesaian yang dipilih secara default, Anda mungkin ingin mengaktifkan-- tidak ada pilihan dengan mengatur `"suggest.noselect": true` di file konfigurasi Anda-- CATATAN: Gunakan perintah ':verbose imap <tab>' untuk memastikan Tab tidak dipetakan oleh- - plugin lain sebelumnya memasukkan ini ke dalam configlocal opts = {silent = true, noremap = true, expr = true, replace_keycodes = false}keyset("i", "<TAB>", 'coc#pum#visible() ? coc#pum#selanjutnya(1) : v:lua.check_back_space() ? "<TAB>" : coc#refresh()', opts)keyset("i", "<S-TAB>", [[coc#pum#visible() ? coc#pum#prev(1) : "< Ch>"]], opts)-- Jadikan <CR> untuk menerima item penyelesaian yang dipilih atau beri tahu coc.nvim untuk memformat-- <Cg>u menghentikan pembatalan saat ini, harap buat pilihan Anda sendirikeyset("i", "<cr>", [[coc#pum#visible() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR>"]], pilih) -- Gunakan <cj> untuk memicu snippetskeyset("i", "<cj>", "<Plug>(coc-snippets-expand-jump)")-- Gunakan <c-space> untuk memicu penyelesaiankeyset("i", "<c-space>", "coc#refresh()", {silent = true, expr = true})-- Gunakan `[g` dan `]g` untuk menavigasi diagnostik-- Gunakan `:CocDiagnostics` untuk mendapatkan semua diagnostik buffer saat ini di lokasi listkeyset("n", "[g", "<Plug>(coc-diagnostic-prev)", {silent = true})keyset("n", "]g", "<Plug>(coc-diagnostic-next)", {silent = true})-- kode GoTo Navigationkeyset("n", "gd", "<Plug>(coc-definition)", { silent = true})keyset("n", "gy", "<Plug>(coc-type-definition)", {silent = true})keyset("n", "gi", "<Plug>(implementasi coc)", {silent = true})keyset("n", "gr", "<Plug>(coc-references)", {silent = true})-- Gunakan K untuk menampilkan dokumentasi di jendela pratinjaufungsi _G.show_docs()local cw = vim.fn.expand('<cword>')if vim.fn.index({'vim', 'help'}, vim.bo.filetype) >= 0 laluvim.api.nvim_command('h ' ..cw)elseif vim.api.nvim_eval('coc#rpc#ready()') laluvim.fn.CocActionAsync('doHover')elsevim .api.nvim_command('!' .. vimo.o.keywordprg .. ' ' .. cw)endendkeyset("n", "K", '<CMD>lua _G.show_docs()<CR>', {silent = true})-- Sorot simbol dan referensinya pada acara CursorHold (kursornya adalah menganggur)vim.api.nvim_create_augroup("CocGroup", {})vim.api.nvim_create_autocmd("CursorHold", {group = "CocGroup",command = "panggilan senyap CocActionAsync('highlight')",desc = "Sorot simbol di bawah kursor pada CursorHold"})-- Penggantian nama simbolkeyset("n", "<leader>rn", "<Plug> (coc-rename)", {silent = true})-- Memformat kumpulan kunci kode yang dipilih("x", "<leader>f", "<Plug>(coc-format-dipilih)", {silent = true})keyset("n", "<leader>f", "<Plug>(coc-format-dipilih)", {silent = true} )-- Siapkan formatexpr jenis file yang ditentukanvim.api.nvim_create_autocmd("FileType", {group = "CocGroup",pattern = "typescript,json",command = "setl formatexpr=CocAction('formatSelected')",desc = "Siapkan formatexpr tipe file yang ditentukan."})-- Perbarui bantuan tanda tangan pada jump placeholdervim.api.nvim_create_autocmd("User", {group = "CocGroup",pattern = "CocJumpPlaceholder",command = "panggil CocActionAsync('showSignatureHelp')",desc = "Perbarui bantuan tanda tangan saat melompat placeholder"})-- Terapkan codeAction ke wilayah yang dipilih-- Contoh: `<leader>aap` untuk paragraflocal opts = {silent = true, nowait = true}keyset("x", "<leader>a", " <Plug>(coc-codeaction-selected)", opts)keyset("n", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)-- Memetakan ulang kunci untuk menerapkan tindakan kode pada posisi kursor.keyset("n", "<leader>ac", "<Plug>(coc-codeaction-cursor)", opts)-- Memetakan ulang kunci untuk menerapkan tindakan kode sumber untuk file saat ini. kumpulan kunci("