Rendez votre Vim/Neovim aussi intelligent que VS Code
Menu contextuel personnalisé avec prise en charge des extraits de code
Rapide : processus NodeJS séparé qui ne ralentit pas Vim la plupart du temps.
? Fiable : langage typé, testé avec CI.
? En vedette : toutes les fonctionnalités de LSP 3.16 sont prises en charge, voir :h coc-lsp
.
❤️ Flexible : configurées comme VS Code, les extensions Coc fonctionnent de la même manière que les extensions VS Code
Assurez-vous d'utiliser Vim >= 9.0.0438 ou Neovim >= 0.8.0.
Installez nodejs >= 16.18.0 :
curl -sL install-node.vercel.app/lts | frapper
Pour les utilisateurs de vim-plug :
" Utilisez la branche de version (recommandé) Plug 'neoclide/coc.nvim', {'branch' : 'release'}" Ou créez à partir du code source en utilisant npmPlug 'neoclide/coc.nvim', {'branch' : 'master' , 'faire' : 'npm ci'}
dans votre .vimrc
ou init.vim
, puis redémarrez Vim et exécutez :PlugInstall
.
Commander Installez coc.nvim pour plus d'informations.
Vous devez installer des extensions coc ou configurer des serveurs de langue pour la prise en charge LSP.
Installez des extensions comme ceci :
:CocInstall coc-json coc-tsserver
Ou vous pouvez configurer un serveur de langue dans votre coc-settings.json
(ouvrez-le en utilisant :CocConfig
) comme ceci :
{ "langageserver": {"go": { "command": "gopls", "rootPatterns": ["go.mod"], "trace.server": "verbose", "filetypes": ["go"] } } }
Consultez le wiki pour plus de détails :
Complétion avec les sources
Utilisation du fichier de configuration
Utiliser des extensions coc
Configurer les serveurs de langue
FAQ
Check-out :h coc-nvim
pour l'interface Vim.
La configuration est requise pour rendre coc.nvim plus facile à utiliser, car elle ne modifie pas vos mappages de touches ou vos options Vim. Ceci est fait autant que possible pour éviter les conflits avec vos autres plugins.
❗️Important : Certains plugins Vim peuvent modifier vos mappages de touches. Veuillez utiliser une commande telle que :verbose imap <tab>
pour vous assurer que votre mappage de touches a pris effet.
" https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.vim " Peut avoir besoin de Vim (pas de Neovim) puisque coc.nvim calcule le décalage d'octets en fonction du nombre " utf-8 byte séquenceset encoding=utf-8" Certains serveurs ont des problèmes avec les fichiers de sauvegarde, voir #649set nobackupset nowritebackup" Ayant un temps de mise à jour plus long (la valeur par défaut est 4000 ms = 4s) entraîne des "retards" notables et une mauvaise expérience utilisateur. set updatetime=300" Toujours afficher la colonne de signe, sinon le texte serait décalé à chaque fois" les diagnostics apparaissent/deviennent résolus set signcolumn=yes" Utilisez l'onglet pour déclencher l'achèvement avec les caractères en avant et naviguer" REMARQUE : Il y a toujours un élément complet sélectionné par défaut, vous souhaiterez peut-être activer "no select by `"suggest.noselect": true` dans votre fichier de configuration" REMARQUE : Utilisez la commande ':verbose imap <tab>' pour vous assurer que l'onglet n'est pas mappé par" un autre plugin avant de le mettre dans votre configuration. <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>"" Faites <CR> pour accepter l'élément d'achèvement sélectionné ou notifiez coc.nvim de formater" <Cg>vous interrompez l'annulation actuelle, veuillez faire votre propre choix dans remap <silent><expr > <CR> coc#pum#visible() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR>"fonction ! Abandon de CheckBackspace() laissez col = col('.') - 1 retourner !col || getline('.')[col - 1] =~# 's'endfunction" Utilisez <c-space> pour déclencher l'achèvementif has('nvim') inoremap <silent><expr> <c-space> coc#refresh( )autre inoremap <silent><expr> <c-@> coc#refresh()endif" Utilisez `[g` et `]g` pour naviguer dans les diagnostics" Utilisez `:CocDiagnostics` pour obtenir tous les diagnostics du tampon actuel à l'emplacement listnmap <silent > [g <Plug>(coc-diagnostic-prev)nmap <silent> ]g <Plug>(coc-diagnostic-next)" GoTo code 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)" Utilisez K pour afficher la documentation dans la fenêtre d'aperçunnoremap <silent> K :appelez la fonction ShowDocumentation()<CR>! ShowDocumentation() if CocAction('hasProvider', 'hover')call CocActionAsync('doHover') elsecall feedkeys('K', 'in') endifendfunction" Mettez en surbrillance le symbole et ses références lorsque vous maintenez le curseurautocmd CursorHold * appel silencieux CocActionAsync( 'highlight')" Renommer le symbolenmap <leader>rn <Plug>(coc-rename)" Formatage sélectionné codexmap <leader>f <Plug>(coc-format-selected)nmap <leader>f <Plug>(coc-format-selected)augroup mon groupe commande automatique ! "Configurer le formatexpr le(s) type(s) de fichier spécifié(s) autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') " Mettre à jour l'aide de la signature sur l'espace réservé de saut autocmd L'utilisateur CocJumpPlaceholder appelle CocActionAsync('showSignatureHelp')augroup end" Application d'actions de code au bloc de code sélectionné" Exemple : `<leader>aap` pour le paragraphe actuelxmap <leader>a <Plug>(coc-codeaction-selected)nmap <leader >a <Plug>(coc-codeaction-selected)" Remapper les touches pour appliquer des actions de code à la position du curseurnmap <leader>ac <Plug>(coc-codeaction-cursor)" Les touches de remappage pour appliquer les actions de code affectent l'ensemble du buffernmap <leader> comme <Plug>(coc-codeaction-source)" Appliquer l'action de correction rapide la plus préférée pour corriger le diagnostic sur la Linenmap actuelle <leader >qf <Plug>(coc-fix-current)" Remapper les clés pour appliquer les actions du code de refactorisationnmap <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)" Exécutez l'action Code Lens sur la Linenmap actuelle < leader>cl <Plug>(coc-codelens-action)" Fonction de mappage et objets de texte de classe" REMARQUE : nécessite la prise en charge de "textDocument.documentSymbol" de la part du serveur de langage xmap si <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)" Remapper <Cf> et <Cb> pour faire défiler les fenêtres/popups flottantes si 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>" : "<Gauche>" 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" Utiliser CTRL-S pour les plages de sélection" Nécessite la prise en charge de 'textDocument/selectionRange' du serveur de langue nmap <silent> <Cs> <Plug>(coc-range-select) xmap <silent> <Cs> <Plug>(coc-range-select)" Ajoutez la commande `:Format` pour formater la commande tampon actuelle ! -nargs=0 Format :call CocActionAsync('format')" Ajoutez la commande `:Fold` pour plier la commande tampon actuelle ! -nargs=? Fold :call CocAction('fold', <f-args>)" Ajoutez la commande `:OR` pour organiser les importations de la commande buffer actuelle ! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport' )" Ajouter la prise en charge native de la ligne d'état de (Neo)Vim" REMARQUE : Veuillez consulter `:h coc-status` pour les intégrations avec des plugins externes qui " fournissent une ligne d'état personnalisée : lightline.vim, vim-airlineset statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}" Mappages pour CoCList" Afficher tous les diagnosticsnnoremap <silent><nowait> <espace> a :<Cu>Diagnostics CocList<cr>" Gérer les extensionsnnoremap <silent><nowait> <space>e :<Cu>CocList extensions<cr>" Afficher les commandesnnoremap <silent><nowait> <space>c :<Cu>Commandes CocList<cr>" Rechercher le symbole du document actuelnnoremap <silent><nowait> <espace>o :<Cu>Contour CocList<cr >" Rechercher les symboles de l'espace de travailnnoremap <silent><nowait> <space>s :<Cu>CocList -I symboles<cr>" Effectuer l'action par défaut pour le prochain itemnnoremap <silent><nowait> <space>j :<Cu>CocNext<CR>" Effectuer l'action par défaut pour l'itemnnoremap précédent <silent><nowait> <space>k :<Cu>CocPrev<CR>" Reprendre la dernière liste de cocnnoremap < silencieux><nowait> <espace>p :<Cu>CocListResume<CR>
REMARQUE : Cela ne fonctionne que dans Neovim 0.7.0dev+.
-- https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.lua-- Certains serveurs ont des problèmes avec les fichiers de sauvegarde, voir #649vim.opt.backup = falsevim.opt .writebackup = false - Un temps de mise à jour plus long (la valeur par défaut est 4 000 ms = 4 s) entraîne des retards notables et un mauvais utilisateur experiencevim.opt.updatetime = 300 - Affichez toujours la colonne de signe, sinon le texte serait décalé à chaque fois - les diagnostics sont apparus/devenus résolusvim.opt.signcolumn = "yes"local keyset = vim.keymap.set-- Fonction de saisie semi-automatique _G. check_back_space()local col = vim.fn.col('.') - 1return col == 0 ou vim.fn.getline('.'):sub(col, col):match('%s') ~= nilend-- Utilisez Tab pour déclencher l'achèvement avec les caractères en avant et naviguer-- REMARQUE : il y a toujours un élément d'achèvement sélectionné par défaut, vous souhaiterez peut-être activer-- no select en définissant `"suggest.noselect": true` dans votre fichier de configuration-- REMARQUE : utilisez la commande ':verbose imap <tab>' pour vous assurer que Tab n'est pas mappé par- - d'autres plugins avant de mettre ceci dans votre 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)-- Faites <CR> pour accepter l'élément d'achèvement sélectionné ou notifiez coc.nvim de formater-- <Cg>u interrompt l'annulation actuelle, veuillez faire votre propre choixkeyset("i", "<cr>", [[coc#pum#visible() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR>"]], opte) -- Utilisez <cj> pour déclencher snippetskeyset("i", "<cj>", "<Plug>(coc-snippets-expand-jump)")-- Utilisez <c-space> pour déclencher Completionkeyset("i", "<c-space>", "coc#refresh()", {silent = true, expr = true})-- Utilisez `[g` et `]g` pour naviguer dans les diagnostics-- Utilisez `:CocDiagnostics` pour obtenir tous les diagnostics du tampon actuel à l'emplacement listkeyset("n", "[g", "<Plug>(coc-diagnostic-prev)", {silent = true})keyset("n", "]g", "<Plug>(coc-diagnostic-next)", {silent = true})-- GoTo code 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})-- Utilisez K pour afficher la documentation dans la fenêtre d'aperçufunction _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})-- Mettez en surbrillance le symbole et ses références sur un événement CursorHold (le curseur est inactif)vim.api.nvim_create_augroup("CocGroup", {})vim.api.nvim_create_autocmd("CursorHold", {group = "CocGroup",command = "appel silencieux CocActionAsync('highlight')",desc = "Surligner le symbole sous le curseur sur CursorHold"})-- Symbole renamingkeyset("n", "<leader>rn", "<Plug> (coc-rename)", {silent = true})-- Formatage du codekeyset sélectionné("x", "<leader>f", "<Plug>(coc-format-selected)", {silent = true})keyset("n", "<leader>f", "<Plug>(coc-format-selected)", {silent = true})-- Format d'installation expr type(s) de fichier spécifié(s)vim.api .nvim_create_autocmd("FileType", {group = "CocGroup",pattern = "typescript,json",command = "setl formatexpr=CocAction('formatSelected')",desc = "Configurer le(s) type(s) de fichier(s) spécifié(s) au formatexpr."})-- Mettre à jour l'aide de la signature lors du saut placeholdervim.api.nvim_create_autocmd("User", {group = "CocGroup",pattern = "CocJumpPlaceholder",command = "call CocActionAsync('showSignatureHelp ')",desc = "Mettre à jour l'aide de la signature sur l'espace réservé de saut"})-- Appliquer codeAction à la région sélectionnée-- Exemple : `<leader>aap` pour le paragraphelocal actuel opts = {silent = true, nowait = true}keyset("x", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)keyset( "n", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)-- Remapper les touches pour appliquer les actions de code à la position du curseur.keyset("n", "<leader>ac ", "<Plug>(coc-codeaction-cursor)", opts)-- Remapper les clés pour appliquer les actions de code source pour le fichier.keyset("