Сделайте свой Vim/Neovim таким же умным, как VS Code
Пользовательское всплывающее меню с поддержкой фрагментов
Fast : отдельный процесс 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 install-node.vercel.app/lts | бить
Для пользователей vim-plug:
«Использовать ветку выпуска (рекомендуется) Подключите 'neoclide/coc.nvim', {'branch': 'release'}» Или выполните сборку из исходного кода с помощью npmPlug 'neoclide/coc.nvim', {'branch': 'master' , 'делать': 'npm ci'}
в вашем .vimrc
или init.vim
, затем перезапустите Vim и запустите :PlugInstall
.
Оформить заказ Установите coc.nvim для получения дополнительной информации.
Вам необходимо установить расширения coc или настроить языковые серверы для поддержки LSP.
Установите расширения следующим образом:
:CocInstall coc-json coc-tsserver
Или вы можете настроить языковой сервер в файле coc-settings.json
(откройте его с помощью :CocConfig
) следующим образом:
{ "languageserver": {"go": { "command": "gopls", "rootPatterns": ["go.mod"], "trace.server": "verbose", "filetypes": ["go"] } } }
Посетите вики для получения более подробной информации:
Дополнение с исходниками
Использование файла конфигурации
Использование расширений Coc
Настройка языковых серверов
Часто задаваемые вопросы
Оформить заказ :h coc-nvim
для интерфейса Vim.
Конфигурация необходима для упрощения работы с coc.nvim, поскольку она не меняет сопоставления клавиш или параметры Vim. Это сделано максимально, чтобы избежать конфликта с другими вашими плагинами.
❗️Важно : некоторые плагины Vim могут изменять сопоставления клавиш. Используйте команду типа :verbose imap <tab>
, чтобы убедиться, что ваша раскладка клавиатуры вступила в силу.
« https://raw.githubusercontent.com/neoclide/coc.nvim/master/doc/coc-example-config.vim» Может потребоваться для Vim (не Neovim), поскольку coc.nvim вычисляет смещение байтов по счетчику» utf-8 byte Sequencesetcoding=utf-8" На некоторых серверах возникают проблемы с файлами резервных копий, см. #649set nobackupset nowritebackup" Более длительное время обновления (по умолчанию 4000 мс = 4 с) приводит к заметным задержкам и ухудшению пользовательского опыта. Navigation" ПРИМЕЧАНИЕ. По умолчанию всегда выбран полный элемент, вы можете включить "no select" с помощью `"suggest.noselect": true` в вашем файле конфигурации". ПРИМЕЧАНИЕ: Используйте команду ':verbose imap <tab>', чтобы убедиться, что вкладка не отображается другим плагином, прежде чем помещать это в свою конфигурационную карту <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 прерывает текущую отмену, пожалуйста, сделайте свой собственный выборinoremap <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> для запуска завершения, если has('nvim') inoremap <silent><expr> <c-space> coc#refresh( )еще inoremap <silent><expr> <c-@> coc#refresh()endif" Используйте `[g` и `]g` для навигации по диагностике" Используйте `:CocDiagnostics`, чтобы получить всю диагностику текущего буфера в расположении listnmap <silent > [g <Plug>(coc-diagnostic-prev)nmap <silent> ]g <Plug>(coc-diagnostic-next)" GoTo навигация по кодуnmap <silent> gd <Plug>(coc-definition)nmap <silent> gy <Plug>(coc-type-definition)nmap <silent> gi <Plug>(coc-реализация)nmap <silent> gr <Plug> (coc-references)" Используйте K, чтобы отобразить документацию в окне предварительного просмотра.nnremap <silent> K :call Функция ShowDocumentation()<CR>! ShowDocumentation() if CocAction('hasProvider', 'hover')call CocActionAsync('doHover') elsecallfeedkeys('K', 'in') endifendfunction" Выделите символ и его ссылки при удержании курсораautocmd CursorHold * тихий вызов CocActionAsync( 'highlight')" Переименование символаnmap <leader>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 CocJumpPlaceholder call CocActionAsync('showSignatureHelp')augroup end" Применение действий кода к выбранному блоку кода" Пример: `<leader>aap` для текущего параграфа xmap <leader>a <Plug>(coc-codeaction-selected)nmap <leader >a <Plug>(coc-codeaction-selected)» Клавиши переназначения для применения действий кода в позиции курсораnmap <leader>ac <Plug>(coc-codeaction-cursor)" Ключи переназначения для действий применения кода влияют на всю карту буфера <leader>as <Plug>(coc-codeaction-source)" Примените наиболее предпочтительное действие быстрого исправления для исправления диагностики на currentlainmap <leader>qf <Plug>(coc-fix-current)" Ключи переназначения для применения действий кода рефакторингаnmap <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) «Запустите действие Code Lens на текущей карте белья <leader>cl <Plug>(coc-codelens-action)». Сопоставьте функцию и текстовые объекты класса. ПРИМЕЧАНИЕ. Требуется: Поддержка 'textDocument.documentSymbol' со стороны языкового сервераxmap 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)" Переназначить <Cf> и <Cb> для прокрутки плавающих окон/всплывающих окон имеет('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" Используйте 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 ИЛИ :call CocActionAsync('runCommand', 'editor.action.organizeImport' )"Добавить встроенную поддержку строки состояния (Neo)Vim" ПРИМЕЧАНИЕ. См. `:h coc-status` для интеграции с внешними плагинами, которые "предоставляют пользовательские настройки". statusline: Lightline.vim, vim-airlineset statusline^=%{coc#status()}%{get(b:,'coc_current_function','')}" Сопоставления для CoCList" Показать все Diagnosticsnnoremap <silent><nowait> < space>a :<Cu>CocList Diagnostics<cr>" Управление расширениямиnnremap <silent><nowait> <space>e :<Cu>Расширения CocList<cr>" Показать командыnnremap <silent><nowait> <space>c :<Cu>Команды CocList<cr>" Найти символ текущей карты документов <silent><nowait> <space>o :<Cu >CocList Outline<cr>" Поиск символов в рабочей областиnnremap <silent><nowait> <space>s :<Cu>Cu>CocList -I символы<cr>" Использовать по умолчанию действие для следующего itemnnremap <silent><nowait> <space>j :<Cu>CocNext<CR>" Выполнить действие по умолчанию для предыдущего itemnnremap <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 -- Всегда показывать столбец знака, иначе каждый раз текст будет сдвигаться -- диагностика появилась/разрешилась vim.opt.signcolumn = "yes"local keyset = vim.keymap.set -- Функция автозаполнения _G.check_back_space()local col = vim.fn.col('.') - 1return col == 0 или vim.fn.getline('.'):sub(col, col):match('%s') ~= nilend — используйте Tab для завершения триггера с символами впереди и навигации — ПРИМЕЧАНИЕ. Всегда выбран элемент завершения. по умолчанию вы можете захотеть включить -- no select, установив `"suggest.noselect": true` в вашем файле конфигурации. ПРИМЕЧАНИЕ. Используйте команду ':verbose imap <tab>', чтобы убедиться, что Tab не отображается с помощью - - другие плагины прежде чем помещать это в свой 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) -- Сделайте <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> для запуска набора ключей завершения("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}) -- Перейти к коду Navigationkeyset("n", "gd", "<Plug >(coc-definition)", {silent = true})keyset("n", "gy", "<Plug>(coc-type-definition)", {silent = true})keyset("n", "gi", "<Plug>(coc-реализация)", {silent = true})keyset("n", "gr", "<Plug>(coc-references)", {silent = true}) -- Используйте K, чтобы отобразить документацию в окне предварительного просмотра. function _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", "<лидер>rn", "<Plug>(coc-rename)", {silent = true}) -- Форматирование выбранного codekeyset("x", "<leader>f", "<Plug>(coc-format-selected)", {silent = true})keyset("n", "<leader>f ", "<Plug>(coc-format-selected)", {silent = true}) — установка заданного формата файла (типов) vim.api.nvim_create_autocmd("FileType", {group = "CocGroup",pattern = "typescript,json",command = "setl formatexpr=CocAction('formatSelected')",desc = "Настройка указанного типа файла(ов) formatexpr."}) — Обновить справку по сигнатурам при переходе Placeholdervim.api.nvim_create_autocmd("Пользователь", {group = "CocGroup",pattern = "CocJumpPlaceholder",command = "call CocActionAsync('showSignatureHelp')",desc = "Обновить справку по подписи для заполнителя перехода"}) – Применить codeAction к выбранному региону – Пример: `<leader>aap` для текущих параграфлокальных опций = {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) — переназначение клавиш для применения действий исходного кода для текущего file.keyset("