https://github.com/boogie-org/boogie-friends.git
git clone 'git://github.com/boogie-org/boogie-friends.git'
A collection of tools for interacting with Boogie and related languages.
boogie-mode
, dafny-mode
)The boogie-friends
package is an experimental collection of Emacs modes for
writing verified programs in languages of the Boogie family. Dafny and Boogie
are the two currently supported languages. Features include:
flycheck
)company
)hideshow
)prettify-symbols-mode
)In addition, the Dafny mode offers:
yasnippet
)Notice the error highlighting, the symbol beautification (forall
appears as ∀
), and the code folding on the last line!
Setup MELPA
In your .emacs
, add these three lines if you don't have them yet:
(require 'package) ;; You might already have this line
(add-to-list 'package-archives '("melpa" . "http://melpa.org/packages/") t)
(package-initialize) ;; You might already have this line
Install the package: M-x package-install RET boogie-friends RET
Indicate the paths to your Dafny and Boogie installations:
In your .emacs
:
(setq flycheck-dafny-executable "PATH-TO-DAFNY")
(setq flycheck-boogie-executable "PATH-TO-BOOGIE")
(setq boogie-friends-profile-analyzer-executable "PATH-TO-Z3-AXIOM-PROFILER") ;; Optional
/trace
).boogie-friends-profile-analyzer-executable
) on the resulting trace.TAB auto-indents.
C-c C-? opens the Dafny docs.
<C-down-mouse-1> looks for the definition of the function under point in open buffers.
C-c C-a translates the current file to Boogie and shows the translated file.
C-c C-j or C-S-down-mouse-1 (aka Ctrl-Shift-Click) jumps to the Boogie line matching the current Dafny line.
After inserting a snippet, TAB moves to the next snippet field, and C-d removes the current field entirely.
During completion, C-h shows documentation for the current snippet, if available.
FlyC*
: busy; FlyC:a/b
: done).Real-time error highlighting is enabled by default for all languages. You can disable it:
For just one language (say Dafny) by adding (setq flycheck-disabled-checkers '(dafny))
to your .emacs
.
Entirely by adding (flycheck-mode -1)
to 'boogie-friends-mode-hook
.
If you see blocks instead of proper characters, or tall characters, or ugly characters:
Install a good font and restart Emacs (Arial Unicode, Cambria, Segoe UI Symbol, DejaVu Sans Mono, FreeMono, STIX, Unifont and Symbola should all work).
If that doesn't fix it, setup font fallback by adding the following to your .emacs
(replace "Symbola"
by the name of your font):
elisp
(set-fontset-font t 'unicode (font-spec :name "Symbola") nil 'append)
If that still doesn't work, turn of prettification entirely by adding the following to setup-boogie-friends
above:
elisp
(prettify-symbols-mode -1)
If you don't like the way one particular symbol is rendered, you can adjust the font for just that one:
(set-fontset-font t (cons ?≔ ?≔) "FreeSerif" nil 'prepend)
A typical profiling workflow proceeds as follows:
boogie-friends-profiler-timeout
).Note: The axiom profiler works best if it has a Boogie source file to look at; thus, when profiling a Dafny source file, boogie-friends
transparently saves it as a translated Boogie file first, and then runs Boogie (with profiling enabled) on it. Thus the profiler is Boogie in all cases, and custom prover arguments need to be set for Boogie if they are to be taken into account for profiling (for tracing and translation, however, Dafny's settings apply).
Each time boogie-friends
calls a prover, it collects arguments from four sources:
LANGUAGE-prover-args
, the list of arguments passed to the prover in the default configuration (i.e. dafny-prover-args
and boogie-prover-args
). This has pretty good defaults, and probably shouldn't be changed.
LANGUAGE-prover-custom-args
, a list of extra flags. This is empty by default, and is a good place to add your own flags.
LANGUAGE-prover-local-args
, another list of extra flags. This is empty by default, and is a good place to add per-file or per-directory flags (see below).
LANGUAGE-prover-alternate-args
, a list of flags added to the prover invocation when running verify/compile
with a prefix argument (C-u C-c C-c). This is a good place to add flags that you do not always need; for example "/compile:3"
(this is the default).An example configuration might thus look like this:
;; Don't allow assumptions
(setq dafny-prover-custom-args '("/noCheating:1"))
;; Get more debug output when verifying with C-u C-c C-c
(setq dafny-prover-alternate-args '("/proverWarnings:2" "/traceverify" "/z3opt:TRACE=true" "/trace" "/traceTimes" "/tracePOs"))
The LANGUAGE-prover-local-args
is useful if a file requires specific flags (maybe /vcsMaxKeepGoingSplits
, for example): in that case you can set the LANGUAGE-prover-local-args
in just that file or in the corresponding directory.
For example, you can add the following to the top of a file:
// -*- dafny-prover-local-args: ("/vcsMaxKeepGoingSplits:5" "/proverMemoryLimit:250") -*-
The documentation that ships with this package is auto-generated from the Dafny Quick Reference.
Clone the repo:
mkdir -p ~/.emacs.d/lisp/ && cd ~/.emacs.d/lisp/
git clone https://github.com/boogie-org/boogie-friends
Then in your .emacs (in addition to the stuff above):
(add-to-list 'load-path "~/.emacs.d/lisp/boogie-friends/emacs/")
(require 'dafny-mode)
(require 'boogie-mode)