SLip includes a development environment based on Ymacs, aiming to provide features similar to SLIME and Emacs (well, we're pretty far from them yet). Most of SLip was developed in this environment. From it you can edit files and save them via WebDAV (needs special configuration in your Web server), you can evaluate Lisp expressions or you can compile an entire file to “fasl”. It also provides a REPL. I'm gonna call it the “IDE”, though it's not an IDE in the classical sense.
On startup the IDE pops up in a new window (so you need to enable popups), and keeps the page where SLip itself is running blank. I decided to do it this way so that I don't pollute the DOM of the SLip application with the IDE. The editor is able to send Lisp commands to that page, and get back the results.
Emacs users should feel familiar with this environment. I'm listing here key bindings that are specific to the SLip mode; you can find info on Ymacs keybindings elsewhere.
|C-x C-f||Open file. You'll have to type the file name here (completion unavailable, unfortunately). The names are relative to the path of “index.html” from the SLip tree, so for example to open the compiler you'd type “lisp/compiler.lisp”. If you type a non-existent file name, you'll get an empty buffer and that file will be created when you save it via C-x C-s.|
|C-x C-s||Save the current buffer.|
|C-c C-c or C-M-x||Evaluate toplevel expression.|
|C-c C-k||Evaluate entire buffer.|
|C-c C-r||Evaluate region.|
|C-c ENTER||Macroexpand expression at cursor. The output goes in the *sl* buffer.|
|C-c M-m||Macroexpand-all the expression at cursor.|
|M-q||Reformat (indent) toplevel expression.|
|S-TAB||Complete symbol at point.|
|M-.||Locate symbol definition if available. By default when you compile an entire file, several constructs will make the compiler insert cross-reference information in the FASL. Following macros provide this currently: defun, defmacro, defparameter, defglobal. We don't yet have SLIME's more advanced x-ref information, like “who calls”, “who references”, “who macroexpands”—but those could be added fairly easily.|
In the REPL buffer (“*sl*”) there are additional bindings:
|ENTER||When the cursor is after the last prompt, ENTER will evaluate the expression in the REPL. When the cursor is before the last prompt, ENTER will copy the toplevel expression into the prompt.|
|C-ENTER||Newline and indent|
|M-p or C-ARROW_UP||Previous line from history. This functions as a search if the prompt input wasn't empty, so if you need, say, previous history line that contains “defun”, just type “defun” into the REPL and press M-p.|
|M-n or C-ARROW_DOWN||Next line from history; also search.|
|C-DELETE||Delete the current input, leaving the prompt empty|
|TAB||Complete symbol at point|
|C-c M-o or C-c DELETE or C-c C-DELETE||Clear the *sl* buffer, leaving an empty prompt.|
The editor understands the standard way to declare the current
(in-package :foo)—which is necessary when
you evaluate an expression in the editor in order to know which package to
read that expression in. Also, TAB completion shows only symbols that are
available in the current position.
To change the package in the REPL, you can evaluate
Compiling whole files
Although there is C-c C-k to compile the whole buffer, this doesn't save the FASL anywhere and will not produce cross-reference information. To compile a whole file and save the FASL there's the command M-x ss_compile_file (you need to save the file first in order to catch any changes!).
Sometimes it's necessary to rebuild all the files (for example when you add/modify a compiler feature, you want to recompile all files, including compiler.lisp, in order for them to use the new version of the compiler). To do this you can M-x ss_recompile_everything. To tweak what files are included here you need to edit ide/boot-ide.js (search for “lisp_files”).