This package provides basic interaction with a Clojure subprocess (REPL).
It's based on ideas from the popular inferior-lisp
package.
inf-clojure
has two components - a nice Clojure REPL with
auto-completion and a minor mode (inf-clojure-minor-mode
), which
extends clojure-mode
with commands to evaluate forms directly in the
REPL.
inf-clojure
provides a set of essential features for interactive
Clojure(Script) development:
- REPL
- Interactive code evaluation
- Code completion
- Definition lookup
- Documentation lookup
- ElDoc
- Apropos
- Macroexpansion
- Support connecting to socket REPLs
- Support for Lumo
- Support for Planck
For a more powerful/full-featured solution see CIDER.
Available on all major package.el
community maintained repos -
MELPA Stable and MELPA repos.
MELPA Stable is recommended as it has the latest stable version. MELPA has a development snapshot for users who don't mind breakage but don't want to run from a git checkout.
You can install inf-clojure
using the following command:
M-x package-install [RET] inf-clojure [RET]
or if you'd rather keep it in your dotfiles:
(unless (package-installed-p 'inf-clojure)
(package-refresh-contents)
(package-install 'inf-clojure))
If the installation doesn't work try refreshing the package list:
M-x package-refresh-contents
Add the following to your Emacs config to enable
inf-clojure-minor-mode
for Clojure source buffers:
(add-hook 'clojure-mode-hook #'inf-clojure-minor-mode)
Don't enable inf-clojure-minor-mode
and cider-mode
at the same
time. They have overlapping functionality and keybindings and the
result will be nothing short of havoc.
Just invoke M-x inf-clojure
or press C-c C-z
within a Clojure source file.
This will start a REPL process for the current project and you can start
interacting with it.
inf-clojure
has several custom variables which control the command
used to start a REPL for particular project type - inf-clojure-lein-cmd
,
inf-clojure-boot-cmd
and inf-clojure-generic-cmd
.
By default all those variables are set to strings (e.g. lein repl
).
However, it is possible to use a cons pair like ("localhost" . 5555)
to connect to a socket REPL like the one provided
with planck, which can be started from the
command line with planck -n 5555
.
Use C-u C-c C-z
to start a REPL with a different command/cons pair than
the default specified in inf-clojure-program
.
You can use M-x inf-clojure-connect
to connect to a running socket-repl.
You will be prompted for host and port.
You can set custom values to inf-clojure
variables on a per-project basis using directory
variables.
For a list of all available commands in inf-clojure-mode
(a.k.a. the REPL) and
inf-clojure-minor-mode
you can either invoke C-h f RET inf-clojure-mode
and
C-h f RET inf-clojure-minor-mode
or simply browse their menus.
Many inf-clojure-minor-mode
commands by default act on the symbol at
point. You can, however, change this behaviour by invoking such
commands with a prefix argument. For instance: C-u C-c C-v
will ask
for the symbol you want to show the docstring for.
In the time-honoured Emacs tradition inf-clojure
's behaviour is extremely
configurable.
You can see all the configuration options available using the command
M-x customize-group RET inf-clojure
.
An inf-clojure
REPL can be of different types: Clojure,
ClojureScript, Lumo and Planck are all potentially valid options. At
the moment, the default Clojure REPL, the Lumo REPL (though partially,
see #44), and the
Planck REPL are supported.
What does it mean that a REPL type is supported - well it means that inf-clojure
would use the proper code internally to power commands like definition lookup and friends.
Those differ from REPL to REPL and can't be implemented in a REPL-independent way. At
boot type inf-clojure
tries to detect the type of the REPL that was started and uses
this type to dispatch the proper code for the respective REPL type.
By default inf-clojure
would start a standard Clojure REPL using
lein
or boot
but you can easily change this. To boot some other REPL just use the
right launch command (or connect to the REPL via a socket). For example, for
Lumo just add the following in your .dir-locals.el
:
((nil . ((inf-clojure-boot-cmd . "lumo -d")))) ;; inf-clojure-lein-cmd if you are using Leiningen
eldoc-mode
is supported in Clojure source buffers and *inferior-clojure*
buffers which are running a Clojure REPL.
When ElDoc is enabled and there is an active REPL, it will show the argument list of the function call you are currently editing in the echo area.
You can activate ElDoc with M-x eldoc-mode
or by adding the
following to you Emacs config:
(add-hook 'clojure-mode-hook #'eldoc-mode)
(add-hook 'inf-clojure-mode-hook #'eldoc-mode)
ElDoc currently doesn't work with ClojureScript buffers and REPL's. You can leave it enabled, it just won't show anything in the echo area.
For an optimal Lumo experience the -d
needs to be passed to Lumo
when launched from the command line. This disable readline
support
in order to play nicely with emacs.
For example, you can use the following command (assuming cp
contains
the classpath) in your .dir-locals.el
:
((nil . (eval . (setq inf-clojure-boot-cmd (concat "lumo -d -c "
(f-read (concat (inf-clojure-project-root) "cp")))))))
In Windows, the REPL is not returning anything. For example, type (+ 1 1)
and press ENTER
, the cursor just drops to a new line and
nothing is shown.
The explanation of this problem and solution can be found here.
The solution is to create a file named .jline.rc
in your $HOME
directory and add this line to that file:
jline.terminal=unsupported
Copyright © 2014-2017 Bozhidar Batsov and contributors.
Distributed under the GNU General Public License; type C-h C-c to view it.