Factor and the jEdit editor
Slava Pestov — 2004-06-30 23:50:56
Hi everybody,
I have come up with a bare-bones but useful interface between Factor and
jEdit.
On the Factor side is a way of running the interpreter over a TCP/IP
socket. Security is an issue here, make sure you only run this on
machines not directly facing the internet.
====<8====
First you need a little logging vocabulary:
IN: logging
USE: namespaces
USE: combinators
USE: stack
USE: streams
USE: strings
: log ( msg -- )
"log" get dup [ tuck fprint fflush ] [ 2drop ] ifte ;
: log-error ( error -- )
"Error: " swap cat2 log ;
: log-client ( -- )
"client" get [
"Accepted connection from " swap
[ "socket" get ] bind cat2 log
] when* ;
: with-logging ( quot -- )
<namespace> [ "stdio" get "log" set call ] bind ;
====<8====
Now, the 'telnet' server itself. Note that it only supports 1
simultaneous connection. Also it has some problems with the debugger.
IN: telnetd
USE: combinators
USE: interpreter
USE: logging
USE: logic
USE: namespaces
USE: stack
USE: stdio
USE: streams
: telnet-client ( socket -- )
<namespace> [
dup
"client" set
set-stdio
log-client
"remote " interpreter-loop
] bind ;
: quit-flag ( -- ? )
"telnetd-quit-flag" get ;
: clear-quit-flag ( -- )
f "telnetd-quit-flag" set ;
: telnetd-loop ( server -- )
[
quit-flag not
] [
dup accept dup telnet-client fclose
] while ;
: telnetd ( port -- )
[
<server> dup telnetd-loop fclose clear-quit-flag
] with-logging ;
====<8====
Now, if you key in:
USE: telnetd
9999 telnetd
You should be able to connect to localhost:9999 with a telnet client and
get a prompt. Exit by entering 'exit'.
====<8====
The jEdit side of the equation consists of a macro:
socket = new Socket("localhost",9999);
out = new OutputStreamWriter(socket.getOutputStream());
out.write("\"" + MiscUtilities.charsToEscapes(buffer.getPath()) + "\"");
out.write(" run-file exit\n");
out.close();
====<8====
This macro can be bound to a keyboard shortcut in jEdit. Now, while
working on the Factor source file, you can press this shortcut to load
it in.
Slava