Named after the famous theorem prover
coq
also means 鸡
in français québécois
, and I guess 🥖
.
Fast as FUCK and loads of features.
Native C in-memory B-trees
SQLite VM interrupts
Coroutine based incremental & interruptible scheduler
TCP-esque flow control
More details at the PERFORMANCE.md
Note: Due to compression, reality is faster than gifs
Results on every keystroke
Throttling? Never heard of her
Real time performance statistics
Look at the gifs! The bottom few are the fastest when I didn't slow down on purpose to show features.
Typo resistant
Recency bonus
Proximity bonus
Weighted average of relative ranks & ensemble metrics
Error correction: cour
-> colour_space
, flgr
-> flag_group
, nasp
-> Namespace
Press key to view documentation in big buffer
Auto open preview on side with most space
Customizable location: n, s, w, e
Ubiquitous: Tags, LSP, TreeSitter, Paths, Snippets
Incremental completion
Client-side caching
Multi-server completion (i.e. tailwind
+ cssls
)
Multi-encoding utf-8
, utf-16
, utf-32
Header imports
Install the Nvim Official LSP integration
Requires 2 lines of change to support LSP snippets
local lsp = require "lspconfig"
local coq = require "coq" -- add this
lsp.<server>.setup(<stuff...>) -- before
lsp.<server>.setup(coq.lsp_ensure_capabilities(<stuff...>)) -- after
99% of LSP grammar, 95% of Vim grammar
Press key to jump to next edit region.
The %
statistic comes from compiling the 10,000 snippets
Shows context
Partial document parsing
Auto-disable if document is too big
Unicode ready
Treesitter is still unstable in nvim0.5: slow and crash prone
The promise is that Treesitter will have real time parsing on every keystroke, but it's actually too slow on big files.
The Treesitter source only parses a limited number of lines about the cursor and only on Idle
events due to unrealized performance promises.
LSP like
Incremental & automatic background compilation
Non-blocking
Requires Universal CTags
, NOT ctags
# MacOS
brew uninstall ctags # bad
brew install universal-ctags # good
# Ubuntu
apt remove ctags # bad
apt install universal-ctags # good
Preview contents
$VARIABLE
expansion, %EVEN_UNDER_WINDOWS%
Relative to both cwd
and file path
Real time completion
Fast in files with thousands of lines
words Last yank 0
+ custom a-z
coq_settings.clients.registers.words
lines coq_settings.clients.registers.lines
(a-z
)
CPU preserving flow control
Auto download & install & update
Platform specific cgroupv2
& taskpolicy
core pinning / CPU management.
T9 is disabled by default, I might remove it, if they do not improve the CPU usage. Their own bug tracker.
Enable via: coq_settings.clients.tabnine.enabled=true
Even faster than pure lua! (transparent sqlite
caching)
External third party plugins too
Shown above: shell repl.
Some other built-ins:
nvim lua API
vim runtime: ada, c, clojure, css, haskell, html, js, php, syntax
:COQstats
Here I make a type error on purpose inputting string
instead of an integer
.
If you can't see icons properly:
Either set let g:coq_settings = { 'display.icons.mode': 'none' }
to disable icons, or install a supported font
Windows requires symlinks support in git.
git config --global core.symlinks true
Needs python virtual env
apt install --yes -- python3-venv
Minimum version: python:3.8.2
, nvim: 0.5
, sqlite: recentish
Install the usual way, ie. VimPlug, Vundle, etc
" main one
Plug 'ms-jpq/coq_nvim', {'branch': 'coq'}
" 9000+ Snippets
Plug 'ms-jpq/coq.artifacts', {'branch': 'artifacts'}
" lua & third party sources -- See https://github.com/ms-jpq/coq.thirdparty
" Need to **configure separately**
Plug 'ms-jpq/coq.thirdparty', {'branch': '3p'}
" - shell repl
" - nvim lua api
" - scientific calculator
" - comment banner
" - etc
{
"neovim/nvim-lspconfig", -- REQUIRED: for native Neovim LSP integration
lazy = false, -- REQUIRED: tell lazy.nvim to start this plugin at startup
dependencies = {
-- main one
{ "ms-jpq/coq_nvim", branch = "coq" },
-- 9000+ Snippets
{ "ms-jpq/coq.artifacts", branch = "artifacts" },
-- lua & third party sources -- See https://github.com/ms-jpq/coq.thirdparty
-- Need to **configure separately**
{ 'ms-jpq/coq.thirdparty', branch = "3p" }
-- - shell repl
-- - nvim lua api
-- - scientific calculator
-- - comment banner
-- - etc
},
init = function()
vim.g.coq_settings = {
auto_start = true, -- if you want to start COQ at startup
-- Your COQ settings here
}
end,
config = function()
-- Your LSP settings here
end,
}
To start coq
" the [-s, --shut-up] flag will remove the greeting message
:COQnow [--shut-up]
🌟 If required, it will ask you to run :COQdeps
, please run it and do :COQnow
again.
There is built-in help command
:COQhelp [--web] [topic]
Always:
key | function |
---|---|
<c-space> |
manual completion |
<c-h> |
edit snippet placeholder |
When completion menu is open:
key | function |
---|---|
<c-k> |
move preview to bigger window |
<esc> |
exit to normal |
<backspace> |
backspace |
<enter> |
select completion |
<tab> |
next result |
<s-tab> |
prev result |
Unbound:
keymap | function |
---|---|
coq_settings.keymap.repeat |
repeat last edit |
coq_settings.keymap.eval_snips |
evulate snippet in document / under selection |
When hovering over a result, entering any key [a-z] will select it
This is a vim thing, I have zero control over :(
.
RepeatSet coq_settings.keymap.repeat
to a hotkey.
See :COQhelp keybind
for details
By default, the old results are cleared on each keystroke, so the popup menu is closed right away.
You can disable this: at the cost of having stale results shown until the new ones come in.
let g:coq_settings = { 'display.pum.fast_close': v:false }
This is not the default because some LSP servers are very slow (ie. tailwindcss), leading to stale results being shown for too long.
let g:coq_settings = { 'auto_start': v:true }
or let g:coq_settings = { 'auto_start': 'shut-up' }
This must be set BEFORE require("coq")
You have some options, each has its trade off:
coq_settings.limits.completion_auto_timeout
.This will slow down feedback on every keystroke, as coq
waits for LSP.
<c-space>
)Annoying! And the manual completion also has a timeout coq_settings.limits.completion_manual_timeout
.
Some LSP servers will still fail to respond within the default .66
seconds, in that case pressing <c-space>
multiple times might actually help some LSP servers catch up, depending on their implementation.
Increase coq_settings.clients.lsp.resolve_timeout
This will however, make applying edits slower.
On keystroke only a max of coq_settings.match.max_results
are shown.
Use manual completion hotkey to show all results.
This happens when certain LSP servers give you 1000s of unfiltered results in alphabetical order and you still have to respond in a few dozen milliseconds.
To eliminate a-z
bias, coq
does a random sort on the resultset and process and cache as many of them as possible within the performance window.
So if some results are not in the SQLite cache, and have yet to be processed, they will be missing. They might however still show up on later keystrokes.
Use the manual hotkey if you need to see everything.
Disable TreeSitter
Treesitter still needs stability work.
vim.g.python3_host_prog=<absolute path to python>
Also check out
sad
, it's a modern sed
that does previews with syntax highlighting, and lets you pick and choose which chunks to edit.
CHADTree
, it's a FULLY featured file manager.
isomorphic-copy, it's a cross platform clipboard that is daemonless, and does not require third party support.
The snippets are compiled from the following open source projects:
Super special thanks goes to Typescript LSP.
Nothing like good motivation to improve my design than dumping 1000 results on my client every other keystroke.