Haga que su Vim/Neovim sea tan inteligente como VS Code
Menú emergente personalizado con soporte de fragmentos
Rápido : proceso NodeJS separado que no ralentiza Vim la mayor parte del tiempo.
? Confiable : lenguaje mecanografiado, probado con CI.
? Destacado : todas las funciones de LSP 3.16 son compatibles, consulte :h coc-lsp
.
❤️ Flexible : configuradas como VS Code, las extensiones Coc funcionan de manera similar a las extensiones de VS Code
Asegúrese de usar Vim >= 9.0.0438 o Neovim >= 0.8.0.
Instale nodejs >= 16.18.0:
curl -sL install-node.vercel.app/lts | intento
Para usuarios de vim-plug:
"Usar rama de lanzamiento (recomendado)Plug 'neoclide/coc.nvim', {'branch': 'release'}" O compilar a partir del código fuente usando npmPlug 'neoclide/coc.nvim', {'branch': 'master' , 'hacer': 'npm ci'}
en su .vimrc
o init.vim
, luego reinicie Vim y ejecute :PlugInstall
.
Consulte Instalar coc.nvim para obtener más información.
Debe instalar extensiones coc o configurar servidores de idiomas para compatibilidad con LSP.
Instale extensiones como esta:
:CocInstall coc-json coc-tsserver
O puede configurar un servidor de idiomas en su coc-settings.json
(ábralo usando :CocConfig
) de esta manera:
{ "languageserver": {"go": { "command": "gopls", "rootPatterns": ["go.mod"], "trace.server": "detallado", "filetypes": ["go"] } } }
Consulte la wiki para obtener más detalles:
Completar con fuentes
Usando el archivo de configuración
Usando extensiones coc
Configurar servidores de idiomas
Preguntas frecuentes
Consulte :h coc-nvim
para la interfaz Vim.
Se requiere configuración para que sea más fácil trabajar con coc.nvim, ya que no cambia las asignaciones de teclas ni las opciones de Vim. Esto se hace tanto como sea posible para evitar conflictos con sus otros complementos.
❗️Importante : algunos complementos de Vim pueden cambiar las asignaciones de teclas. Utilice un comando como :verbose imap <tab>
para asegurarse de que su mapa de teclas haya surtido efecto.
"https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.vim" Puede que necesite Vim (no Neovim) ya que coc.nvim calcula el desplazamiento de bytes por recuento" utf-8 byte secuenciaset encoding=utf-8" Algunos servidores tienen problemas con los archivos de respaldo, consulte #649set nobackupset nowritebackup" Tener un tiempo de actualización más prolongado (el valor predeterminado es 4000 ms = 4 s) provoca retrasos notables y una mala experiencia del usuario. set updatetime=300" Mostrar siempre la columna de signo; de lo contrario, cambiará el texto cada vez que" aparezcan o se resuelvan los diagnósticos set signcolumn=yes" Utilice la pestaña para completar el activador con caracteres delante y navegar" NOTA: Siempre hay un elemento completo seleccionado de forma predeterminada, es posible que desee habilitar" no seleccionar mediante `"suggest.noselect": true` en su archivo de configuración" NOTA: Utilice el comando ':verbose imap <tab>' para asegurarse de que la pestaña no esté asignada por" otro complemento antes de poner esto en su 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>"" Haga <CR> para aceptar el elemento de finalización seleccionado o notifique a coc.nvim para formatear" <Cg>u interrumpe la operación de deshacer actual, haga su propia elección inoremap <silent><expr > <CR> coc#pum#visible() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR>"función! CheckBackspace() cancelar dejar col = col('.') - 1 devolver !col || getline('.')[col - 1] =~# 's'endfunction" Utilice <c-space> para activar la finalización si has('nvim') inoremap <silent><expr> <c-space> coc#refresh( )demás inoremap <silent><expr> <c-@> coc#refresh()endif" Utilice `[g` y `]g` para navegar por los diagnósticos" Utilice `:CocDiagnostics` para obtener todos los diagnósticos del búfer actual en la ubicación listnmap <silent > [g <Plug>(coc-diagnostic-prev)nmap <silent> ]g <Plug>(coc-diagnostic-next)" Código GoTo de navegaciónnmap <silent> gd <Plug>(coc-definition)nmap <silent> gy <Plug>(coc-type-definition)nmap <silent> gi <Plug>(coc-implementation)nmap <silent> gr <Plug>(coc -references)" Utilice K para mostrar la documentación en la ventana de vista previa nnoremap <silent> K: ¡llame a la función ShowDocumentation()<CR>! ShowDocumentation() if CocAction('hasProvider', 'hover')call CocActionAsync('doHover') elsecall feedkeys('K', 'in') endifendfunction" Resalte el símbolo y sus referencias al mantener el cursorautocmd CursorHold * llamada silenciosa CocActionAsync( 'resaltar')" Cambio de nombre de símbolo nmap <líder>rn <Plug>(coc-rename)" Formato del codex seleccionado <líder>f <Plug>(coc-formato-seleccionado)nmap <líder>f <Plug>(coc-formato-seleccionado)augroup mygroup autocmd! "Configurar formatexpr tipo(s) de archivo especificado(s) autocmd FileType mecanografiado,json setl formatexpr=CocAction('formatSelected') "Actualizar la ayuda de la firma en el marcador de posición de salto autocmd Usuario CocJumpPlaceholder call CocActionAsync('showSignatureHelp')augroup end" Aplicar acciones de código al bloque de código seleccionado" Ejemplo: `<líder>aap` para el párrafo actualxmap <líder>a <Plug>(coc-codeaction-selected)nmap <líder >a <Plug>(coc-codeaction-selected)" Teclas de reasignación para aplicar acciones de código en la posición del cursornmap <leader>ac <Plug>(coc-codeaction-cursor)" Las claves de reasignación para aplicar acciones de código afectan todo el buffernmap <leader>as <Plug>(coc-codeaction-source)" Aplique la acción de corrección rápida más preferida para corregir el diagnóstico en el current Linenmap <leader>qf <Plug>(coc-fix-current)" Claves de reasignación para aplicar el código de refactor actionnmap <silent> <leader>re <Plug>(coc-codeaction-refactor-selected)xmap <silent> <leader>r <Plug>(coc-codeaction-refactor-selected)nmap <silent> <leader>r <Plug>(coc-codeaction-refactor-selected) "Ejecute la acción Code Lens en el mapa de lino actual <leader>cl <Plug>(coc-codelens-action)" Función de mapa y objetos de texto de clase" NOTA: Requiere compatibilidad con 'textDocument.documentSymbol' del servidor de idiomasxmap 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)" Reasignar <Cf> y <Cb> para desplazar ventanas flotantes/popupsif tiene('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>" enoremap <silent><nowait><expr> <Cf> coc#float#has_scroll() ? "<cr>=coc#float#scroll(1)<cr>" : "<Derecha>" enoremap <silent><nowait><expr> <Cb> coc#float#has_scroll() ? "<cr>=coc#float#scroll(0)<cr>" : "<Izquierda>" 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" Utilice CTRL-S para rangos de selecciones" Requiere compatibilidad con 'textDocument/selectionRange' del servidor de idiomas nmap <silent> <Cs> <Plug>(coc-range-select) xmap <silent> <Cs> <Plug>(coc-range-select)" ¡Agregue el comando `:Format` para formatear el comando de búfer actual! -nargs=0 Formato: llame a CocActionAsync('formato')" ¡Agregue el comando `:Fold` para plegar el comando del búfer actual! -nargs=? Fold :call CocAction('fold', <f-args>)" ¡Agregue el comando `:OR` para organizar las importaciones del buffercommand actual! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport' )" Agregar compatibilidad con la línea de estado nativa de (Neo)Vim" NOTA: consulte `:h coc-status` para integraciones con complementos externos que" brindan funciones personalizadas statusline: lightline.vim, vim-airlineset statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}" Asignaciones para CoCList" Mostrar todos los diagnósticosnnoremap <silent><nowait> < space>a :<Cu>CocList diagnostics<cr>" Administrar extensionesnnoremap <silent><nowait> <space>e :<Cu>CocList extensiones<cr>" Mostrar comandosnnoremap <silent><nowait> <espacio>c :<Cu>Comandos CocList<cr>" Buscar símbolo del documento actualnnoremap <silent><nowait> <espacio>o :<Cu>Esquema de CocList<cr >" Buscar símbolos del espacio de trabajonnoremap <silent><nowait> <espacio>s :<Cu>CocList -I símbolos<cr>" Realizar la acción predeterminada para el siguiente elementonnoremap <silent><nowait> <space>j :<Cu>CocNext<CR>" Realizar la acción predeterminada para el elemento anteriornnoremap <silent><nowait> <space>k :<Cu>CocPrev<CR>" Reanudar la última lista de cocnnoremap <silent ><nowait> <espacio>p :<Cu>CocListResume<CR>
NOTA: Esto solo funciona en Neovim 0.7.0dev+.
-- https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.lua-- Algunos servidores tienen problemas con los archivos de respaldo, consulte #649vim.opt.backup = falsevim.opt .writebackup = false: tener un tiempo de actualización más prolongado (el valor predeterminado es 4000 ms = 4 s) genera retrasos notables y una mala experiencia del usuariovim.opt.updatetime = 300-- Mostrar siempre la columna de signo, de lo contrario cambiaría el texto cada vez-- los diagnósticos aparecieron/se resolvieronvim.opt.signcolumn = "yes"conjunto de claves local = vim.keymap.set-- Función de autocompletar _G.check_back_space()col local = vim.fn.col('.') - 1return col == 0 o vim.fn.getline('.'):sub(col, col):match('%s') ~= nilend-- Use Tab para activar la finalización con caracteres adelante y navegue-- NOTA: Siempre hay un elemento de finalización seleccionado de forma predeterminada, es posible que desee habilitarlo: no seleccionar configurando ` "suggest.noselect": true` en su archivo de configuración. NOTA: use el comando ':verbose imap <tab>' para asegurarse de que Tab no esté asignado por otros complementos antes de poner esto en su configuración local opts = {silent = true , mapa nordico = verdadero, expr = verdadero, reemplazar_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)-- Haga <CR> para aceptar el elemento de finalización seleccionado o notifique a coc.nvim para formatear-- <Cg>u interrumpe el deshacer actual, haga su propia elecciónkeyset("i", "<cr>", [[coc#pum#visible() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR>"]], opta) -- Utilice <cj> para activar snippetskeyset("i", "<cj>", "<Plug>(coc-snippets-expand-jump)")-- Utilice <c-space> para activar completekeyset("i", "<c-space>", "coc#refresh()", {silent = true, expr = true})-- Utilice `[g` y `]g` para navegar por los diagnósticos-- Utilice `:CocDiagnostics` para obtener todos los diagnósticos del búfer actual en la ubicación listkeyset("n", "[g", "<Plug>(coc-diagnostic-prev)", {silent = true})keyset("n", "]g", "<Plug>(coc-diagnostic-next)", {silent = true})-- Código 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})keyset("n", "gr", "<Plug>(coc-references)", {silent = true})-- Utilice K para mostrar documentación en la función de ventana de vista previa _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})-- Resalte el símbolo y sus referencias en CursorHold evento(el cursor está inactivo)vim.api.nvim_create_augroup("CocGroup", {})vim.api.nvim_create_autocmd("CursorHold", {group = "CocGroup",command = "llamada silenciosa CocActionAsync('highlight')",desc = "Resaltar símbolo debajo del cursor en CursorHold"})-- Cambio de nombre de símbolokeyset( "n", "<líder>rn", "<Plug>(coc-rename)", {silent = true})-- Formateo del código seleccionadokeyset("x", "<líder>f", "<Plug>(coc-format-selected)", {silent = true})keyset("n", "<líder>f ", "<Plug>(coc-format-selected)", {silent = true})-- Configuración formatexpr especificada tipo(s) de archivovim.api.nvim_create_autocmd("FileType", {group = "CocGroup",pattern = "typescript,json",command = "setl formatexpr=CocAction('formatSelected')",desc = "Configuración formatexpr tipo de archivo especificado (s)."})-- Actualizar la ayuda de la firma al saltar placeholdervim.api.nvim_create_autocmd("User", {group = "CocGroup",pattern = "CocJumpPlaceholder",command = "call CocActionAsync('showSignatureHelp')",desc = "Actualizar ayuda de firma en el marcador de posición de salto"})-- Aplicar codeAction a la región seleccionada-- Ejemplo: `<leader>aap` para el párrafo actualops locales = {silent = true, nowait = true}keyset("x", "<líder>a", "<Plug>(coc-codeaction-selected)", opts)keyset("n", "<líder>a", "<Plug>( coc-codeaction-selected)", opts)-- Reasignar teclas para aplicar acciones de código en la posición del cursor.keyset("n", "<leader>ac", "<Plug>(coc-codeaction-cursor)", opts)-- Reasignar claves para aplicar acciones de código fuente para el archivo actual.keyset("