The slime replacement for Clojure development under emacs, nrepl.el,
has itself been replaced (well, renamed) to cider, Cider,
like nrepl.el, integrates with nREPL under leiningen. I took the
opportunity to upgrade to it, since had a spare day on my
hands. As recommended, I used package.el
to install from the
Marmalade repo, by adding this to .emacs
(require 'package) (add-to-list (quote package-archives) '("marmalade" . "http://marmalade-repo.org/packages/")) (package-initialize)
Installed via M-x package-refresh-contents
, then M-x
package-install RET cider RET
.
The problem was that cider-jack-in
would not work, just
hung. Launching a repl manually via lein
and then using
cider to connect to the host/port combo was fine.
In the ps list of processes, I noticed this:
-bin/tcsh -c echo "lein repl :headless" | eval $SHELL -l
Hmm, this must be the command that launches a repl, but clearly not
working; the contents of the *nrep-server*
emacs buffer
just contained the output of my .login
script, and nothing
else.
You will have noted that the shell invoked by emacs is
/bin/tcsh
. This is my default shell under Max OS X,
because that's the default on FreeBSD (OS X has many
elements from FreeBSD). At some point, I had also made it my
default shell for emacs (by setting the shell-file-name
variable). And this was the cause of the problem. tcsh -c
behaves differently to other shells; here's a simple example, first
with sh and then with tcsh:
mark@topaz:~]% sh -c 'echo ls | eval /bin/tcsh -l' stty: stdin isnt a terminal apache/ dtd/ mbox saves/ www@ bin/ etc/ pat/ steel/ www-src/ dev/ freebsd-config/ patches/ tmp/ doc/ mail/ public_html/ web/ [mark@topaz:~]% tcsh -c 'echo ls | eval /bin/tcsh -l' [mark@topaz:~]%
With tcsh
, the ls command never gets echoed down the pipe
to the eval'd shell. I conjecture this is due to tcsh
placing additional args to -c
after the first in the
argv
variable, whereas sh
places them in
$0
, $1
etc. echo
then looks at the
parameter variables, not the argv
variable.
sh
documentation:
-c string If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0.
tcsh
documentation:
-c Commands are read from the following argument (which must be present, and must be a single argument), stored in the command shell variable for reference, and executed. Any remaining argu‐ ments are placed in the argv shell variable.
To work around, I set the default shell in Mac OS X Terminal (User Accounts, unlock, then control/right-click on the account to access advanced settings) and emacs to /bin/bash.