Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

clojure-emacs/inf-clojure

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 

Repository files navigation

License GPL 3 MELPA MELPA Stable

inf-clojure

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.

Installation

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.

Usage

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.

Configuration options

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.

REPL Type

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

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.

Lumo Setup

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")))))))

Troubleshooting

REPL not responsive in Windows OS

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

License

Copyright © 2014-2017 Bozhidar Batsov and contributors.

Distributed under the GNU General Public License; type C-h C-c to view it.

About

Basic interaction with a Clojure subprocess

Topics

Resources

Stars

Watchers

Forks

Sponsor this project

  •  

Packages

No packages published

Contributors 31

Morty Proxy This is a proxified and sanitized view of the page, visit original site.