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 をインストールします。
カール -sL インストールノード.vercel.app/lts |バッシュ
vim-plug ユーザーの場合:
" リリース ブランチを使用します (推奨)Plug 'neoclide/coc.nvim', {'branch': 'release'}" または、npmPlug 'neoclide/coc.nvim', {'branch': 'master' を使用してソース コードからビルドします, 'do': 'npm ci'}
.vimrc
またはinit.vim
で、Vim を再起動して:PlugInstall
実行します。
詳細については、coc.nvim をインストールしてください。
LSP をサポートするには、coc 拡張機能をインストールするか、言語サーバーを構成する必要があります。
次のように拡張機能をインストールします。
:CocInstall coc-json coc-tsserver
または、次のようにcoc-settings.json
で言語サーバーを構成することもできます ( :CocConfig
を使用して開きます)。
{ "言語サーバー": {"go": { "コマンド": "gopls", "rootPatterns": ["go.mod"], "trace.server": "verbose", "filetypes": ["go"] } } }
詳細については wiki を確認してください。
ソース付きで完成
設定ファイルの使用
coc拡張子の使用
言語サーバーを構成する
よくある質問
Vim インターフェイスの:h coc-nvim
チェックアウトします。
キーマッピングや Vim オプションは変更されないため、coc.nvim を使いやすくするには設定が必要です。これは、他のプラグインとの競合を避けるために可能な限り行われます。
❗️重要: 一部の Vim プラグインはキー マッピングを変更できます。 :verbose imap <tab>
のようなコマンドを使用して、キーマップが有効になっていることを確認してください。
" https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.vim" coc.nvim はカウントによってバイト オフセットを計算するため、Vim (Neovim ではなく) が必要になる可能性があります" utf-8 byte sequenceset encoding=utf-8" 一部のサーバーではバックアップ ファイルに問題があります。#649set nobackupset nowritebackup を参照してください。" 更新時間が長い (デフォルトは4000 ミリ秒 = 4 秒) 顕著な遅延とユーザー エクスペリエンスの低下につながりますset updatetime=300" 常にサインカラムを表示します。そうでないと、診断が表示される/解決されるたびにテキストが移動しますset signalcolumn=yes" 前に文字を含むトリガーの完了にはタブを使用し、 navigate" 注: デフォルトでは常に完全な項目が選択されています。設定ファイルで `"suggest.noselect": true` によって "no select" を有効にすることもできます。 注:これを configinoremap <silent><expr> <TAB> に入れる前に、コマンド ':verbose imap <tab>' でタブが他のプラグインによってマップされていないことを確認してください。 coc#pum#visible() ? coc#pum#next(1 ) : CheckBackspace() ? "<Tab>" : coc#refresh()inoremap <expr><S-TAB> coc#pum#visible() ? coc#pum#prev(1) : "<Ch>"" 選択した完了項目を受け入れるために <CR> を作成するか、coc.nvim にフォーマットするように通知します" <Cg>u は現在の取り消しを中断します。独自の選択を行ってくださいinoremap <silent><expr > <CR> coc#pum#visible() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR>" 関数! CheckBackspace() の中止 列 = 列 ('.') - 1 とします。 戻ります!col || getline('.')[col - 1] =~# 's'endfunction" <c-space> を使用して完了をトリガーしますif has('nvim') inoremap <silent><expr> <c-space> coc#refresh( )それ以外 inoremap <silent><expr> <c-@> coc#refresh()endif" 診断をナビゲートするには、`[g` と `]g` を使用します。" listnmap <silent の場所にある現在のバッファのすべての診断を取得するには、`:CocDiagnostics` を使用します> [g <プラグ>(coc-diagnostic-prev)nmap <サイレント> ]g <プラグ>(coc-diagnostic-next)" GoTo コード ナビゲーションnmap <silent> gd <プラグ>(coc-定義)nmap <サイレント> gy <プラグ>(coc-type-定義)nmap <サイレント> gi <プラグ>( coc-implementation)nmap <silent> gr <Plug>(coc-references)" プレビュー ウィンドウにドキュメントを表示するには K を使用しますnnoremap <silent> K :ShowDocumentation()<CR>関数を呼び出してください! ShowDocumentation() if CocAction('hasProvider', 'hover')call CocActionAsync('doHover') elsecall feedkeys('K', 'in') endifendfunction" カーソルを保持しているときにシンボルとその参照を強調表示しますautocmd CursorHold * サイレント コール CocActionAsync( 'ハイライト')" シンボルの名前変更nmap <リーダー>rn <Plug>(coc-rename)" 選択したコーデックスマップのフォーマット <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 User CocJumpPlaceholder call CocActionAsync('showSignatureHelp')augroup end" 選択したコード ブロックにコード アクションを適用しています" 例: 現在の段落の `<leader>aap`xmap <leader>a <Plug>(coc-codeaction-selected)nmap <leader >a <Plug>(coc-codeaction-selected)" カーソル位置でコード アクションを適用するためにキーを再マップしますPositionnmap <leader>ac <Plug>(coc-codeaction-cursor)" コード適用アクションの再マップ キーは、buffernmap <leader>as <Plug>(coc-codeaction-source) 全体に影響します" 診断を修正するために最も優先されるクイックフィックス アクションを適用します。現在の linenmap <leader>qf <Plug>(coc-fix-current)" リファクタリング コード アクションを適用するためのキーの再マップ nmap <silent> <leader>re <プラグ>(coc-codeaction-refactor)xmap <サイレント> <リーダー>r <プラグ>(coc-codeaction-refactor-selected)nmap <サイレント> <リーダー>r <プラグ>(coc-codeaction-refactor-selected) " 現在の linenmap <leader>cl <Plug>(coc-codelens-action) でコード レンズ アクションを実行します。" マップ関数とクラス テキスト オブジェクト" 注:言語の「textDocument.documentSymbol」サポートが必要です。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 <プラグ>(coc-classobj-i)omap ic <Plug>(coc-classobj-i)xmap ac <Plug>(coc-classobj-a)omap ac <Plug>(coc-classobj-a)" <Cf> と <Cb> を再マップして float ウィンドウ/ポップアップをスクロールします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>" : "<左>" 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' サポートが必要です servernmap <silent> <Cs> <Plug>(coc-range-select) xmap <silent> <Cs> <Plug>(coc-range-select)" 現在のバッファコマンドをフォーマットするための `:Format` コマンドを追加します。 -nargs=0 Format :call CocActionAsync('format')" 現在のバッファコマンドを折りたたむための `:Fold` コマンドを追加します。 -ナルグス=? Fold :call CocAction('fold', <f-args>)" 現在のbuffercommand のインポートを整理するための `:OR` コマンドを追加します! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport' )" (Neo)Vim のネイティブ ステータスライン サポートを追加します。" 注: 外部プラグインとの統合については、`:h coc-status` を参照してください。カスタム ステータスラインを提供します: lightline.vim、vim-airlineset statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}" CoCList のマッピング" すべての診断を表示nnoremap <silent><nowait > <space>a :<Cu>CocList Diagnostics<cr>" 拡張機能の管理nnoremap <silent><nowait> <space>e :<Cu>CocList 拡張機能<cr>" コマンドを表示nnoremap <silent><nowait> <space>c :<Cu>CocList コマンド<cr>" 現在のドキュメントのシンボルを検索nnoremap <silent><nowait> <space>o :<Cu >CocList アウトライン<cr>" ワークスペース シンボルの検索nnoremap <silent><nowait> <space>s :<Cu>CocList -I シンボル<cr>" Do次の項目のデフォルト アクションnnoremap <silent><nowait> <space>j :<Cu>CocNext<CR>" 前の項目のデフォルト アクションを実行nnoremap <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 ミリ秒 = 4 秒)、顕著な遅延とユーザー エクスペリエンスの低下につながりますvim.opt.updatetime = 300-- 常にsigncolumnを表示します。そうでないと、毎回テキストが移動します--診断が表示された/解決されましたvim.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` -- 注: これを configlocal に入れる前に、コマンド ':verbose imap <tab>' を使用して、タブが他のプラグインによってマップされていないことを確認してください。 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)-- 選択した完了項目を受け入れるために <CR> を作成するか、coc.nvim にフォーマットするように通知します-- <Cg>u は現在の取り消しを中断します。独自に作成してください。 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> を使用して completedkeyset("i", "<c-space>", "coc#refresh()", {silent = true, expr = true})-- 診断をナビゲートするには `[g` と `]g` を使用します -- `:CocDiagnostics` を使用して、現在のバッファーのすべての診断を取得しますlistkeyset("n", "[g", "<Plug>(coc-diagnostic-prev)", {silent = true})keyset("n", "]g", "<Plug>(coc-diagnostic- next)", {silent = true})-- GoTo コード ナビゲーションkeyset("n", "gd", "<Plug>(coc-定義)", {silent = true})keyset("n", "gy", "<プラグ>(coc-type-定義)", {silent = true})keyset("n", "gi", "<プラグ>(coc-implementation) )", {silent = true})keyset("n", "gr", "<Plug>(coc-references)", {silent = true})-- プレビュー ウィンドウ関数でドキュメントを表示するには K を使用します_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})-- 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", "<プラグ>(coc-format-selected)", {silent = true})keyset("n", "<leader>f", "<プラグ>(coc-format-selected)", {silent = true} )-- 指定されたファイルタイプの formatexpr をセットアップしますvim.api.nvim_create_autocmd("FileType", {group = "CocGroup",pattern = "typescript,json",command = "setl formatexpr=CocAction('formatSelected')",desc = "formatexpr で指定されたファイルタイプをセットアップします。"})-- ジャンプ プレースホルダーの署名ヘルプを更新しますvim.api.nvim_create_autocmd("User" 、{グループ = "CocGroup"、パターン = "CocJumpPlaceholder"、コマンド = "呼び出しCocActionAsync('showSignatureHelp')",desc = "ジャンプ プレースホルダーの署名ヘルプを更新"})-- 選択した領域に codeAction を適用します-- 例: 現在の段落の `<leader>aap`local opts = {silent = true, nowait = true}keyset("x", "<リーダー>a", "<プラグ>(coc-codeaction-selected)", opts)keyset("n", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)-- カーソル位置でコード アクションを適用するためのキーを再マップします。keyset("n", " <leader>ac", "<Plug>(coc-codeaction-cursor)", opts) -- 現在の file.keyset(" のソース コード アクションを適用するためのキーの再マップ