Torne seu Vim/Neovim tão inteligente quanto o VS Code
Menu pop-up personalizado com suporte a snippets
Rápido : processo NodeJS separado que não deixa o Vim lento na maioria das vezes.
? Confiável : linguagem digitada, testada com CI.
? Em destaque : todos os recursos do LSP 3.16 são suportados, consulte :h coc-lsp
.
❤️ Flexível : configuradas como VS Code, as extensões Coc funcionam de forma semelhante às extensões VS Code
Certifique-se de usar Vim >= 9.0.0438 ou Neovim >= 0.8.0.
Instale o nodejs >= 16.18.0:
curl -sL install-node.vercel.app/lts | festa
Para usuários do vim-plug:
" Use release branch (recomendado)Plug 'neoclide/coc.nvim', {'branch': 'release'}" Ou crie a partir do código-fonte usando npmPlug 'neoclide/coc.nvim', {'branch': 'master' , 'fazer': 'npm ci'}
no seu .vimrc
ou init.vim
, reinicie o Vim e execute :PlugInstall
.
Confira Instale coc.nvim para obter mais informações.
Você precisa instalar extensões coc ou configurar servidores de idiomas para suporte LSP.
Instale extensões como esta:
:CocInstall coc-json coc-tsserver
Ou você pode configurar um servidor de idioma em seu coc-settings.json
(abra-o usando :CocConfig
) assim:
{ "linguagemserver": {"go": { "command": "gopls", "rootPatterns": ["go.mod"], "trace.server": "verbose", "filetypes": ["go"] } } }
Confira o wiki para mais detalhes:
Conclusão com fontes
Usando o arquivo de configuração
Usando extensões coc
Configurar servidores de idiomas
Perguntas frequentes
Confira :h coc-nvim
para interface Vim.
A configuração é necessária para facilitar o trabalho com coc.nvim, pois não altera seus mapeamentos de teclas ou opções do Vim. Isso é feito tanto quanto possível para evitar conflitos com outros plug-ins.
❗️Importante : alguns plug-ins do Vim podem alterar seus mapeamentos de teclas. Por favor, use comandos como :verbose imap <tab>
para garantir que seu mapa de teclado tenha efeito.
"https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.vim" Pode ser necessário para o Vim (não para o Neovim), pois o coc.nvim calcula o deslocamento de bytes por contagem" utf-8 byte sequenciaset encoding=utf-8" Alguns servidores têm problemas com arquivos de backup, consulte #649set nobackupset nowritebackup" Tendo tempo de atualização mais longo (o padrão é 4000 ms = 4s) leva a" atrasos perceptíveis e experiência do usuário ruimset updatetime=300" Sempre mostre a coluna de sinal, caso contrário, o texto mudaria a cada vez"o diagnóstico aparece/se torna resolvidoset signcolumn=yes" Use a guia para conclusão do acionador com caracteres à frente e navegar" NOTA: Sempre há um item completo selecionado por padrão, você pode querer ativar" no select por `"suggest.noselect": true` em seu arquivo de configuração" NOTA: Use o comando ':verbose imap <tab>' para garantir que a guia não seja mapeada por" outro plugin antes de colocar isso em seu 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>"" Faça <CR> para aceitar o item de conclusão selecionado ou notifique coc.nvim para formatar" <Cg>u quebra o desfazer atual, faça sua própria escolha noremap <silent><expr > <CR> coc#pum#visible() ? coc#pum#confirm() : função "<Cg>u<CR><cr>=coc#on_enter()<CR>"! CheckBackspace() abortar deixe col = col('.') - 1 retornar !col || getline('.')[col - 1] =~# 's'endfunction" Use <c-space> para acionar a conclusão se has('nvim') inoremap <silent><expr> <c-space> coc#refresh( )outro inoremap <silent><expr> <c-@> coc#refresh()endif" Use `[g` e `]g` para navegar pelos diagnósticos" Use `:CocDiagnostics` para obter todos os diagnósticos do buffer atual no local listnmap <silent > [g <Plug>(coc-diagnostic-prev)nmap <silent> ]g <Plug>(coc-diagnostic-next)" Ir para código de navegaçãonmap <silent> gd <Plug>(coc-definition)nmap <silent> gy <Plug>(coc-type-definition)nmap <silent> gi <Plug>(coc-implementation)nmap <silent> gr <Plug>(coc -references)" Use K para mostrar a documentação na janela de visualização nnoremap <silent> K :call ShowDocumentation()<CR>function! ShowDocumentation() if CocAction('hasProvider', 'hover')call CocActionAsync('doHover') elsecall feedkeys('K', 'in') endifendfunction" Destaque o símbolo e suas referências ao segurar o cursorautocmd CursorHold * Silent call CocActionAsync( 'highlight')" Símbolo renomeandonmap <leader>rn <Plug>(coc-rename)" Formatação codexmap selecionado <leader>f <Plug>(coc-format-selected)nmap <leader>f <Plug>(coc-format-selected)augroup meugrupo cmd automático! "Configure formatexpr tipos de arquivo especificados autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') " Atualizar ajuda de assinatura no espaço reservado para salto autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')augroup end" Aplicando ações de código ao bloco de código selecionado" Exemplo: `<leader>aap` para o parágrafo atual <leader>a <Plug>(coc-codeaction-selected)nmap <leader >a <Plug>(coc-codeaction-selected)" Remapear teclas para aplicar ações de código na posição do cursornmap <leader>ac <Plug>(coc-codeaction-cursor)" As teclas de remapeamento para aplicar ações de código afetam todo o buffernmap <leader>as <Plug>(coc-codeaction-source)" Aplique a ação de correção rápida mais preferida para corrigir o diagnóstico no current linhomap <leader>qf <Plug>(coc-fix-current)" Chaves de remapeamento para aplicação de código de refatorações 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) " Execute a ação Code Lens no linhomap atual <leader>cl <Plug>(coc-codelens-action)" Função de mapa e objetos de texto de classe" NOTA: Requer suporte 'textDocument.documentSymbol' do idioma serverxmap 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)" Remapear <Cf > e <Cb> para rolar janelas flutuantes/popupsif 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>" : "<Left>" 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" Use CTRL-S para intervalos de seleção" Requer suporte 'textDocument/selectionRange' do idioma servernmap <silent> <Cs> <Plug>(coc-range-select) xmap <silent> <Cs> <Plug>(coc-range-select)" Adicione o comando `:Format` para formatar o buffercommand atual! -nargs=0 Formato:call CocActionAsync('format')" Adicione o comando `:Fold` para dobrar o buffercommand atual! -nargs=? Fold :call CocAction('fold', <f-args>)" Adicione o comando `:OR` para organizar as importações do buffercommand atual! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport' )" Adicionar suporte nativo à linha de status do (Neo)Vim" NOTA: Consulte `:h coc-status` para integrações com plug-ins externos que" fornecem statusline: lightline.vim, vim-airlineset statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}" Mapeamentos para CoCList" Mostrar todos os diagnósticosnnoremap <silent><nowait> < space>a :<Cu>Diagnóstico CocList<cr>" Gerenciar extensõesnnoremap <silent><nowait> <space>e :<Cu>CocList extensões<cr>" Mostrar comandosnnoremap <silent><nowait> <space>c :<Cu>CocList comandos<cr>" Localizar símbolo do documento atualnnoremap <silent><nowait> <space>o :<Cu>CocList contorno<cr >" Pesquisar símbolos do espaço de trabalhonnoremap <silent><nowait> <space>s :<Cu>CocList -I símbolos<cr>" Executar ação padrão para o próximo itemnnoremap <silent><nowait> <space>j :<Cu>CocNext<CR>" Execute a ação padrão para o itemnnoremap anterior <silent><nowait> <space>k :<Cu>CocPrev<CR>" Retomar o último coc listnnoremap <silent ><nowait> <espaço>p :<Cu>CocListResume<CR>
NOTA: Isso funciona apenas no Neovim 0.7.0dev+.
-- https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.lua-- Alguns servidores têm problemas com arquivos de backup, consulte #649vim.opt.backup = falsevim.opt .writebackup = false-- Ter um tempo de atualização mais longo (o padrão é 4000 ms = 4s) leva a atrasos perceptíveis e problemas de usuário experiencevim.opt.updatetime = 300-- Sempre mostre a coluna de sinal, caso contrário, o texto mudaria a cada vez-- o diagnóstico apareceu/se tornou resolvidovim.opt.signcolumn = "yes"local keyset = vim.keymap.set-- Função de preenchimento automático _G. check_back_space()local col = vim.fn.col('.') - 1return col == 0 ou vim.fn.getline('.'):sub(col, col):match('%s') ~= nilend-- Use Tab para conclusão do gatilho com caracteres à frente e navegue-- NOTA: Sempre há um item de conclusão selecionado por padrão, você pode querer ativar-- sem seleção definindo `"suggest.noselect": true` em seu arquivo de configuração-- NOTA: Use o comando ':verbose imap <tab>' para garantir que Tab não esteja mapeado por- - outros plug-ins antes de colocar isso em seu configlocal 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)-- Faça <CR> para aceitar o item de conclusão selecionado ou notifique coc.nvim para formatar-- <Cg>u quebra o desfazer atual, por favor faça sua própria escolhakeyset("i", "<cr>", [[coc#pum#visible() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR>"]], opts) -- Use <cj> para acionar snippetskeyset("i", "<cj>", "<Plug>(coc-snippets-expand-jump)")-- Use <c-space> para acionar conclusãokeyset("i", "<c-space>", "coc#refresh()", {silent = true, expr = true})-- Use `[g` e `]g` para navegar no diagnóstico-- Use `:CocDiagnostics` para obter todos os diagnósticos do buffer atual no local 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})-- Use K para mostrar a documentação na janela de visualizaçãofunction _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('!' . .vimo.keywordprg .. ' ' .. cw)endendkeyset("n", "K", '<CMD>lua _G.show_docs()<CR>', {silent = true})-- Destaque o símbolo e suas referências em um evento CursorHold (o cursor está inativo) vim.api.nvim_create_augroup("CocGroup", {})vim.api.nvim_create_autocmd("CursorHold", {group = "CocGroup",command = "silent call CocActionAsync('highlight')",desc = "Destacar símbolo sob o cursor em CursorHold"})-- Símbolo renomeandokeyset("n", "<leader>rn", "<Plug>( coc-rename)", {silent = true})-- Formatando codekeyset selecionado("x", "<leader>f", "<Plug>(formato coc selecionado)", {silent = true})keyset("n", "<leader>f", "<Plug>(formato coc selecionado)", {silent = true} )-- Configuração formatexpr tipo(s) de arquivo especificado(s)vim.api.nvim_create_autocmd("FileType", {group = "CocGroup",pattern = "typescript,json",command = "setl formatexpr=CocAction('formatSelected')",desc = "Configure o(s) tipo(s) de arquivo(s) especificado(s) do formatexpr."})-- Atualizar a ajuda da assinatura no espaço reservado para saltovim.api.nvim_create_autocmd("User" , {group = "CocGroup",pattern = "CocJumpPlaceholder",command = "chamar CocActionAsync('showSignatureHelp')",desc = "Atualizar ajuda de assinatura no espaço reservado para salto"})-- Aplicar codeAction à região selecionada-- Exemplo: `<leader>aap` para o parágrafo atualops locais = {silent = true, nowait = true}keyset("x", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)keyset("n", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)-- Remapear teclas para aplicar ações de código na posição do cursor.keyset("n", "<leader>ac", "< Plug>(coc-codeaction-cursor)", opts)-- Remapear chaves para aplicar ações de código-fonte para o arquivo atual.keyset("