package coq-lsp

  1. Overview
  2. Docs
Language Server Protocol native server for Coq

Install

Dune Dependency

Authors

Maintainers

Sources

coq-lsp-0.1.5.8.16.tbz
sha256=5a0819d6ceb18cf031ece2c466eefd27f018d85c1c7472038bbb7c2663714b6e
sha512=be97b25db922014681dce75a68566b887f692c60208b698f03ce8b2fc0c1a2eab5c0c563d698eeb1d21dea5405468e958e67cce9a6c94a3106529f1b4ebfce13

Description

Language Server Protocol native server for Coq

Published: 15 Feb 2023

README

Coq LSP

coq-lsp is a Language Server and Visual Studio Code extension for the Coq Proof Assistant.

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.

Table of Contents

🎁 Features

⏩ Incremental Compilation and Continuous Document Checking

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.

Incremental checking

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!

🧠 Smart, Cache-Aware Error Recovery

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.

Smart error recovery

Furthermore, you can leave bullets and focused goals unfinished, and coq-lsp will automatically admit them for you.

🥅 Whole-Document Goal Display

Press Alt+Enter (or Cmd+Enter in Mac) to show goals at point in a side panel.

Whole-Document Goal Display

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.

🗒️ Markdown Support

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 + Markdown Editing

👥 Document Outline

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.

Document Outline Demo Document Symbols

⏱️ Detailed Timing and Memory Statistics

Hover over any Coq sentence, coq-lsp will display detailed memory and timing statistics.

Stats on Hover

🔧 Client-Side Configuration Options

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.

Configuration screen

♻️ Reusability, Standards, Modularity

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 Platform for Research!

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.

🛠️ Installation

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.

Server

  • opam:

    opam install coq-lsp
    
  • Nix:

    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!

Visual Studio Code

  • 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
    ...
  ];
}; 

Neovim

  • Experimental client by Jaehwang Jung: https://github.com/tomtomjhj/coq-lsp.nvim

🗣️ Discussion Channel

coq-lsp discussion channel it at Coq's Zulip, don't hesitate to stop by; both users and developers are welcome.

❓FAQ

See our list of frequently-asked questions.

⁉️ Troubleshooting and Known Problems

  • Some problems can be resolved by restarting coq-lsp, in Visual Studio Code, Ctrl+Shift+P will give you access to the coq-lsp.restart command.

  • 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: Server option.

  • If you install coq-lsp simultaneously with VSCoq, VSCode gets confused and neither of them may work. coq-lsp will warn about that. If you know how to improve this, don't hesitate to get in touch with us.

  • VS Code may send request completions with a stale document, this will be fixed in a new upstream release, c.f. https://github.com/ejgallego/coq-lsp/issues/273

Working With Multiple Files

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-lsp https://github.com/ejgallego/coq.git#v8.17+lsp
    
  • For Coq 8.16:

    opam pin add coq-lsp https://github.com/ejgallego/coq.git#v8.16+lsp
    

📔 Planned Features

See planned features and contribution ideas for a list of things we'd like to happen.

📕 Protocol Documentation

coq-lsp mostly implements the LSP Standard, plus some extensions specific to Coq.

Check the coq-lsp protocol documentation for more details.

🤸 Contributing

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.

🌐 Team

  • Ali Caglayan (co-coordinator)

  • Emilio J. Gallego Arias (Inria Paris, co-coordinator)

  • Shachar Itzhaky (Technion)

  • Ramkumar Ramachandra (Inria Paris)

Past Contributors

  • Vincent Laporte (Inria)

©️ Licensing Information

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).

👏 Acknowledgments

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!

Dependencies (9)

  1. camlp-streams >= "5.0"
  2. coq-serapi >= "8.16.0+0.16.2" & < "8.17"
  3. coq >= "8.16.0" & < "8.17"
  4. menhir >= "20220210"
  5. uri >= "4.2.0"
  6. yojson >= "1.7.0"
  7. cmdliner >= "1.1.0"
  8. dune >= "3.2"
  9. ocaml >= "4.11.0"

Dev Dependencies

None

Used by

None

Conflicts

None