Logo

Make your Vim/Neovim as smart as VSCode.

Software License Actions Codecov Coverage Status Doc Gitter

--- Gif _Custom popup menu with snippet support_ ## Why? - ๐Ÿš€ **Fast**: separated NodeJS process that does not block your vim most of the time. - ๐Ÿ’Ž **Reliable**: typed language, tested with CI. - ๐ŸŒŸ **Featured**: all LSP 3.16 features are supported, see `:h coc-lsp`. - โค๏ธ **Flexible**: [configured like VSCode](https://github.com/neoclide/coc.nvim/wiki/Using-the-configuration-file), [extensions work like in VSCode](https://github.com/neoclide/coc.nvim/wiki/Using-coc-extensions) ## Quick Start Make sure use vim >= 8.1.1719 or neovim >= 0.4.0. Install [nodejs](https://nodejs.org/en/download/) >= 14.14: ```bash curl -sL install-node.vercel.app/lts | bash ``` For [vim-plug](https://github.com/junegunn/vim-plug) users: ```vim " Use release branch (recommend) Plug 'neoclide/coc.nvim', {'branch': 'release'} " Or build from source code by using yarn: https://yarnpkg.com Plug 'neoclide/coc.nvim', {'branch': 'master', 'do': 'yarn install --frozen-lockfile'} ``` in your `.vimrc` or `init.vim`, then restart Vim and run `:PlugInstall`. Checkout [Install coc.nvim](https://github.com/neoclide/coc.nvim/wiki/Install-coc.nvim) for more info. You **have to** install coc extension or configure language servers for LSP support. Install extensions like: :CocInstall coc-json coc-tsserver Or configure language server in `coc-settings.json` opened by `:CocConfig`, like: ```json { "languageserver": { "go": { "command": "gopls", "rootPatterns": ["go.mod"], "trace.server": "verbose", "filetypes": ["go"] } } } ``` Checkout wiki for more details: - [Completion with sources](https://github.com/neoclide/coc.nvim/wiki/Completion-with-sources) - [Using the configuration file](https://github.com/neoclide/coc.nvim/wiki/Using-the-configuration-file) - [Using coc extensions](https://github.com/neoclide/coc.nvim/wiki/Using-coc-extensions) - [Configure language servers](https://github.com/neoclide/coc.nvim/wiki/Language-servers) - [F.A.Q](https://github.com/neoclide/coc.nvim/wiki/F.A.Q) Checkout `:h coc-nvim` for vim interface. ## Example vim configuration Configuration is required to make coc.nvim easier to work with, since it doesn't change your key-mappings or Vim options. This is done as much as possible to avoid conflict with your other plugins. **โ—๏ธImportant**: Some Vim plugins could change key mappings. Please use command like`:verbose imap ` to make sure that your keymap has taken effect. ```vim " Some servers have issues with backup files, see #649. set nobackup set nowritebackup " Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable " delays and poor user experience. set updatetime=300 " Always show the signcolumn, otherwise it would shift the text each time " diagnostics appear/become resolved. set signcolumn=yes " Use tab for trigger completion with characters ahead and navigate. " NOTE: There's always complete item selected by default, you may want to enable " no select by `"suggest.noselect": true` in your configuration file. " NOTE: Use command ':verbose imap ' to make sure tab is not mapped by " other plugin before putting this into your config. inoremap \ coc#pum#visible() ? coc#pum#next(1) : \ CheckBackspace() ? "\" : \ coc#refresh() inoremap coc#pum#visible() ? coc#pum#prev(1) : "\" " Make to accept selected completion item or notify coc.nvim to format " u breaks current undo, please make your own choice. inoremap coc#pum#visible() ? coc#pum#confirm() \: "\u\\=coc#on_enter()\" function! CheckBackspace() abort let col = col('.') - 1 return !col || getline('.')[col - 1] =~# '\s' endfunction " Use to trigger completion. if has('nvim') inoremap coc#refresh() else inoremap coc#refresh() endif " Use `[g` and `]g` to navigate diagnostics " Use `:CocDiagnostics` to get all diagnostics of current buffer in location list. nmap [g (coc-diagnostic-prev) nmap ]g (coc-diagnostic-next) " GoTo code navigation. nmap gd (coc-definition) nmap gy (coc-type-definition) nmap gi (coc-implementation) nmap gr (coc-references) " Use K to show documentation in preview window. nnoremap K :call ShowDocumentation() function! ShowDocumentation() if CocAction('hasProvider', 'hover') call CocActionAsync('doHover') else call feedkeys('K', 'in') endif endfunction " Highlight the symbol and its references when holding the cursor. autocmd CursorHold * silent call CocActionAsync('highlight') " Symbol renaming. nmap rn (coc-rename) " Formatting selected code. xmap f (coc-format-selected) nmap f (coc-format-selected) augroup mygroup autocmd! " Setup formatexpr specified filetype(s). autocmd FileType typescript,json setl formatexpr=CocAction('formatSelected') " Update signature help on jump placeholder. autocmd User CocJumpPlaceholder call CocActionAsync('showSignatureHelp') augroup end " Applying codeAction to the selected region. " Example: `aap` for current paragraph xmap a (coc-codeaction-selected) nmap a (coc-codeaction-selected) " Remap keys for applying codeAction to the current buffer. nmap ac (coc-codeaction) " Apply AutoFix to problem on the current line. nmap qf (coc-fix-current) " Run the Code Lens action on the current line. nmap cl (coc-codelens-action) " Map function and class text objects " NOTE: Requires 'textDocument.documentSymbol' support from the language server. xmap if (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 (coc-classobj-a) omap ac (coc-classobj-a) " Remap and for scroll float windows/popups. if has('nvim-0.4.0') || has('patch-8.2.0750') nnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" nnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" inoremap coc#float#has_scroll() ? "\=coc#float#scroll(1)\" : "\" inoremap coc#float#has_scroll() ? "\=coc#float#scroll(0)\" : "\" vnoremap coc#float#has_scroll() ? coc#float#scroll(1) : "\" vnoremap coc#float#has_scroll() ? coc#float#scroll(0) : "\" endif " Use CTRL-S for selections ranges. " Requires 'textDocument/selectionRange' support of language server. nmap (coc-range-select) xmap (coc-range-select) " Add `:Format` command to format current buffer. command! -nargs=0 Format :call CocActionAsync('format') " Add `:Fold` command to fold current buffer. command! -nargs=? Fold :call CocAction('fold', ) " Add `:OR` command for organize imports of the current buffer. command! -nargs=0 OR :call CocActionAsync('runCommand', 'editor.action.organizeImport') " Add (Neo)Vim's native statusline support. " NOTE: Please see `:h coc-status` for integrations with external plugins that " provide custom statusline: lightline.vim, vim-airline. set statusline^=%{coc#status()}%{get(b:,'coc_current_function','')} " Mappings for CoCList " Show all diagnostics. nnoremap a :CocList diagnostics " Manage extensions. nnoremap e :CocList extensions " Show commands. nnoremap c :CocList commands " Find symbol of current document. nnoremap o :CocList outline " Search workspace symbols. nnoremap s :CocList -I symbols " Do default action for next item. nnoremap j :CocNext " Do default action for previous item. nnoremap k :CocPrev " Resume latest coc list. nnoremap p :CocListResume ``` ## Example lua configuration NOTE: This works in Neovim 0.7.0dev+ only. ```lua -- Some servers have issues with backup files, see #649. vim.opt.backup = false vim.opt.writebackup = false -- Having longer updatetime (default is 4000 ms = 4 s) leads to noticeable -- delays and poor user experience. vim.opt.updatetime = 300 -- Always show the signcolumn, otherwise it would shift the text each time -- diagnostics appear/become resolved. vim.opt.signcolumn = "yes" local keyset = vim.keymap.set -- Auto complete function _G.check_back_space() local col = vim.fn.col('.') - 1 return col == 0 or vim.fn.getline('.'):sub(col, col):match('%s') ~= nil end -- Use tab for trigger completion with characters ahead and navigate. -- NOTE: There's always complete item selected by default, you may want to enable -- no select by `"suggest.noselect": true` in your configuration file. -- NOTE: Use command ':verbose imap ' to make sure tab is not mapped by -- other plugin before putting this into your config. local opts = {silent = true, noremap = true, expr = true, replace_keycodes = false} keyset("i", "", 'coc#pum#visible() ? coc#pum#next(1) : v:lua.check_back_space() ? "" : coc#refresh()', opts) keyset("i", "", [[coc#pum#visible() ? coc#pum#prev(1) : "\"]], opts) -- Make to accept selected completion item or notify coc.nvim to format -- u breaks current undo, please make your own choice. keyset("i", "", [[coc#pum#visible() ? coc#pum#confirm() : "\u\\=coc#on_enter()\"]], opts) -- Use to trigger snippets keyset("i", "", "(coc-snippets-expand-jump)") -- Use to trigger completion. keyset("i", "", "coc#refresh()", {silent = true, expr = true}) -- Use `[g` and `]g` to navigate diagnostics -- Use `:CocDiagnostics` to get all diagnostics of current buffer in location list. keyset("n", "[g", "(coc-diagnostic-prev)", {silent = true}) keyset("n", "]g", "(coc-diagnostic-next)", {silent = true}) -- GoTo code navigation. keyset("n", "gd", "(coc-definition)", {silent = true}) keyset("n", "gy", "(coc-type-definition)", {silent = true}) keyset("n", "gi", "(coc-implementation)", {silent = true}) keyset("n", "gr", "(coc-references)", {silent = true}) -- Use K to show documentation in preview window. function _G.show_docs() local cw = vim.fn.expand('') if vim.fn.index({'vim', 'help'}, vim.bo.filetype) >= 0 then vim.api.nvim_command('h ' .. cw) elseif vim.api.nvim_eval('coc#rpc#ready()') then vim.fn.CocActionAsync('doHover') else vim.api.nvim_command('!' .. vim.o.keywordprg .. ' ' .. cw) end end keyset("n", "K", 'lua _G.show_docs()', {silent = true}) -- Highlight the symbol and its references when holding the cursor. vim.api.nvim_create_augroup("CocGroup", {}) vim.api.nvim_create_autocmd("CursorHold", { group = "CocGroup", command = "silent call CocActionAsync('highlight')", desc = "Highlight symbol under cursor on CursorHold" }) -- Symbol renaming. keyset("n", "rn", "(coc-rename)", {silent = true}) -- Formatting selected code. keyset("x", "f", "(coc-format-selected)", {silent = true}) keyset("n", "f", "(coc-format-selected)", {silent = true}) -- Setup formatexpr specified filetype(s). vim.api.nvim_create_autocmd("FileType", { group = "CocGroup", pattern = "typescript,json", command = "setl formatexpr=CocAction('formatSelected')", desc = "Setup formatexpr specified filetype(s)." }) -- Update signature help on jump placeholder. vim.api.nvim_create_autocmd("User", { group = "CocGroup", pattern = "CocJumpPlaceholder", command = "call CocActionAsync('showSignatureHelp')", desc = "Update signature help on jump placeholder" }) -- Applying codeAction to the selected region. -- Example: `aap` for current paragraph local opts = {silent = true, nowait = true} keyset("x", "a", "(coc-codeaction-selected)", opts) keyset("n", "a", "(coc-codeaction-selected)", opts) -- Remap keys for applying codeAction to the current buffer. keyset("n", "ac", "(coc-codeaction)", opts) -- Apply AutoFix to problem on the current line. keyset("n", "qf", "(coc-fix-current)", opts) -- Run the Code Lens action on the current line. keyset("n", "cl", "(coc-codelens-action)", opts) -- Map function and class text objects -- NOTE: Requires 'textDocument.documentSymbol' support from the language server. keyset("x", "if", "(coc-funcobj-i)", opts) keyset("o", "if", "(coc-funcobj-i)", opts) keyset("x", "af", "(coc-funcobj-a)", opts) keyset("o", "af", "(coc-funcobj-a)", opts) keyset("x", "ic", "(coc-classobj-i)", opts) keyset("o", "ic", "(coc-classobj-i)", opts) keyset("x", "ac", "(coc-classobj-a)", opts) keyset("o", "ac", "(coc-classobj-a)", opts) -- Remap and for scroll float windows/popups. ---@diagnostic disable-next-line: redefined-local local opts = {silent = true, nowait = true, expr = true} keyset("n", "", 'coc#float#has_scroll() ? coc#float#scroll(1) : ""', opts) keyset("n", "", 'coc#float#has_scroll() ? coc#float#scroll(0) : ""', opts) keyset("i", "", 'coc#float#has_scroll() ? "=coc#float#scroll(1)" : ""', opts) keyset("i", "", 'coc#float#has_scroll() ? "=coc#float#scroll(0)" : ""', opts) keyset("v", "", 'coc#float#has_scroll() ? coc#float#scroll(1) : ""', opts) keyset("v", "", 'coc#float#has_scroll() ? coc#float#scroll(0) : ""', opts) -- Use CTRL-S for selections ranges. -- Requires 'textDocument/selectionRange' support of language server. keyset("n", "", "(coc-range-select)", {silent = true}) keyset("x", "", "(coc-range-select)", {silent = true}) -- Add `:Format` command to format current buffer. vim.api.nvim_create_user_command("Format", "call CocAction('format')", {}) -- " Add `:Fold` command to fold current buffer. vim.api.nvim_create_user_command("Fold", "call CocAction('fold', )", {nargs = '?'}) -- Add `:OR` command for organize imports of the current buffer. vim.api.nvim_create_user_command("OR", "call CocActionAsync('runCommand', 'editor.action.organizeImport')", {}) -- Add (Neo)Vim's native statusline support. -- NOTE: Please see `:h coc-status` for integrations with external plugins that -- provide custom statusline: lightline.vim, vim-airline. vim.opt.statusline:prepend("%{coc#status()}%{get(b:,'coc_current_function','')}") -- Mappings for CoCList -- code actions and coc stuff ---@diagnostic disable-next-line: redefined-local local opts = {silent = true, nowait = true} -- Show all diagnostics. keyset("n", "a", ":CocList diagnostics", opts) -- Manage extensions. keyset("n", "e", ":CocList extensions", opts) -- Show commands. keyset("n", "c", ":CocList commands", opts) -- Find symbol of current document. keyset("n", "o", ":CocList outline", opts) -- Search workspace symbols. keyset("n", "s", ":CocList -I symbols", opts) -- Do default action for next item. keyset("n", "j", ":CocNext", opts) -- Do default action for previous item. keyset("n", "k", ":CocPrev", opts) -- Resume latest coc list. keyset("n", "p", ":CocListResume", opts) ``` ## Articles - [coc.nvim ๆ’ไปถไฝ“็ณปไป‹็ป](https://zhuanlan.zhihu.com/p/65524706) - [CocList ๅ…ฅๅ‘ๆŒ‡ๅ—](https://zhuanlan.zhihu.com/p/71846145) - [Create coc.nvim extension to improve Vim experience](https://medium.com/@chemzqm/create-coc-nvim-extension-to-improve-vim-experience-4461df269173) - [How to write a coc.nvim extension (and why)](https://samroeca.com/coc-plugin.html) ## Troubleshooting Try these steps when you have problem with coc.nvim. - Make sure your Vim version >= 8.0 by command `:version`. - If service failed to start, use command `:CocInfo` or `:checkhealth` on Neovim. - Checkout the log of coc.nvim by command `:CocOpenLog`. - When you have issues with the language server, it's recommended to [checkout the output](https://github.com/neoclide/coc.nvim/wiki/Debug-language-server#using-output-channel). ## Feedback - If you think Coc is useful, consider giving it a star. - If you have a question, [ask on gitter](https://gitter.im/neoclide/coc.nvim) - ไธญๆ–‡็”จๆˆท่ฏทๅˆฐ [ไธญๆ–‡ gitter](https://gitter.im/neoclide/coc-cn) ่ฎจ่ฎบ - If something is not working, [create an issue](https://github.com/neoclide/coc.nvim/issues/new). ## Backers [Become a backer](https://opencollective.com/cocnvim#backer) and get your image on our README on GitHub with a link to your site. ## Contributors

Qiming zhao

๐Ÿ’ป

Heyward Fann

๐Ÿ’ป

Raidou

๐Ÿ’ป

kevinhwang91

๐Ÿ’ป

ๅนด็ณ•ๅฐ่ฑ†ๆฑค

๐Ÿ’ป

Avi Dessauer

๐Ÿ’ป

ๆœ€ไธŠๅท

๐Ÿ’ป

Yatao Li

๐Ÿ’ป

wongxy

๐Ÿ’ป

Sam McCall

๐Ÿ’ป

Samuel Roeca

๐Ÿ’ป

Amirali Esmaeili

๐Ÿ’ป

Jack Rowlingson

๐Ÿ’ป

Jaehwang Jung

๐Ÿ’ป

Antoine

๐Ÿ’ป

Cosmin Popescu

๐Ÿ’ป

Duc Nghiem Xuan

๐Ÿ’ป

Francisco Lopes

๐Ÿ’ป

daquexian

๐Ÿ’ป

dependabot[bot]

๐Ÿ’ป

greenkeeper[bot]

๐Ÿ’ป

Chris Kipp

๐Ÿ’ป

Dmytro Meleshko

๐Ÿ’ป

Kirill Bobyrev

๐Ÿ’ป

Gontran Baerts

๐Ÿ’ป

Andy

๐Ÿ’ป

Cheng JIANG

๐Ÿ’ป

Corin

๐Ÿ’ป

Daniel Zhang

๐Ÿ’ป

Ferdinand Bachmann

๐Ÿ’ป

Guangqing Chen

๐Ÿ’ป

Jade Meskill

๐Ÿ’ป

Jasper Poppe

๐Ÿ’ป

Jean Jordaan

๐Ÿ’ป

Kid

๐Ÿ’ป

Pieter van Loon

๐Ÿ’ป

Robert Liebowitz

๐Ÿ’ป

Seth Messer

๐Ÿ’ป

UncleBill

๐Ÿ’ป

ZERO

๐Ÿ’ป

fsouza

๐Ÿ’ป

XiaoZhang

๐Ÿ’ป

whyreal

๐Ÿ’ป

yehuohan

๐Ÿ’ป

ใƒใ‚ฏใƒ€ใƒณใใ‚“

๐Ÿ’ป

Raphael

๐Ÿ’ป

tbodt

๐Ÿ’ป

Aaron McDaid

๐Ÿ’ป

Aasif Versi

๐Ÿ’ป

Abner Silva

๐Ÿ’ป

Adam Stankiewicz

๐Ÿ’ป

Adamansky Anton

๐Ÿ’ป

Ahmed El Gabri

๐Ÿ’ป

Alexandr Kondratev

๐Ÿ’ป

Andrew Shim

๐Ÿ’ป

Andy Lindeman

๐Ÿ’ป

Augustin

๐Ÿ’ป

Bastien Orivel

๐Ÿ’ป

Ben Lu

๐Ÿ’ป

Ben

๐Ÿ’ป

Brendan Roy

๐Ÿ’ป

brianembry

๐Ÿ’ป

br

๐Ÿ’ป

Cason Adams

๐Ÿ’ป

Chang Y

๐Ÿ’ป

Chayoung You

๐Ÿ’ป

Chen Lijun

๐Ÿ’ป

Chen Mulong

๐Ÿ’ป

Chris Weyl

๐Ÿ’ป

dezza

๐Ÿ’ป

Cody Allen

๐Ÿ’ป

Damien Rajon

๐Ÿ’ป

Daniel Eriksson

๐Ÿ’ป

Daniel Jenson

๐Ÿ’ป

David Mejorado

๐Ÿ’ป

Deric Pang

๐Ÿ’ป

Ding Tao

๐Ÿ’ป

Doron Behar

๐Ÿ’ป

Egor Kovetskiy

๐Ÿ’ป

ElKowar

๐Ÿ’ป

Emeliov Dmitrii

๐Ÿ’ป

Fabian Becker

๐Ÿ’ป

FallenWarrior2k

๐Ÿ’ป

Fausto Nรบรฑez Alberro

๐Ÿ’ป

Felipe Ramos

๐Ÿ’ป

Fredrik Borg

๐Ÿ’ป

Gavin Sim

๐Ÿ’ป

Gibson Fahnestock

๐Ÿ’ป

Giovanni Giordano

๐Ÿ’ป

Gopal Adhikari

๐Ÿ’ป

Hanh Le

๐Ÿ’ป

hedy

๐Ÿ’ป

Hendrik Lammers

๐Ÿ’ป

Henry Barreto

๐Ÿ’ป

Hugo

๐Ÿ’ป

Jackie Li

๐Ÿ’ป

Jakub Nowak

๐Ÿ’ป

James Pickard

๐Ÿ’ป

Jia Sui

๐Ÿ’ป

Ellie Hermaszewska

๐Ÿ’ป

Joel Bradshaw

๐Ÿ’ป

John Carlo Roberto

๐Ÿ’ป

Jonas Holst Damtoft

๐Ÿ’ป

Jonathan Lehman

๐Ÿ’ป

Joosep Alviste

๐Ÿ’ป

Josa Gesell

๐Ÿ’ป

Joshua Rubin

๐Ÿ’ป

Julian Grinblat

๐Ÿ’ป

Julian Valentin

๐Ÿ’ป

KabbAmine

๐Ÿ’ป

Kay Gosho

๐Ÿ’ป

Kenny Huynh

๐Ÿ’ป

Kevin Rambaud

๐Ÿ’ป

Kian Cross

๐Ÿ’ป

Kristijan Husak

๐Ÿ’ป

NullVoxPopuli

๐Ÿ’ป

Lasse Peters

๐Ÿ’ป

Noel Errenil

๐Ÿ’ป

LinArcX

๐Ÿ’ป

Liu-Cheng Xu

๐Ÿ’ป

Marc

๐Ÿ’ป

Marius Gawrisch

๐Ÿ’ป

Mark Hintz

๐Ÿ’ป

Mathieu Le Tiec

๐Ÿ’ป

Matt White

๐Ÿ’ป

Matthew Evans

๐Ÿ’ป

Me1onRind

๐Ÿ’ป

Qyriad

๐Ÿ’ป

Narcis B.

๐Ÿ’ป

Neur1n

๐Ÿ’ป

Nicolas Dermine

๐Ÿ’ป

Noah

๐Ÿ’ป

PENG Rui

๐Ÿ’ป

Paco

๐Ÿ’ป

Peng Guanwen

๐Ÿ’ป

Petter Wahlman

๐Ÿ’ป

Pooya Moradi

๐Ÿ’ป

Quade Morrison

๐Ÿ’ป

Ralf Vogler

๐Ÿ’ป

Ran Chen

๐Ÿ’ป

Ricardo Garcรญa Vega

๐Ÿ’ป

Rick Jones

๐Ÿ’ป

Ryan Christian

๐Ÿ’ป

Salo

๐Ÿ’ป

Sam Nolan

๐Ÿ’ป

Saurav

๐Ÿ’ป

Sean Mackesey

๐Ÿ’ป

Sheel Patel

๐Ÿ’ป

Solomon Ng

๐Ÿ’ป

Sri Kadimisetty

๐Ÿ’ป

Stephen Prater

๐Ÿ’ป

Sune Kibsgaard

๐Ÿ’ป

Aquaakuma

๐Ÿ’ป

Takumi Kawase

๐Ÿ’ป

The Blob SCP

๐Ÿ’ป

Tomasz N

๐Ÿ’ป

Tomoyuki Harada

๐Ÿ’ป

Tony Fettes

๐Ÿ’ป

Tony Narlock

๐Ÿ’ป

Tony Wang

๐Ÿ’ป

Victor Quach

๐Ÿ’ป

Whisperity

๐Ÿ’ป

William Turner

๐Ÿ’ป

Xiaochao Dong

๐Ÿ’ป

Hugh Hou

๐Ÿ’ป

Jackie Li

๐Ÿ’ป

Zachary Freed

๐Ÿ’ป

akiyosi

๐Ÿ’ป

alexjg

๐Ÿ’ป

aste4

๐Ÿ’ป

clyfish

๐Ÿ’ป

dev7ba

๐Ÿ’ป

diartyz

๐Ÿ’ป

doza-daniel

๐Ÿ’ป

equal-l2

๐Ÿ’ป

fong

๐Ÿ’ป

hexh

๐Ÿ’ป

hhiraba

๐Ÿ’ป

ic-768

๐Ÿ’ป

javiertury

๐Ÿ’ป

karasu

๐Ÿ’ป

kevineato

๐Ÿ’ป

Eduardo Costa

๐Ÿ’ป

micchy326

๐Ÿ’ป

midchildan

๐Ÿ’ป

minefuto

๐Ÿ’ป

miyanokomiya

๐Ÿ’ป

miyaviee

๐Ÿ’ป

monkoose

๐Ÿ’ป ๐Ÿ›

mujx

๐Ÿ’ป

mvilim

๐Ÿ’ป

naruaway

๐Ÿ’ป

piersy

๐Ÿ’ป

ryantig

๐Ÿ’ป

rydesun

๐Ÿ’ป

sc00ter

๐Ÿ’ป

smhc

๐Ÿ’ป

Sam Kaplan

๐Ÿ’ป

tasuten

๐Ÿ’ป

todesking

๐Ÿ’ป

typicode

๐Ÿ’ป

ๆŽ้ธฃ้ฃž

๐Ÿ’ป

Ikko Ashimine

๐Ÿ“–

Rammiah

๐Ÿ›

Alisue

๐Ÿ›

bigshans

๐Ÿ“–

Robert Boyd III

๐Ÿ›

Yuki Iwanaga

๐Ÿ’ป

SpringHack

๐Ÿ›

Lucas Burns

๐Ÿ“–

qiqiboy

๐Ÿ’ป

timsu92

๐Ÿ“–

Shawn M Moore

๐Ÿ’ป

Aaron U'Ren

๐Ÿ›

SeniorMars

๐Ÿ“–

็‰ง็พŠ็Šฌ็œŸQ

๐Ÿ“–
This project follows the [all-contributors](https://allcontributors.org) specification. Contributions of any kind are welcome! ## License Anti 996