Running a repl inside Emacs is often convenient for evaluating code, checking syntax, and myriad other tasks. When I wanted to run a Node REPL, I found that I needed to do a little set up to get everything working the way I wanted.
My first question was: which Node? With nvm, I've installed multiple version on my machine. So I needed a way to specify one to execute.
Another question was: where to run Node? Since npm
looks inside node_modules
directories starting with the current directory and
working up the file system hierarchy, the current working directory is
important. If I want access to the npm modules installed for project A, I need
to start my repl's Node process from path/to/projectA
.
But that raises another question: what happens when I want to switch to project
B? Do I need to use process.chdir()
to switch the Node repl's current working
directory to path/to/projectB
? That's clumsy and annoying.
Here's how I answered these questions:
nvm.el gives you nvm-use
to activate a
version of Node within Emacs. It's basically a nice wrapper around setting
the enviroment variables NVM_BIN
and NVM_PATH
and adding the path to the
Node version you want to use to your PATH
. Great!
Except for one problem: nvm-use
isn't interactive. It's meant to be use
programmatically. So I needed to write a small do-nvm-use
wrapper that lets me
specify a version and then activate it:
1 | (require-package 'nvm) |
To specify where to run Node, I wrote another small defun, named run-node
,
that prompts for a directory in which to start Node. Before it does this,
though, it checks whether a program named node
is in the exec-path
, and if
not, it runs do-nvm-use
first. Once we have a Node to execute and a directory
to execute it in, we can make a new comint
buffer bound to the repl process.
To address the issue of different repls needing to be run for different
projects, run-node
adds the cwd to the buffer name. Repls for project A and
project B will live in buffers named *-node-repl-path/to/projectA
and
*-node-repl-path/to/projectB
, respectively—making switching to the right
buffer with ido trivial.
1 | (defun run-node (cwd) |
Now to start my Node repls, I just call run-node
and I'm all set!