Vim/Neovim을 VS Code만큼 스마트하게 만드세요
스니펫을 지원하는 사용자 정의 팝업 메뉴
빠름 : 대부분의 경우 Vim 속도를 저하시키지 않는 분리된 NodeJS 프로세스입니다.
? 신뢰성 : 입력된 언어, 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 install-node.vercel.app/lts | 세게 때리다
vim-plug 사용자의 경우:
" 릴리스 브랜치 사용(권장)Plug 'neoclide/coc.nvim', {'branch': 'release'}" 또는 npmPlug 'neoclide/coc.nvim', {'branch': 'master'를 사용하여 소스 코드에서 빌드 , '할 것': '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"] } } }
자세한 내용은 위키를 확인하세요.
소스로 완성
구성 파일 사용
coc 확장 사용
언어 서버 구성
FAQ
Vim 인터페이스에 대해서는 :h coc-nvim
확인하세요.
coc.nvim을 사용하기 쉽게 하려면 구성이 필요합니다. 키 매핑이나 Vim 옵션이 변경되지 않기 때문입니다. 이는 다른 플러그인과의 충돌을 피하기 위해 가능한 한 많이 수행됩니다.
❗️중요 : 일부 Vim 플러그인은 키 매핑을 변경할 수 있습니다. 키맵이 적용되었는지 확인하려면 :verbose imap <tab>
과 같은 명령을 사용하세요.
" https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.vim" coc.nvim이 개수별로 바이트 오프셋을 계산하므로 Vim(Neovim 아님)이 필요할 수 있음" utf-8 바이트 시퀀스 집합 인코딩=utf-8" 일부 서버에는 백업 파일에 문제가 있습니다. #649set nobackupset nowritebackup"을 참조하세요. 업데이트 시간이 더 깁니다(기본값은 4000ms = 4s)가 눈에 띄게 나타납니다." 지연 및 열악한 사용자 경험set updatetime=300" 항상 부호 열을 표시합니다. 그렇지 않으면 진단이 나타나거나 해결될 때마다 텍스트가 이동합니다." 진단이 나타나거나 해결될 때마다 텍스트가 이동합니다.set signcolumn=yes" 앞에 문자가 있는 트리거 완료를 위해 탭을 사용하고 탐색합니다." 참고 : 기본적으로 항상 전체 항목이 선택되어 있습니다. 구성 파일에서 `"suggest.noselect": true`를 사용하여 선택 안 함을 활성화할 수 있습니다." 참고: ':verbose imap 명령을 사용하세요. <tab>' 탭이 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>"" <CR>을 만들어 선택한 완료 항목을 수락하거나 coc.nvim에 형식을 지정하도록 알림" <Cg>u가 현재 실행 취소를 중단합니다. 원하는 대로 선택하세요. <silent><expr > <CR> coc#pum#visible() ? coc#pum#confirm() : "<Cg>u<CR><cr>=coc#on_enter()<CR>" 함수! CheckBackspace() 중단 col = col('.') - 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`를 사용하여 진단 탐색" `:CocDiagnostics`를 사용하여 위치 listnmap <silent에서 현재 버퍼의 모든 진단을 가져옵니다. > [g <플러그>(coc-diagnostic-prev)nmap <자동> ]g <플러그>(coc-diagnostic-next)" GoTo 코드 Navigationnmap <자동> gd <플러그>(coc-definition)nmap <자동> gy <플러그>(coc-type-definition)nmap <자동> gi <플러그>(coc-구현)nmap <자동> gr <플러그>( coc-references)" 미리보기 창에 문서를 표시하려면 K를 사용하세요.nnoremap <silent> K :ShowDocumentation()<CR>함수를 호출하세요! ShowDocumentation() if CocAction('hasProvider', 'hover')call CocActionAsync('doHover') elsecall Feedkeys('K', 'in') endifendfunction" 커서를 누른 상태에서 기호 및 해당 참조 강조 표시autocmd CursorHold * 자동 호출 CocActionAsync( 'highlight')" 기호 이름 바꾸기nmap <리더>rn <플러그>(coc-rename)" 형식 선택됨 codexmap <리더>f <플러그>(coc-format-selected)nmap <리더>f <플러그>(coc-format-selected)augroup mygroup 자동 명령! " formatexpr 지정된 파일 형식 설정 autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') " 점프 자리 표시자에 대한 서명 도움말 업데이트 autocmd 사용자 CocJumpPlaceholder call CocActionAsync('showSignatureHelp')augroup end" Applying code actions to the selected code block" 예: 현재 단락에 대한 `<leader>aap`xmap <leader>a <Plug>(coc-codeaction-selected)nmap <leader >a <Plug>(coc-codeaction-selected)" 커서 위치에 코드 작업을 적용하기 위한 키를 다시 매핑합니다.nmap <leader>ac <Plug>(coc-codeaction-cursor)" 코드 작업 적용을 위한 키 재매핑은 전체 buffernmap <leader>에 <Plug>(coc-codeaction-source)로 영향을 미칩니다." 현재 linemap <leader에 대한 진단을 수정하기 위해 가장 선호하는 빠른 수정 작업을 적용합니다. >qf <Plug>(coc-fix-current)" 리팩터링 코드를 적용하기 위한 키 다시 매핑 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)" 현재 Linenmap에서 Code Lens 작업을 실행합니다. Leader>cl <Plug>(coc-codelens-action)" 맵 함수 및 클래스 텍스트 개체" 참고: 다음과 같은 경우 언어 serverxmap의 'textDocument.documentSymbol' 지원이 필요합니다. <플러그>(coc-funcobj-i)omap if <플러그>(coc-funcobj-i)xmap af <플러그>(coc-funcobj-a)omap af <플러그>(coc-funcobj-a)xmap ic <플러그 >(coc-classobj-i)omap ic <플러그>(coc-classobj-i)xmap ac <Plug>(coc-classobj-a)omap ac <Plug>(coc-classobj-a)" <Cf> 및 <Cb>를 다시 매핑하여 부동 창/팝업 스크롤if 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>" : "<오른쪽>" 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 형식 :call CocActionAsync('format')" 현재 버퍼 명령을 접으려면 `:Fold` 명령을 추가하세요! -나그스=? Fold :call CocAction('fold', <f-args>)" 현재 버퍼 명령의 가져오기를 구성하기 위해 `: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 진단<cr>" 확장 프로그램 관리 관리 <silent><nowait> <space>e :<Cu>CocList Extensions<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>" 다음 항목에 대한 기본 작업 수행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-- 업데이트 시간이 길어지면(기본값은 4000ms = 4s) 눈에 띄게 지연되고 사용자 경험이 저하됩니다.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`를 설정하여 선택하지 않고 활성화할 수 있습니다.- 참고: ':verbose imap <tab>' 명령을 사용하여 탭이 다음으로 매핑되지 않도록 하세요. - 다른 이것을 configlocal에 넣기 전에 플러그인 opts = {silent = true, noremap = true, expr = true, replacement_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>", "<플러그>(coc-snippets-expand-jump)")-- <c-space>를 사용하여 완료keyset("i", "<c-space>", "coc#refresh()", {silent = true, expr = true})-- `[g` 및 `]g`를 사용하여 진단 탐색-- `:CocDiagnostics`를 사용하여 위치 listkeyset("n", "[g", "<플러그>(coc-diagnostic-prev)", {silent = true})keyset("n", "]g", "<플러그>(coc-diagnostic-next)", {silent = true})-- GoTo 코드 Navigationkeyset("n", "gd", "<Plug>(coc-definition)", {silent = true})keyset("n", "gy", "<플러그>(coc-type-definition)", {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})-- 선택한 코드키 세트 형식 지정("x", "<leader>f", "<Plug>(coc-format- selected)", {silent = true})keyset("n", "<leader>f", "<Plug>(coc-format-selected)", {silent = true})-- 설정 형식 설명이 지정됨 filetype(s)vim.api.nvim_create_autocmd("FileType", {group = "CocGroup",pattern = "typescript,json",command = "setl formatexpr=CocAction('formatSelected')",desc = "formatexpr에 지정된 파일 형식 설정 (s)."})-- 점프 placeholder에 대한 서명 도움말 업데이트vim.api.nvim_create_autocmd("User", {group = "CocGroup",pattern = "CocJumpPlaceholder",command = "call CocActionAsync('showSignatureHelp')",desc = "점프 자리 표시자에 대한 서명 도움말 업데이트"})-- 선택한 영역에 codeAction 적용-- 예: `<leader 현재 단락의 경우 >aap` local opts = {silent = true, nowait = true}keyset("x", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)keyset("n", "<leader>a", "<Plug>(coc-codeaction-selected)", opts)-- 적용 코드에 대한 키 다시 매핑 커서 위치의 작업.keyset("n", "<leader>ac", "<Plug>(coc-codeaction-cursor)", opts)-- 현재 소스 코드 작업 적용을 위한 키 다시 매핑 파일.키세트("