From f34f7298eec95d54ab53e61bfb101802dcc97761 Mon Sep 17 00:00:00 2001 From: "Jose A. Ortega Ruiz" Date: Wed, 21 Jan 2009 02:37:32 +0100 Subject: [PATCH] FUEL: remote connections. --- extra/fuel/fuel.factor | 23 ++++++++++++++++++++--- misc/fuel/README | 14 ++++++++++++++ misc/fuel/fu.el | 3 +++ misc/fuel/fuel-listener.el | 22 ++++++++++++++++++++++ 4 files changed, 59 insertions(+), 3 deletions(-) diff --git a/extra/fuel/fuel.factor b/extra/fuel/fuel.factor index f52a34ff28..663a0bb485 100644 --- a/extra/fuel/fuel.factor +++ b/extra/fuel/fuel.factor @@ -2,9 +2,10 @@ ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays assocs compiler.units definitions fuel.eval -fuel.help help.markup help.topics io.pathnames kernel math math.order -memoize namespaces parser sequences sets sorting tools.crossref -tools.scaffold tools.vocabs vocabs vocabs.loader vocabs.parser words ; +fuel.help help.markup help.topics io io.encodings.utf8 io.pathnames +io.servers.connection kernel listener math math.order memoize +namespaces parser sequences sets sorting tools.crossref tools.scaffold +tools.vocabs vocabs vocabs.loader vocabs.parser words ; IN: fuel @@ -174,3 +175,19 @@ PRIVATE> : fuel-scaffold-get-root ( name -- ) find-vocab-root fuel-eval-set-result ; +! Remote connection + +: fuel-start-remote-listener ( port/f -- ) + "Starting server. Connect with 'M-x connect-to-factor' in Emacs" + write nl flush number? [ 9000 ] unless* + + "tty-server" >>name + utf8 >>encoding + swap local-server >>insecure + [ listener ] >>handler + f >>timeout + start-server ; + +: fuel-start-remote-listener* ( -- ) f fuel-start-remote-listener ; + +MAIN: fuel-start-remote-listener* diff --git a/misc/fuel/README b/misc/fuel/README index cfb8f5b66d..da70952ec0 100644 --- a/misc/fuel/README +++ b/misc/fuel/README @@ -53,6 +53,20 @@ beast. factor image (overwriting the current one) with all the needed vocabs. +*** Connecting to a running Factor + + 'run-factor' starts a new factor listener process managed by Emacs. + If you prefer to start Factor externally, you can also connect + remotely from Emacs. Here's how to proceed: + + - In the factor listener, run FUEL: + "fuel" run + This will start a server listener in port 9000. + - Switch to Emacs and issue the command 'M-x connect-to-factor'. + + That's it; you should be up and running. See the help for + 'connect-to-factor' for how to use a different port. + *** Vocabulary creation FUEL offers a basic interface with Factor's scaffolding utilities. diff --git a/misc/fuel/fu.el b/misc/fuel/fu.el index 95365964ab..e9217fbd03 100644 --- a/misc/fuel/fu.el +++ b/misc/fuel/fu.el @@ -24,6 +24,9 @@ (autoload 'switch-to-factor "fuel-listener.el" "Start a Factor listener, or switch to a running one." t) +(autoload 'connect-to-factor "fuel-listener.el" + "Connect to an external Factor listener." t) + (autoload 'fuel-autodoc-mode "fuel-help.el" "Minor mode showing in the minibuffer a synopsis of Factor word at point." t) diff --git a/misc/fuel/fuel-listener.el b/misc/fuel/fuel-listener.el index ad3c1fc272..d0898de04f 100644 --- a/misc/fuel/fuel-listener.el +++ b/misc/fuel/fuel-listener.el @@ -87,6 +87,17 @@ buffer." (fuel-listener--wait-for-prompt 10000) (fuel-con--setup-connection (current-buffer)))) +(defun fuel-listener--connect-process (port) + (message "Connecting to remote listener ...") + (pop-to-buffer (fuel-listener--buffer)) + (let ((process (get-buffer-process (current-buffer)))) + (when (or (not process) + (y-or-n-p "Kill current listener? ")) + (make-comint-in-buffer "fuel listener" (current-buffer) + (cons "localhost" port)) + (fuel-listener--wait-for-prompt 10000) + (fuel-con--setup-connection (current-buffer))))) + (defun fuel-listener--process (&optional start) (or (and (buffer-live-p (fuel-listener--buffer)) (get-buffer-process (fuel-listener--buffer))) @@ -123,6 +134,17 @@ buffer." (pop-to-buffer buf) (switch-to-buffer buf)))) +(defun connect-to-factor (&optional arg) + "Connects to a remote listener running in the same host. +Without prefix argument, the default port, 9000, is used. +Otherwise, you'll be prompted for it. To make this work, in the +remote listener you need to issue the words +'fuel-start-remote-listener*' or 'port +fuel-start-remote-listener', from the fuel vocabulary." + (interactive "P") + (let ((port (if (not arg) 9000 (read-number "Port: ")))) + (fuel-listener--connect-process port))) + (defun fuel-listener-nuke () "Try this command if the listener becomes unresponsive." (interactive)