Lean can process input incrementally, and extract type information.
This feature is useful for implementing "intelligent" support for Lean
in editors such as Emacs. It provides a convenient way to access
descriptions of functions, overloaded symbols, and typing information.
We must use the option =--server= to enable this feature.

* Commands

Lean implements a simple set of commands for loading files, extracting
typing information, and "replacing" lines. The commands should be sent
to the standard input.

** Load file

#+BEGIN_SRC
LOAD [file-name]
#+END_SRC

This command loads the Lean file named =[file-name]=.
Lean will create a "snapshot" (aka backtracking point) after each
command. Lean uses the "snapshots" to process incremental updates efficiently.

** Visit file

#+BEGIN_SRC
VISIT [file-name]
#+END_SRC

Lean can keep information about multiple files. This command
sets =[file-name]= as the "current" file. The remaining  commands
are all with respect to the current file. If =[file-name]= has not been
loaded yet, then this command will load it. Some of the remaining commands
apply "changes" to the current file. The =LOAD= command can be used to
discard all these changes, and enforce the content of the file stored
in file system.

** Replace line

#+BEGIN_SRC
REPLACE [line-number]
[new-line]
#+END_SRC

This command replaces the line =[line-number]= (in the current file) with =[new-line]=.
Lean uses the snapshots to process the request efficiently.
If =[line-number]= is greater than the total number of lines in the lean
buffer, then empty lines are introduced. The lines are indexed from 1.

** Insert line

#+BEGIN_SRC
INSERT [line-number]
[new-line]
#+END_SRC

This command inserts =[new-line]= (in the current file) before line =[line-number]=.
If =[line-number]= is greater than the total number of lines in the lean
buffer, then empty lines are introduced. The lines are indexed from 1.

** Remove line

#+BEGIN_SRC
REMOVE [line-number]
#+END_SRC

Remove line =[line-number]= (in the current file). The lines are indexed from 1.
If =[line-number]= is greater than the total number of lines in the lean
buffer, then the command is ignored.

** Extracting typing information

#+BEGIN_SRC
INFO [line-number]
#+END_SRC

This command extracts typing information associated with line
=[line-number]= (in the current file).
Lean produces a possible empty sequence of entries terminated with

#+BEGIN_SRC
-- ENDINFO
#+END_SRC

A type information entry is of the form

#+BEGIN_SRC
-- TYPE|[line-number]|[column-number]
[type]
-- ACK
#+END_SRC

Information for overloaded operators and symbols is of the form

#+BEGIN_SRC
-- OVERLOAD|[line-number]|[column-number]
[overload-1]
--
...
--
[overload-n]
-- ACK
#+END_SRC

Here is an example of output produced by Lean

#+BEGIN_SRC
-- TYPE|15|38
num
-- ACK
-- TYPE|15|40
num → num → Prop
-- ACK
-- OVERLOAD|15|42
f
--
foo.f
-- ACK
-- TYPE|15|42
num → num
-- ACK
-- TYPE|15|44
num
-- ACK
-- ENDINFO
#+END_SRC

** Check line

As described above, several commands can be used to apply
modifications to opened/visited files. These modification reflect
modifications performed by the text editor. The command =CHECK= can be
used to double check whether the text editor and Lean have the "same
view" of the current file + modifications.

The following commands returns =-- OK= if the line =[line-number]= in
the current file is =[line]=. It returns =-- MISMATCH line out of
range=, if =[line-number]= is too big, and =-- MISMATCH expected
[lean-line]= when there is a mismatch, and Lean expects
=[line-number]= to be =[lean-line]=.

#+BEGIN_SRC
-- CHECK [line-number]
[line]
#+END_SRC