lean4-htt/src/emacs
2016-07-16 15:41:32 -04:00
..
features test(emacs/features): add ecukes template 2014-09-11 12:33:49 -07:00
test feat(emacs): use s-join instead of string-join 2016-01-14 09:36:52 -05:00
.gitignore feat(emacs/Cask): add Cask file 2014-09-09 15:11:57 -07:00
Cask fix(emacs/Cask): add GNU package repository 2015-01-30 02:52:55 -05:00
CMakeLists.txt fix(CMakeLists.txt): quote CMake variables 2015-03-28 22:38:11 -04:00
eri.el feat(emacs/eri.el): add eri.el (from agda mode) 2014-08-30 14:57:34 -07:00
lean-changes.el fix(emacs/lean-changes): visit file before process any changes 2014-10-03 10:11:21 -07:00
lean-cmd.el feat(emacs/lean-cmd): add SYNC command 2014-10-02 17:30:03 -07:00
lean-company.el feat(emacs): use cl-lib functions/macros instead of cl.el 2016-01-13 11:19:40 -05:00
lean-debug.el feat(emacs/lean-debug): add lean-debug minor-mode 2014-09-15 16:50:35 -07:00
lean-flycheck.el fix(emacs/lean-flycheck.el): use -concat in lean-flycheck-command 2015-05-26 17:00:05 -04:00
lean-info.el feat(emacs): use s-join instead of string-join 2016-01-14 09:36:52 -05:00
lean-input.el chore(src/emacs/lean-input): make sure '\l' default is the left arrow 2016-06-25 13:54:50 -07:00
lean-mode.el fix(src/emacs): remove lua 2016-06-22 17:17:20 -07:00
lean-option.el feat(emacs): use s-join instead of string-join 2016-01-14 09:36:52 -05:00
lean-project.el feat(emacs/lean-project.el): ask 'project type' in lean-project-create 2016-02-12 22:02:24 -05:00
lean-require.el fix(emacs/lean-mode): remove whitespace-cleanup-mode dependency 2014-11-09 00:21:43 -05:00
lean-server.el feat(emacs): use s-join instead of string-join 2016-01-14 09:36:52 -05:00
lean-settings.el feat(emacs/lean-mode): lean-exec-at-pos uses timer to wait until flycheck process is over 2015-08-11 20:17:53 -04:00
lean-syntax.el feat(frontends/lean): add commands 'add_key_equivalence' and 'print key_equivalences' 2016-07-16 15:41:32 -04:00
lean-tags.el refactor: rename ltags => leantags 2015-01-18 13:44:41 +09:00
lean-type.el feat(emacs): use s-join instead of string-join 2016-01-14 09:36:52 -05:00
lean-util.el feat(emacs/lean-util.el): add lean-find-files 2015-08-06 22:48:00 -04:00
lean-variable.el feat(emacs/lean-server): add support for hlean/standard minor-mode 2015-02-13 19:41:41 -05:00
lean.pgm chore(CMakeLists.txt): move Lean logo to make sure we can test leanemacs without installing Lean 2015-01-31 17:38:49 -08:00
load-lean.el fix(emacs/load-lean.el): add seq to lean-required-packages 2016-01-08 03:35:23 +00:00
Makefile fix(emacs/Makefile): add missing Makefile 2014-09-14 23:14:42 -07:00
README.md feat(script): add .md link checker script 2016-02-23 10:11:24 -08:00

Emacs mode for lean theorem prover

Requirements

lean-mode requires Emacs 24 and the following packages, which can be installed via M-x package-install.

The following packages are optional, but we recommend installing them to use full features of lean-mode.

Both the optional and required packages will be installed for you automatically the first time you use lean-mode, if you follow the installation instructions below.

Installation

When Emacs is started, it loads startup information from a special initialization file, often called an "init file." The init file can be found in different places on different systems:

  • Emacs will check for a file named .emacs in your home directory.
  • With GNU Emacs, it is common to use .emacs.d/init.el instead.
  • With Aquamacs, it is common to use ~/Library/Preferences/Aquamacs Emacs/Preferences.el.

On Windows, there are two additional complications:

  • It may be hard to figure out what Emacs considers to be your "home directory".
  • The file explorer may not let you create a file named .emacs, since it begins with a period.

One solution is to run Emacs itself and create the file using C-c C-f (control-C, control-F) and then entering ~/.emacs. (The tilde indicates your home directory.) On Windows, you can also name the file _emacs.

Put the following code in your Emacs init file:

(require 'package)
(add-to-list 'package-archives '("melpa" . "http://melpa.milkbox.net/packages/") t)
(when (< emacs-major-version 24)
  ;; For important compatibility libraries like cl-lib
  (add-to-list 'package-archives '("gnu" . "http://elpa.gnu.org/packages/")))
(package-initialize)

;; Install required/optional packages for lean-mode
(defvar lean-mode-required-packages
  '(company dash dash-functional flycheck f
            fill-column-indicator s lua-mode mmm-mode))
(let ((need-to-refresh t))
  (dolist (p lean-mode-required-packages)
    (when (not (package-installed-p p))
      (when need-to-refresh
        (package-refresh-contents)
        (setq need-to-refresh nil))
      (package-install p))))

Then choose your installation method from the following scenarios, and add the corresponding code to your init file:

Case 1: Build Lean from source

;; Set up lean-root path
(setq lean-rootdir "~/projects/lean")  ;; <=== YOU NEED TO MODIFY THIS
(setq-local lean-emacs-path
            (concat (file-name-as-directory lean-rootdir)
                    (file-name-as-directory "src")
                    "emacs"))
(add-to-list 'load-path (expand-file-name lean-emacs-path))
(require 'lean-mode)

Case 2: Install Lean via apt-get on Ubuntu or via dpkg on Debian

;; Set up lean-root path
(setq lean-rootdir "/usr")
(setq-local lean-emacs-path "/usr/share/emacs/site-lisp/lean")
(add-to-list 'load-path (expand-file-name lean-emacs-path))
(require 'lean-mode)

Case 3: Install Lean via homebrew on OS X

;; Set up lean-root path
(setq lean-rootdir "/usr/local")
(setq-local lean-emacs-path "/usr/local/share/emacs/site-lisp/lean")
(add-to-list 'load-path (expand-file-name lean-emacs-path))
(require 'lean-mode)

Note: if you install homebrew in a custom location that is not the default location, please run brew info lean, and it will tell you where the lean-mode files are located. With that information, update the lean-emacs-path variable accordingly.

Case 4: Install Lean in Windows

;; Set up lean-root path
(setq lean-rootdir "\\lean-0.2.0-windows")
(setq-local lean-emacs-path "\\lean-0.2.0-windows\\share\\emacs\\site-lisp\\lean")
(add-to-list 'load-path (expand-file-name lean-emacs-path))
(require 'lean-mode)

Trying It Out

If things are working correctly, you should see the word Lean in the Emacs mode line when you open a file with extension .lean (for the standard Lean mode) or .hlean (for hott mode). If you type

check id

the word check will be underlined, and hovering over it will show you the type of id. The mode line will show FlyC:0/1, indicating that there are no errors and one piece of information displayed. Whenever you type, an asterisk should briefly appear after FlyC, indicating that your file is being checked.

Key Bindings

Key Function
C-c C-x lean-std-exe
C-c C-l lean-std-exe
C-c C-t lean-eldoc-documentation-function
C-c C-f lean-fill-placeholder
M-. lean-find-tag
TAB lean-tab-indent-or-complete
C-c C-o lean-set-option
C-c C-e lean-eval-cmd

Known Issues and Possible Solutions

Unicode

If you experience a problem rendering unicode symbols on emacs, please download the following fonts and install them on your machine:

Then, have the following lines in your emacs setup to use DejaVu Sans Mono font:

(when (member "DejaVu Sans Mono" (font-family-list))
  (set-face-attribute 'default nil :font "DejaVu Sans Mono-11"))

You may also need to install emacs-unicode-fonts package.

  • Run M-x package-refresh-contents, M-x package-install, and type unicode-fonts.

  • Add the following lines in your emacs setup:

(require 'unicode-fonts) (unicode-fonts-setup)


"Variable binding depth exceeds max-specpdl-size" Error
---------------------------------------------------------

See [Issue 906](https://github.com/leanprover/lean/issues/906) for details.
[Moritz Kiefer](https://github.com/cocreature) reported that `proofgeneral` 
comes with an old version of `mmm-mode` (0.4.8, released in 2004) on ArchLinux
and it caused this problem. Either removing `proofgeneral` or upgrading
`mmm-mode` to the latest version (0.5.1 as of 2015 Dec) resolves this issue.


Contributions
=============

Contributions are welcome!

If your contribution is a bug fix, create your topic branch from
`master`. If it is a new feature, check if there exists a
WIP(work-in-progress) branch (`vMAJOR.MINOR-wip`). If it does, use
that branch, otherwise use `master`.

Install [Cask](https://github.com/cask/cask) if you haven't already,
then:

 $ cd /path/to/lean/src/emacs
 $ cask

Run all tests with:

 $ make