From: <ko...@us...> - 2010-07-28 20:41:30
|
Revision: 18266 http://jedit.svn.sourceforge.net/jedit/?rev=18266&view=rev Author: kog13 Date: 2010-07-28 20:41:24 +0000 (Wed, 28 Jul 2010) Log Message: ----------- Initial upload Added Paths: ----------- plugins/Slime/trunk/Slime.props plugins/Slime/trunk/actions.xml plugins/Slime/trunk/build.xml plugins/Slime/trunk/description.html plugins/Slime/trunk/docs/ plugins/Slime/trunk/docs/users-guide.xml plugins/Slime/trunk/lib/ plugins/Slime/trunk/services.xml plugins/Slime/trunk/src/ plugins/Slime/trunk/src/slime/ plugins/Slime/trunk/src/slime/REPL.java plugins/Slime/trunk/src/slime/REPLShell.java plugins/Slime/trunk/src/slime/SlimeMenuProvider.java plugins/Slime/trunk/src/slime/SlimePlugin.java plugins/Slime/trunk/src/slime/repl/ plugins/Slime/trunk/src/slime/repl/Clojure.java plugins/Slime/trunk/src/slime/repl/Groovy.java plugins/Slime/trunk/src/slime/repl/Python.java plugins/Slime/trunk/test/ plugins/Slime/trunk/test/slime/ plugins/Slime/trunk/test/slime/SlimePluginTests.java Added: plugins/Slime/trunk/Slime.props =================================================================== --- plugins/Slime/trunk/Slime.props (rev 0) +++ plugins/Slime/trunk/Slime.props 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,38 @@ +# ::mode=properties:: # +# Basic Plugin Information {{{ +plugin.slime.SlimePlugin.activate=defer +plugin.slime.SlimePlugin.author=Damien Radtke +plugin.slime.SlimePlugin.description=Plugin for embedding a running REPL \ + session into the Console. +plugin.slime.SlimePlugin.docs=index.html +plugin.slime.SlimePlugin.longdescription=description.html +plugin.slime.SlimePlugin.name=Slime +plugin.slime.SlimePlugin.usePluginHome=false +plugin.slime.SlimePlugin.version=0.1 +# }}} Basic Plugin Information + +# Dependencies {{{ +plugin.slime.SlimePlugin.depend.0=jedit 04.03.18.00 +plugin.slime.SlimePlugin.depend.1=jdk 1.5 +plugin.slime.SlimePlugin.depend.2=plugin console.ConsolePlugin 4.4.2 +# }}} Dependencies + +# Menu {{{ +plugin.slime.SlimePlugin.menu=- show-repl-shell - eval-selected eval-buffer \ + eval-file +plugin.slime.SlimePlugin.menu.code=new slime.SlimeMenuProvider(); +show-repl-shell.label=Show REPL Shell +stop-repl.label=Stop Running REPL +eval-selected.label=Evaluate Selected Text +eval-buffer.label=Evaluate Buffer +eval-file.label=Evaluate File... +#}}} + +# Messages {{{ +msg.slime.stopped=REPL Stopped. +msg.slime.none-running=No REPL is running. +msg.slime.unkown=Unknown REPL: +msg.slime.info-message=This shell runs REPL (Read Eval Print Loop) sessions. \ + To start one, go to Plugins->Slime->Start, or enter the name of the REPL \ + you want to start in this shell. +#}}} Added: plugins/Slime/trunk/actions.xml =================================================================== --- plugins/Slime/trunk/actions.xml (rev 0) +++ plugins/Slime/trunk/actions.xml 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,31 @@ +<?xml version="1.0"?> +<!DOCTYPE ACTIONS SYSTEM "actions.dtd"> + +<ACTIONS> + <ACTION NAME="show-repl-shell"> + <CODE> + slime.SlimePlugin.getREPLShell(view); + </CODE> + </ACTION> + <ACTION NAME="stop-repl"> + <CODE> + shell = slime.SlimePlugin.getREPLShell(view); + shell.stop(console); + </CODE> + </ACTION> + <ACTION NAME="eval-selected"> + <CODE> + slime.SlimePlugin.eval(view, textArea.getSelectedText()); + </CODE> + </ACTION> + <ACTION NAME="eval-buffer"> + <CODE> + slime.SlimePlugin.evalBuffer(view, buffer); + </CODE> + </ACTION> + <ACTION NAME="eval-file"> + <CODE> + slime.SlimePlugin.evalFile(view); + </CODE> + </ACTION> +</ACTIONS> Added: plugins/Slime/trunk/build.xml =================================================================== --- plugins/Slime/trunk/build.xml (rev 0) +++ plugins/Slime/trunk/build.xml 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,50 @@ +<?xml version="1.0" ?> +<project name="Slime" default="build" basedir="."> + <!-- mark:build.properties --> + <property file="C:\Documents and Settings\E16145\workspace\plugins\build.properties" /> + <!-- /mark:build.properties --> + <!-- <property file="build.properties" /> --> + <!-- <property file="../build.properties" /> --> + <property name="compiler.source" value="1.5" /> + <property name="compiler.target" value="1.5" /> + <property name="src.dir" value="src" /> + + <!-- Documentation process + none: if you supply your own html file as this template does. + xsltproc: if you plan on using docbook + --> + <!-- <property name="docs-proc.target" value="none" /> --> + + <!-- jEdit installation properties. --> + <!-- mark:properties --> + <!-- /mark:properties --> + <import file="${build.support}/plugin-build.xml" /> + + <!-- If you want any extra files to be included with your plugin's jar, + such as custom images, you need to specify them here. --> + <selector id="packageFiles"> + <and> + <or> + <filename name="**/Slime.html" /> + </or> + </and> + </selector> + + <!-- Add your plugin's specific dependencies here --> + <path id="project.class.path"> + <!-- Dependencies that are bundled with your plugin. + These should also be represented in your props file under the, + "plugin.[plugin class].jars" property. --> + <!-- <pathelement path="lib/dependency.jar" /> --> + <!-- mark:libs --> + <!-- /mark:libs --> + + <!-- Dependencies that are supplied by other plugins. --> + <!-- <pathelement path="${jedit.plugins.dir}/dependency.jar" /> --> + <!-- mark:plugins --> + <pathelement path="${jedit.plugins.dir}/Console.jar" /> + <!-- /mark:plugins --> + </path> + +</project> +<!-- ::mode=xml:: --> Added: plugins/Slime/trunk/description.html =================================================================== --- plugins/Slime/trunk/description.html (rev 0) +++ plugins/Slime/trunk/description.html 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,6 @@ +Slime embeds a REPL (Read Eval Print Loop) shell into Console that allows +you to have a REPL session running at all times. Actions are provided for +evaluating code within the running REPL session; you can evaluate selected +text, the active buffer, or choose an external file. + +This version supports running REPL's for Clojure, Groovy, and Python. Added: plugins/Slime/trunk/docs/users-guide.xml =================================================================== --- plugins/Slime/trunk/docs/users-guide.xml (rev 0) +++ plugins/Slime/trunk/docs/users-guide.xml 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,66 @@ +<?xml version="1.0"?> +<!-- jEdit buffer-local properties: --> +<!-- :tabSize=1:indentSize=1:noTabs=true:folding=sidekick: --> +<book> + +<bookinfo><title>Slime</title> + +<author><firstname>Damien</firstname><surname>Radtke</surname></author> +<!-- + <legalnotice><title>Legal Notice</title> + <para> + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.1 or + any later version published by the Free Software Foundation; with no + <quote>Invariant Sections</quote>, <quote>Front-Cover Texts</quote> or + <quote>Back-Cover Texts</quote>, each as defined in the license. A copy of + the license can be found in the file <filename>COPYING.DOC.txt</filename> + included with jEdit. + </para> + </legalnotice> +--> +</bookinfo> + +<chapter id="overview"><title>Overview</title> + <para> + Slime is a jEdit plugin influenced by SLIME (Superior Lisp Interaction Mode + for Emacs). It provides a shell in Console that allows you to have an + interactive REPL session (Read Eval Print Loop) running at all times, with + actions to evaluate inside it the currently-selected text, the active buffer, + or an external file. + </para> + <para> + This version of Slime comes with support for Clojure, Groovy, and Python. + </para> + <sect1 id="clojure"><title>Clojure</title> + To use the Clojure REPL, you need one of two things: + <itemizedlist> + <listitem> + An executable with the name "clojure" on your system path (Windows batch + files should have the .bat extension) + </listitem> + <listitem> + An environment variable named "CLOJURE_DIR" whose value is the directory + that the clojure jar is in (which should be named simply "clojure.jar") + </listitem> + </itemizedlist> + </sect1> + <sect1 id="groovy"><title>Groovy</title> + To use the Groovy REPL, you need one of two things: + <itemizedlist> + <listitem> + The "bin" subfolder of groovy's home on your system path (typing "groovysh" + into a terminal or command prompt should bring up the REPL). + </listitem> + <listitem> + An environment variable named "GROOVY_HOME" that points to groovy"s home + folder. + </listitem> + </itemizedlist> + </sect1> + <sect1 id="python"><title>Python</title> + To use the Python REPL, you must have the python executable somewhere on your + system path. + </sect1> +</chapter> +</book> \ No newline at end of file Added: plugins/Slime/trunk/services.xml =================================================================== --- plugins/Slime/trunk/services.xml (rev 0) +++ plugins/Slime/trunk/services.xml 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,16 @@ +<?xml version="1.0"?> +<!DOCTYPE SERVICES SYSTEM "services.dtd"> +<SERVICES> + <SERVICE CLASS="console.Shell" NAME="REPL"> + new slime.REPLShell(); + </SERVICE> + <SERVICE CLASS="slime.REPL" NAME="Clojure"> + new slime.repl.Clojure(); + </SERVICE> + <SERVICE CLASS="slime.REPL" NAME="Python"> + new slime.repl.Python(); + </SERVICE> + <SERVICE CLASS="slime.REPL" NAME="Groovy"> + new slime.repl.Groovy(); + </SERVICE> +</SERVICES> Added: plugins/Slime/trunk/src/slime/REPL.java =================================================================== --- plugins/Slime/trunk/src/slime/REPL.java (rev 0) +++ plugins/Slime/trunk/src/slime/REPL.java 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,51 @@ +package slime; +/** + * @author Damien Radtke + * class REPL + * A configuration class for defining REPL's + */ +//{{{ Imports +import org.gjt.sp.jedit.Buffer; +//}}} +public abstract class REPL { + /** + * Returns the running REPL process + * Should return null if process creation failed + */ + public abstract Process getProcess(); + + /** + * Returns a command to evaluate 'buffer' + * A check is done prior to running this method to make sure the buffer + * exists on disk. If it doesn't, this method is not used + * @param buffer the buffer to evaluate + * @return the string used to evaluate the buffer, or null if the buffer's + * contents should simply be fed to getEvalCommand, which is the default + */ + public String getBufferEvalCommand(Buffer buffer) { + return null; + } + + /** + * Returns a command to evaluate 'str' + * If this method returns null (which is the default), the string will + * simply be fed to standard input. + * @param str the string to evaluate + * @return the command to evaluate str, or null for standard input + */ + public String getEvalCommand(String str) { + return null; + } + + /** + * If any text is printed by the REPL that matches this regex, + * the animation will stop and waitFor() will return. + * By default, returning null means that the animation will continue + * indefinitely and waitFor() will never return. + * @return a regex to match the REPL's prompt + */ + public String getPromptRegex() { + return null; + } + +} Added: plugins/Slime/trunk/src/slime/REPLShell.java =================================================================== --- plugins/Slime/trunk/src/slime/REPLShell.java (rev 0) +++ plugins/Slime/trunk/src/slime/REPLShell.java 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,218 @@ +package slime; +/** + * @author Damien Radtke + * class REPLShell + * A Read-Eval-Print-Loop shell for Console + */ +//{{{ Imports +import console.Console; +import console.ConsolePane; +import console.ConsolePlugin; +import console.Output; +import console.Shell; +import java.io.InputStream; +import java.io.OutputStream; +import javax.swing.text.AttributeSet; +import org.gjt.sp.jedit.ServiceManager; +import org.gjt.sp.jedit.jEdit; +import slime.REPL; +//}}} +public class REPLShell extends Shell { + private boolean running; + private Process p; + private Output output; + private Console console; + private REPL repl; + private OutputStream replOut; + private boolean waiting; + /* + * Constructor for REPLShell + */ + public REPLShell() { + super("REPL"); + running = false; + waiting = false; + } + + //{{{ printInfoMessage() + public void printInfoMessage(Output output) { + output.print(null, jEdit.getProperty("msg.slime.info-message")); + } //}}} + + //{{{ printPrompt() + public void printPrompt(Console console, Output output) { + this.console = console; + this.output = output; + } //}}} + + //{{{ execute() + public void execute(Console console, String input, final Output output, + Output error, String command) { + if (!running) { + // Ignore blank lines + if (command.trim().length() == 0) { + output.commandDone(); + return; + } + // Check to see if the entered text is a valid REPL + // If so, start it; if not, display an error message + REPL _repl = (REPL) ServiceManager.getService( + "slime.REPL", command); + if (_repl == null) { + output.commandDone(); + output.print(console.getErrorColor(), jEdit.getProperty( + "msg.slime.unknown")+command); + return; + } else { + startREPL(_repl); + } + } else { + // If a loop is already running, send input to it + sendToREPL(command, true); + } + } //}}} + + //{{{ sendToREPL + public void sendToREPL(String str) { + sendToREPL(str, false); + } + + protected void sendToREPL(String str, boolean fromConsole) { + final String cmd = str+"\n"; + if (!fromConsole) { + if (str.indexOf("\n") != -1) { + output.print(console.getInfoColor(), "..."); + } else { + output.print(console.getInfoColor(), str); + } + //output.print(console.getInfoColor(), str); + } + new Thread() { + public void run() { + try { + waiting = true; + replOut.write(cmd.getBytes()); + replOut.flush(); + } + catch (Exception e) { + e.printStackTrace(); + } + } + }.start(); + } //}}} + + //{{{ printNoREPLError() + public void printNoREPLError() { + output.print(console.getErrorColor(), jEdit.getProperty( + "msg.slime.none-running")); + } //}}} + + //{{{ startREPL() + public void startREPL(REPL repl) { + if (running) { + stop(console); + } + try { + p = repl.getProcess(); + if (p == null) { + // Process failed to start + throw new Exception(); + } + output.print(console.getInfoColor(), "Starting..."); + replOut = p.getOutputStream(); + + // Set up threads for reading input + new REPLReader(p.getInputStream(), + ConsolePane.colorAttributes(console.getPlainColor())).start(); + new REPLReader(p.getErrorStream(), + ConsolePane.colorAttributes(console.getErrorColor())).start(); + + running = true; + this.repl = repl; + } + catch (Exception e) { + running = false; + output.print(console.getErrorColor(), "Could not start REPL.\n"+ + "Check the Activity Log for details."); + output.commandDone(); + e.printStackTrace(); + } + } //}}} + + //{{{ stop() + public void stop(Console console) { + output.commandDone(); + if (running) { + p.destroy(); + output.print(console.getInfoColor(), "\nREPL Stopped."); + running = false; + repl = null; + } else { + printNoREPLError(); + } + } //}}} + + //{{{ waitFor() + public boolean waitFor(Console console) { + while (waiting) { + try { + Thread.sleep(500); + } catch (InterruptedException e) { + e.printStackTrace(); + return false; + } + } + return true; + } //}}} + + //{{{ endOfFile() + public void endOfFile(Console console) { + stop(console); + } //}}} + + //{{{ isRunning() + public boolean isRunning() { + return running; + } //}}} + + //{{{ getRunningREPL() + public REPL getRunningREPL() { + return repl; + } //}}} + + //{{{ REPLReader class + class REPLReader extends Thread { + private InputStream in; + private AttributeSet col; + public REPLReader(InputStream in, AttributeSet col) { + this.in = in; + this.col = col; + } + public void run() { + try { + String cache = ""; + byte[] buf = new byte[4096]; + int read = -1; + while ((read = in.read(buf)) != -1) { + String data = new String(buf, 0, read); + output.writeAttrs(col, data); + String prompt = repl.getPromptRegex(); + if (prompt != null) { + if (data.indexOf("\n") != -1) { + data = data.substring(data.lastIndexOf("\n")+1); + } + if (data.matches(prompt)) { + waiting = false; + output.commandDone(); + } + } + } + } catch (Exception e) { + //e.printStackTrace(); + output.print(console.getInfoColor(), jEdit.getProperty( + "msg.slime.stopped")); + } + } + } //}}} + +} Added: plugins/Slime/trunk/src/slime/SlimeMenuProvider.java =================================================================== --- plugins/Slime/trunk/src/slime/SlimeMenuProvider.java (rev 0) +++ plugins/Slime/trunk/src/slime/SlimeMenuProvider.java 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,39 @@ +package slime; +/** + * @author Damien Radtke + * class SlimeMenuProvider + * Dynamic menu for listing available REPL's in the plugin menu + */ +//{{{ Imports +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import javax.swing.JMenu; +import javax.swing.JMenuItem; +import org.gjt.sp.jedit.ServiceManager; +import org.gjt.sp.jedit.menu.DynamicMenuProvider; +import slime.SlimePlugin; +//}}} +public class SlimeMenuProvider implements DynamicMenuProvider { + public boolean updateEveryTime() { + return false; + } + + public void update(JMenu superMenu) { + JMenu menu = new JMenu("Start"); + String[] names = ServiceManager.getServiceNames("slime.REPL"); + for (int i = 0; i<names.length; i++) { + add(menu, names[i]); + } + superMenu.add(menu, 0); + } + + protected void add(final JMenu menu, final String name) { + JMenuItem item = new JMenuItem(name); + menu.add(item); + item.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + SlimePlugin.startREPL(name); + } + }); + } +} Added: plugins/Slime/trunk/src/slime/SlimePlugin.java =================================================================== --- plugins/Slime/trunk/src/slime/SlimePlugin.java (rev 0) +++ plugins/Slime/trunk/src/slime/SlimePlugin.java 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,125 @@ +package slime; +//{{{ Imports +import console.Console; +import console.ConsolePlugin; +import console.Output; +import console.Shell; +import java.io.File; +import java.util.ArrayList; +import java.util.StringTokenizer; +import org.gjt.sp.jedit.Buffer; +import org.gjt.sp.jedit.EditPlugin; +import org.gjt.sp.jedit.GUIUtilities; +import org.gjt.sp.jedit.ServiceManager; +import org.gjt.sp.jedit.View; +import org.gjt.sp.jedit.browser.VFSBrowser; +import org.gjt.sp.jedit.browser.VFSFileChooserDialog; +import org.gjt.sp.jedit.gui.DockableWindowManager; +import org.gjt.sp.jedit.jEdit; +import slime.REPLShell; +//}}} +public class SlimePlugin extends EditPlugin { + public void start() {} + public void stop() { + View[] views = jEdit.getViews(); + for (int i = 0; i<views.length; i++) { + DockableWindowManager wm = views[i].getDockableWindowManager(); + Console console = (Console) wm.getDockable("console"); + if (console != null) { + Shell.getShell("REPL").stop(console); + } + } + } + + public static void startREPL(String name) { + REPL repl = (REPL) ServiceManager.getService("slime.REPL", name); + DockableWindowManager wm = + jEdit.getActiveView().getDockableWindowManager(); + + Console console = (Console) wm.getDockable("console"); + if (console == null) { + wm.addDockableWindow("console"); + console = (Console) wm.getDockable("console"); + } + REPLShell shell = (REPLShell) Shell.getShell("REPL"); + console.setShell(shell); + shell.startREPL(repl); + } + + /** + * Convenience method to evaluate a string in the running REPL + * @param view the current view + * @param str the string to evaluate + */ + public static void eval(View view, String str) { + REPLShell shell = getREPLShell(view); + if (!shell.isRunning()) { + shell.printNoREPLError(); + return; + } + REPL repl = shell.getRunningREPL(); + String cmd = repl.getEvalCommand(str); + if (cmd == null) { + shell.sendToREPL(str); + } else { + shell.sendToREPL(cmd); + } + } + + /** + * Evaluates 'buffer' in the running REPL + * @param view the current view + * @param buffer the buffer to evaluate + */ + public static void evalBuffer(View view, Buffer buffer) { + REPLShell shell = getREPLShell(view); + if (!shell.isRunning()) { + shell.printNoREPLError(); + return; + } + REPL repl = shell.getRunningREPL(); + if (!buffer.isNewFile()) { + String cmd = repl.getBufferEvalCommand(buffer); + if (cmd != null) { + cmd = cmd.replace("\\", "\\\\"); + shell.sendToREPL(cmd); + return; + } + } + eval(view, buffer.getText(0, buffer.getLength())); + } + + /** + * Opens a choose file dialog and evaluates the chosen file, if any, + * in the running REPL + * @param view the current view + */ + public static void evalFile(View view) { + VFSFileChooserDialog dialog = new VFSFileChooserDialog(view, + System.getProperty("user.home")+File.separator, + VFSBrowser.OPEN_DIALOG, false, true); + String[] files = dialog.getSelectedFiles(); + if (files != null) { + File f = new File(files[0]); + Buffer b = jEdit.openTemporary(view, f.getParent(), f.getName(), + false); + evalBuffer(view, b); + } + } + + /** + * Returns the REPL shell for 'view' + * If it is hidden, the shell is opened; this ensures visibility + * @param view the current view + * @return the REPLShell instance of 'view' + */ + public static REPLShell getREPLShell(View view) { + Console console = ConsolePlugin.getConsole(view); + if (console == null) { + view.getDockableWindowManager().addDockableWindow("console"); + console = ConsolePlugin.getConsole(view); + } + REPLShell shell = (REPLShell) console.setShell("REPL"); + return shell; + } +} Added: plugins/Slime/trunk/src/slime/repl/Clojure.java =================================================================== --- plugins/Slime/trunk/src/slime/repl/Clojure.java (rev 0) +++ plugins/Slime/trunk/src/slime/repl/Clojure.java 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,59 @@ +package slime.repl; +/** + * @author Damien Radtke + * class Clojure + * Defines a REPL for running Clojure + */ +//{{{ Imports +import org.gjt.sp.jedit.Buffer; +import org.gjt.sp.jedit.OperatingSystem; +import org.gjt.sp.util.Log; +import slime.REPL; +import org.gjt.sp.jedit.MiscUtilities; +//}}} +public class Clojure extends REPL { + + /** + * 1) Attempts 'clojure' on the system path + * 2) Attempts to locate clojure.jar via the CLOJURE_DIR env. variable + */ + public Process getProcess() { + Process p = null; + try { + String clojure = "clojure"; + if (OperatingSystem.isWindows()) clojure += ".bat"; + p = Runtime.getRuntime().exec(clojure); + } + catch (Exception e) { + try { + Log.log(Log.ERROR,this,"Starting Clojure, try 1 failed: "+e); + String clojureDir = System.getenv("CLOJURE_DIR"); + if (clojureDir != null) { + String clojurePath = MiscUtilities.constructPath( + clojureDir, "clojure.jar"); + p = Runtime.getRuntime().exec("java -cp \""+clojurePath+ + "\" clojure.main"); + } + } + catch (Exception _e) { + Log.log(Log.ERROR,this,"Starting Clojure, try 2 failed: "+_e); + } + } + finally { + return p; + } + } + + public String getBufferEvalCommand(Buffer buffer) { + return "(load-file \""+buffer.getPath().replace("\\", "/")+"\")"; + } + + public String getEvalCommand(String str) { + return "(load-string \""+str.replace("\"", "\\\"")+"\")"; + } + + public String getPromptRegex() { + return "user=> "; + } + +} Added: plugins/Slime/trunk/src/slime/repl/Groovy.java =================================================================== --- plugins/Slime/trunk/src/slime/repl/Groovy.java (rev 0) +++ plugins/Slime/trunk/src/slime/repl/Groovy.java 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,52 @@ +package slime.repl; +/** + * @author Damien Radtke + * class Python + * Defines a REPL for running Groovy + */ +//{{{ Imports +import java.io.File; +import org.gjt.sp.jedit.Buffer; +import org.gjt.sp.jedit.OperatingSystem; +import org.gjt.sp.util.Log; +import slime.REPL; +import org.gjt.sp.jedit.MiscUtilities; +//}}} +public class Groovy extends REPL { + + private final String terminal = "-Djline.terminal="+ + "jline.UnsupportedTerminal"; + + /** + * 1) Attempts 'groovysh' on the system path + * 2) Attempts to locate groovysh via the GROOVY_HOME environment variable + */ + public Process getProcess() { + Process p = null; + try { + String groovy = "groovysh"; + if (OperatingSystem.isWindows()) groovy += ".bat"; + p = Runtime.getRuntime().exec(groovy+" "+terminal); + } + catch (Exception e) { + Log.log(Log.ERROR, this, "Starting Groovy, try 1 failed: "+e); + try { + String groovy = System.getenv("GROOVY_HOME"); + String path = MiscUtilities.constructPath(groovy, "bin/groovysh"); + if (OperatingSystem.isWindows()) path += ".bat"; + p = Runtime.getRuntime().exec("\""+path+"\" "+terminal); + } + catch (Exception _e) { + Log.log(Log.ERROR, this, "Starting Groovy, try 2 failed: "+_e); + } + } + finally { + return p; + } + } + + public String getPromptRegex() { + return "groovy:\\d{3}> "; + } + +} Added: plugins/Slime/trunk/src/slime/repl/Python.java =================================================================== --- plugins/Slime/trunk/src/slime/repl/Python.java (rev 0) +++ plugins/Slime/trunk/src/slime/repl/Python.java 2010-07-28 20:41:24 UTC (rev 18266) @@ -0,0 +1,43 @@ +package slime.repl; +/** + * @author Damien Radtke + * class Python + * Defines a REPL for running Python + */ +//{{{ Imports +import org.gjt.sp.jedit.Buffer; +import org.gjt.sp.util.Log; +import slime.REPL; +import org.gjt.sp.jedit.MiscUtilities; +//}}} +public class Python extends REPL { + + /** + * Attempts 'python -i' on the system path + */ + public Process getProcess() { + Process p = null; + try { + p = Runtime.getRuntime().exec("python -i"); + } + catch (Exception e) { + Log.log(Log.ERROR,this,"Starting python failed: "+e); + } + finally { + return p; + } + } + + public String getEvalCommand(String str) { + return "exec(\""+str+"\")"; + } + + public String getBufferEvalCommand(Buffer buffer) { + return "execfile(\""+buffer.getPath()+"\")"; + } + + public String getPromptRegex() { + return ">>> "; + } + +} Added: plugins/Slime/trunk/test/slime/SlimePluginTests.java =================================================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |