A collection of extensions for Proof General's Coq mode.
See screenshots below, or jump right to setup instructions and try the tutorial with M-x company-coq-tutorial after setting up!
Both proof-general
and company-coq
are on MELPA, a repository of Emacs packages. Skip this step if you already use MELPA. Otherwise, add the following to your .emacs
and restart Emacs:
(require 'package)
(add-to-list 'package-archives '("melpa" . "https://melpa.org/packages/") t)
(package-initialize)
Install and byte-compile Proof General, Company-Coq, and its dependencies by typing successively:
(some dependencies will produce a few warnings; that's OK).
To enable company-coq automatically, add the following to your .emacs
:
;; Load company-coq when opening Coq files
(add-hook 'coq-mode-hook #'company-coq-mode)
Then restart and launch the tutorial with M-x company-coq-tutorial!
Use M-x company-coq-cite
to insert the BibTeX entries for Coq, Proof General, and company-coq
in the current buffer.
@InProceedings{CompanyCoq2016,
Title = {Company-Coq: Taking Proof General one step closer to a real IDE},
Author = {Pit-Claudel, Clément and Courtieu, Pierre},
Booktitle = {CoqPL'16: The Second International Workshop on Coq for PL},
Year = {2016},
Month = jan,
Doi = {10.5281/zenodo.44331},
Url = {http://hdl.handle.net/1721.1/101149}
}
You can check out the interactive tutorial by pressing M-x company-coq-tutorial RET. See also the screenshots above!
company-coq
should be pretty transparent. Completion windows will pop up when company-coq
has suggestions to make. By default, this would be when you start writing a tactic name or a command. You can also launch manual completion by using C-RET (or whatever was originally assigned to proof-script-complete
in Coq mode).
Once auto-completion has started, the following key bindings are available:
Selecting a completion often inserts a snippet with holes at the current point (company-coq
uses yasnippet
as the snippet backend). You can move between holes by using <tab> and S-<tab>.
Loading company-coq
also binds the following keys:
match
case (| _ => _
).match goal
rule (| [ H: _ |- _ ] => _
).occur
).Require Import C.N..Ab.ZPa
and press RET to insert Coq.Numbers.Integer.Abstract.ZParity
, and typing setrewin
is enough to insert setoid_rewrite term in ident
. You can (and must) omit spaces: SLD
will insert Set Ltac Debug
(of course SetLtDeb
will also work), and ULD
will insert Unset Ltac Debug
.match goal
saves a lot of time (and finger contortions). For the match itself, use mgw
(for match goal with
).xterm-mouse-mode
.company-coq
improves on some of Proof General's features. Try C-c C-a RET nat RET.a__b
to display a
b
.company-coq
is implemented as a collection of small modules implementing independent features; check out M-x customize-variable RET company-coq-disabled-features RET
and M-x customize-group RET company-coq RET
for more info!
If you see blank squares appear where there should be math symbols (forall
, exists
, etc.), or if some lines suddenly become very tall, you may be missing a proper math font. See Installing a math font, or insert the following snippet in your .emacs
to disable symbols beautification:
;; Disable symbol prettification
(setq company-coq-disabled-features '(prettify-symbols))
On the other hand, if you like the prettification feature a lot, you can enable it in the terminal:
(setq company-coq-features/prettify-symbols-in-terminals t)
Technical note: Proof General also offers a Unicode keywords facility. company-coq
's implementation is based on the prettify-symbols-mode
facility found in Emacs 24.4+, yielding a more compact (and faster?) implementation.
For prettification to work properly, you'll need a font with proper symbol support. Symbola (up to version 10.23), FreeMono, XITS Math, Segoe UI Symbol, Latin Modern, and Cambria Math will all work. If Emacs doesn't fallback properly, you can use the following snippet (change XITS Math
and DejaVu sans Mono
to the Unicode font you just downloaded and to your usual monospace font, respectively):
(set-fontset-font t 'unicode (font-spec :name "XITS Math") nil 'prepend)
(set-fontset-font t 'greek (font-spec :name "DejaVu sans Mono") nil 'prepend)
Or, in Emacs < 25:
(dolist (ft (fontset-list))
(set-fontset-font ft 'unicode (font-spec :name "YOUR-USUAL-FONT"))
(set-fontset-font ft 'unicode (font-spec :name "XITS Math") nil 'append))
Using a variable-width font for symbols will break indentation. See this other project of mine to download a monospace-friendly symbols font. You'll want to replace the snippet above by following (adjusting Latin Modern Math
and DejaVu sans Mono
as appropriate):
(set-fontset-font t 'unicode (font-spec :name "Latin Modern Math Monospacified for DejaVu sans Mono") nil 'prepend)
Or, in Emacs < 25:
(dolist (ft (fontset-list))
(set-fontset-font ft 'unicode (font-spec :name "YOUR-USUAL-FONT"))
(set-fontset-font ft 'unicode (font-spec :name "Latin Modern Math Monospacified for YOUR-USUAL-FONT") nil 'append))
Adding the following header to a Coq file will make company-coq hide the bodies of all bullets when the file is opened. You can also customize the company-coq-initial-state
variable to apply the setting globally.
(* -*- company-coq-initial-fold-state: bullets; -*- *)
If possible, company-coq
will use the alert
library to display notifications when long-running proofs complete. alert
is only needed on Windows and OSX; on Linux systems with DBus this should work out of the box. You can try it out by running the snippet below and opening another application while the proof runs; after 10 seconds company-coq will show a notification.
Goal True.
Fail timeout 10 repeat pose 1.
Add the following header to a Coq file, save, and run M-x revert-buffer
to prettify squiggly arrows.
(* -*- company-coq-local-symbols: (("<~>" . ?↭) ("~>" . ?↝) ("<~" . ?↜)); -*- *)
Alternatively, you can use a special comment at the end of the file:
(* Local Variables: *)
(* company-coq-local-symbols: (("<~>" . ?↭) ("~>" . ?↝) ("<~" . ?↜)) *)
(* End: *)
Tip: you can use M-x add-file-local-variable
to add this sort of variables.
Create a .dir-locals.el
file at the root of your project, and add following contents to it:
;;; Directory Local Variables
;;; For more information see (info "(emacs) Directory Variables")
((coq-mode
(company-coq-dir-local-symbols
(("<~>" . ?↭) ("~>" . ?↝) ("<~" . ?↜)))))
Tip: you can use M-x add-dir-local-variable
to add this sort of variables.
Adjust and use the following snippet to register your own prettifications for all Coq files. This must run before (company-coq-mode)
, so it must be added after the company-coq
setup code above.
(add-hook 'coq-mode-hook
(lambda ()
(setq-local prettify-symbols-alist
'((":=" . ?≜) ("Proof." . ?∵) ("Qed." . ?■)
("Defined." . ?□) ("Time" . ?⏱) ("Admitted." . ?😱)))))
Greek symbols can be obtained using the following mappings:
'(("Alpha" . ?Α) ("Beta" . ?Β) ("Gamma" . ?Γ)
("Delta" . ?Δ) ("Epsilon" . ?Ε) ("Zeta" . ?Ζ)
("Eta" . ?Η) ("Theta" . ?Θ) ("Iota" . ?Ι)
("Kappa" . ?Κ) ("Lambda" . ?Λ) ("Mu" . ?Μ)
("Nu" . ?Ν) ("Xi" . ?Ξ) ("Omicron" . ?Ο)
("Pi" . ?Π) ("Rho" . ?Ρ) ("Sigma" . ?Σ)
("Tau" . ?Τ) ("Upsilon" . ?Υ) ("Phi" . ?Φ)
("Chi" . ?Χ) ("Psi" . ?Ψ) ("Omega" . ?Ω)
("alpha" . ?α) ("beta" . ?β) ("gamma" . ?γ)
("delta" . ?δ) ("epsilon" . ?ε) ("zeta" . ?ζ)
("eta" . ?η) ("theta" . ?θ) ("iota" . ?ι)
("kappa" . ?κ) ("lambda" . ?λ) ("mu" . ?μ)
("nu" . ?ν) ("xi" . ?ξ) ("omicron" . ?ο)
("pi" . ?π) ("rho" . ?ρ) ("sigma" . ?σ)
("tau" . ?τ) ("upsilon" . ?υ) ("phi" . ?φ)
("chi" . ?χ) ("psi" . ?ψ) ("omega" . ?ω))
in which case you may want to use a custom font for Greek characters:
(dolist (ft (fontset-list))
(set-fontset-font ft 'greek (font-spec :name "DejaVu Sans Mono")))
Tip: to add multi-character substitutions, you may want to consult issue #201.
The procedure above will give you auto-completion and documentation for tactics, commands, and theorems that you define locally, but not for theorem names and symbols defined in the libraries you load. To get the latter, add the following to your .emacs
, before (company-coq-mode)
:
(setq company-coq-live-on-the-edge t)
Use Cask.
Many thanks to Pierre Courtieu for his work on Proof General, and to Jonathan Leivent and Jason Gross for their tireless bug reports and suggestions!