coq-lsp is a Language
Server and Visual
Studio Code extension for the Coq Proof
Assistant. Experimental support for Vim and
Neovim is also available in their own projects.
Key features of coq-lsp are continuous and incremental document
checking, advanced error recovery, markdown support, positional goals and
information panel, performance data, and more.
coq-lsp aims to provide a seamless, modern interactive theorem proving
experience, as well as to serve as a platform for research and UI integration
with other projects.
coq-lsp is built on top of Flèche, a new document checking engine for
formal documents, designed from our experience in
previous
projects. Flèche is specifically optimized for
interactive use, and provides extra features from vanilla Coq.
- 🎁 Features
- ⏩ Incremental Compilation and Continuous Document Checking
- 🧠 Smart, Cache-Aware Error Recovery
- 🥅 Whole-Document Goal Display
- 🗒️ Markdown Support
- 👥 Document Outline
- 🔎 Document Hover
- 📁️ Multiple Workspaces
- ⏱️ Detailed Timing and Memory Statistics
- 🔧 Client-Side Configuration Options
- ♻️ Reusability, Standards, Modularity
- 🔎 A Platform for Research!
- 🛠️ Installation
- 🗣️ Discussion Channel
- ☎ Weekly Calls
- ❓FAQ
⁉️ Troubleshooting and Known Problems- 📔 Planned Features
- 📕 Protocol Documentation
- 🤸 Contributing
- 🌐 Team
- ©️ Licensing Information
- 👏 Acknowledgments
Edit your file, and coq-lsp will try to re-check only what is necessary,
continuously. No more dreaded Ctrl-C Ctrl-N! Rechecking tries to be smart,
and will ignore whitespace changes.
In a future release, coq-lsp will save its document cache to disk, so you can
restart your proof session where you left it at the last time.
Incremental support is undergoing refinement, if coq-lsp rechecks when it
should not, please file a bug!
coq-lsp won't stop checking on errors, but supports (and encourages) working
with proof documents that are only partially working. Moreover, error recovery
integrates with the incremental cache, and will recognize proof structure.
You can edit without fear inside a Proof. ... Qed., the rest of the document
won't be rechecked, unless the proof is completed.
Furthermore, you can leave bullets and focused goals unfinished, and coq-lsp
will automatically admit them for you.
Press Alt+Enter (or Cmd+Enter in Mac) to show goals at point in a side
panel.
The panel will also include goals that you have given up or shelved. This panel will also show the current info about open bullets and their goals.
Open a markdown file with a .mv extension, coq-lsp will check the code parts
that are enclosed into coq language blocks! coq-lsp places human-friendly
documents at the core of its design ideas.
coq-lsp supports document outline and code folding, allowing you to jump
directly to definitions in the document. Many of the Coq vernacular commands
like Definition, Theorem, Lemma, etc. will be recognized as document
symbols which you can navigate to or see the outline of.
Hovering over a Coq identifier will show its type.
coq-lsp supports projects with multiple _CoqProject files, use the "Add
folder to Workspace" feature of Visual Studio code or the LSP Workspace Folders
extension to use this in your project.
Hover over any Coq sentence, coq-lsp will display detailed memory and timing
statistics.
coq-lsp is configurable, and tries to adapt to your own workflow. What to do
when a proof doesn't check, admit or ignore? You decide!
See the coq-lsp extension configuration in VSCode for options available.
The incremental document checking library of coq-lsp has been designed to be
reusable by other projects written in OCaml and with needs for document
validation UI, as well as by other Coq projects such as jsCoq.
Moreover, we are strongly based on standards, aiming for the least possible extensions.
A key coq-lsp goal is to serve as central platform for researchers in
Human-Computer-Interaction, Machine Learning, and Software Engineering willing
to interact with Coq.
Towards this goal, coq-lsp extends and will eventually replace coq-serapi,
which has been used by many to that purpose.
In order to use coq-lsp you'll need to install both
coq-lsp and a suitable client. We recommend the Visual Studio Code Extension.
coq-lsp supports Coq 8.16, Coq 8.17, and Coq's master branch.
We recommended a minimum of Coq 8.17, due to better test coverage for that version. We also recommend users to install the custom Coq trees for 8.16 and 8.17 as detailed in Working With Multiple Files
Support for older Coq versions is possible; it is possible to make coq-lsp
work with Coq back to Coq 8.10/8.9. If you are interested in making that happen
don't hesitate to get in touch with us.
- opam:
opam install coq-lsp - Nix:
- In nixpkgs: #213397
- In your flake:
inputs.coq-lsp = { type = "git"; url = "https://github.com/ejgallego/coq-lsp.git"; submodules = true; }; ... coq-lsp.packages.${system}.default
- Coq Platform (coming soon)
- Do it yourself!
- Official Marketplace: https://marketplace.visualstudio.com/items?itemName=ejgallego.coq-lsp
- Open VSX: https://open-vsx.org/extension/ejgallego/coq-lsp
- Nix:
inputs.coq-lsp = { type = "git"; url = "https://github.com/ejgallego/coq-lsp.git"; submodules = true; };
...
programs.vscode = {
enable = true;
extensions = with pkgs.vscode-extensions; [
...
inputs.coq-lsp.packages.${pkgs.system}.vscode-extension
...
];
};-
Experimental CoqTail support by Wolf Honore: whonore/Coqtail#323
See it in action https://asciinema.org/a/mvzqHOHfmWB2rvwEIKFjuaRIu
- Experimental client by Jaehwang Jung: https://github.com/tomtomjhj/coq-lsp.nvim
coq-lsp discussion channel it at Coq's
Zulip, don't hesitate
to stop by; both users and developers are welcome.
We hold (almost) weekly video conference calls, see the Call Schedule Page for more information. Everyone is most welcome!
See our list of frequently-asked questions.
- Some problems can be resolved by restarting
coq-lsp, in Visual Studio Code,Ctrl+Shift+Pwill give you access to thecoq-lsp.restartcommand. You can also start / stop the server from the status bar. - In VSCode, the "Output" window will have a "Coq LSP Server Events" channel
which should contain some important information; the content of this channel
is controlled by the
Coq LSP > Trace: Serveroption. - If you install
coq-lspsimultaneously with VSCoq, VSCode gets confused and neither of them may work.coq-lspwill warn about that. If you know how to improve this, don't hesitate to get in touch with us.
coq-lsp can't work with more than one file at the same time, due to problems
with parsing state management upstream. This was fixed in Coq master branch
(to become Coq 8.18).
As this is very inconvenient, we do provide a fixed Coq branch that you can
install using opam pin:
- For Coq 8.17:
opam pin add coq-core https://github.com/ejgallego/coq.git#v8.17+lsp - For Coq 8.16:
opam pin add coq https://github.com/ejgallego/coq.git#v8.16+lsp
See planned features and contribution ideas for a list of things we'd like to happen.
coq-lsp mostly implements the LSP
Standard,
plus some extensions specific to Coq.
Check the coq-lsp protocol documentation for more details.
Contributions are very welcome! Feel free to chat with the dev team in Zulip for any question, or just go ahead and hack.
We have a contributing guide, which includes a description of the organization of the codebase, developer workflow, and more.
Here is a list of project ideas that could be of
help in case you are looking for contribution ideas, tho we are convinced that
the best ideas will arise from using coq-lsp in your own Coq projects.
- Ali Caglayan (co-coordinator)
- Emilio J. Gallego Arias (Inria Paris, co-coordinator)
- Shachar Itzhaky (Technion)
- Ramkumar Ramachandra (Inria Paris)
- Vincent Laporte (Inria)
The license for this project is LGPL 2.1 (or GPL 3+ as stated in the LGPL 2.1).
-
This server forked from our previous LSP implementation for the Lambdapi proof assistant, written by Emilio J. Gallego Arias, Frédéric Blanqui, Rodolphe Lepigre, and others; the initial port to Coq was done by Emilio J. Gallego Arias and Vicent Laporte.
-
Syntax files in editor/code are partially derived from VSCoq by Christian J. Bell, distributed under the terms of the MIT license (see ./editor/code/License-vscoq.text).
Work on this server has been made possible thanks to many discussions, inspirations, and sharing of ideas from colleagues. In particular, we'd like to thank Rudi Grinberg, Andrey Mokhov, Clément Pit-Claudel, and Makarius Wenzel for their help and advice.
As noted above, the original implementation was based on the Lambdapi LSP server, thanks to all the collaborators in that project!








