2008-09-03 12 views
31

Para la depuración y las pruebas Estoy buscando un shell de JavaScript con finalización automática y, si es posible, introspección de objetos (como ipython). El JavaScript Shell en línea es realmente agradable, pero estoy buscando algo local, sin la necesidad de un navegador.shell interactivo de JavaScript con finalización

Hasta ahora he probado el intérprete de JavaScript independiente rhino, spidermonkey y google V8. Pero ninguno de ellos tiene finalización. Al menos Rhino con jline y spidermonkey tienen algún tipo de historial de comandos mediante la tecla arriba/abajo, pero nada más.

¿Alguna sugerencia?

Esta pregunta se hizo nuevamente here. Puede contener una respuesta que está buscando.

Respuesta

19

Rhino Shell desde 1.7R2 tiene soporte para completarse también. Puede encontrar más información here.

4

En Windows, puede ejecutar este archivo desde el símbolo del sistema en cscript.exe, y proporciona un shell interactivo simple. Sin terminación.

// shell.js 
// ------------------------------------------------------------------ 
// 
// implements an interactive javascript shell. 
// 
// from 
// http://kobyk.wordpress.com/2007/09/14/a-jscript-interactive-interpreter-shell-for-the-windows-script-host/ 
// 
// Sat Nov 28 00:09:55 2009 
// 

var GSHELL = (function() { 

    var numberToHexString = function (n) { 
     if (n >= 0) { 
      return n.toString(16); 
     } else { 
      n += 0x100000000; 
      return n.toString(16); 
     } 
    }; 
    var line, scriptText, previousLine, result; 

    return function() { 
     while(true) { 
      WScript.StdOut.Write("js> "); 
      if (WScript.StdIn.AtEndOfStream) { 
       WScript.Echo("Bye."); 
       break; 
      } 
      line = WScript.StdIn.ReadLine(); 
      scriptText = line + "\n"; 
      if (line === "") { 
       WScript.Echo(
        "Enter two consecutive blank lines to terminate multi-line input."); 
       do { 
        if (WScript.StdIn.AtEndOfStream) { 
         break; 
        } 
        previousLine = line; 
        line = WScript.StdIn.ReadLine(); 
        line += "\n"; 
        scriptText += line; 
       } while(previousLine != "\n" || line != "\n"); 
      } 
      try { 
       result = eval(scriptText); 
      } catch (error) { 
       WScript.Echo("0x" + numberToHexString(error.number) + " " + error.name + ": " + 
          error.message); 
      } 
      if (result) { 
       try { 
        WScript.Echo(result); 
       } catch (error) { 
        WScript.Echo("<<>>"); 
       } 
      } 
      result = null; 
     } 
    }; 
})(); 

GSHELL(); 

Si lo desea, puede aumentar eso con otras bibliotecas de utilidades, con un archivo .wsf. Guarde el anterior a "shell.js", y guarde lo siguiente en "shell.wsf":

<job> 
    <reference object="Scripting.FileSystemObject" /> 
    <script language="JavaScript" src="util.js" /> 
    <script language="JavaScript" src="shell.js" /> 
</job> 

... donde util.js es:

var quit = function(x) { WScript.Quit(x);} 
var say = function(s) { WScript.Echo(s); }; 
var echo = say; 
var exit = quit; 
var sleep = function(n) { WScript.Sleep(n*1000); }; 

... y luego ejecutar shell.wsf desde la línea de comando.

5

edit: después de usar el nodo REPL un poco más, he descubierto que esta evaluación es demasiado positiva. Existen algunos problemas graves con su implementación, como la imposibilidad de eliminar el texto eliminado, problemas con las líneas de edición que superan el ancho de la terminal y algunos otros problemas. Podría ser mejor usar rinoceronte.

El node.jsREPL (node-repl en un sistema con nodo instalado) es el mejor shell de contexto de sistema basado en terminal que he visto hasta ahora. Lo estoy comparando con el rinoceronte y el shell v8 incorporado. Proporciona el historial de finalización de pestañas y edición de líneas, así como la coloración de sintaxis de las evaluaciones. También puede importar módulos CommonJS, o al menos los módulos implementados por nodo.

Lo malo es que tienes que construir un nodo. Esto no es un gran problema, ya que la creación de aplicaciones funciona, pero podría ser un desafío si normalmente no haces tales cosas.

0

jslibs (un tiempo de ejecución independiente de javascript) también podría ser adecuado para este fin.

Cuestiones relacionadas