具有完成功能的JavaScript交互式Shell
为了进行调试和测试,我正在搜索具有自动完成功能以及可能的对象自省(例如ipython)的JavaScript shell。在线JavaScript Shell确实很棒,但是我正在寻找本地的东西,不需要浏览器。
到目前为止,我已经测试了独立的JavaScript解释器rhino,spidermonkey和google V8. 但是他们两个都没有完成。至少具有jline和spidermonkey的Rhino通过向上/向下键具有某种命令历史记录,但仅此而已。
有什么建议?
在这里再次问了这个问题。它可能包含我们要寻找的答案。
解决方案
回答
我们不是在寻找Rhino Shell吗?
回答
John Resig的这篇文章说,有Tamarin(Firefox 4?)和JavaScriptCore(Safari 3)的外壳。我不确定他们是否具有自动完成功能。
回答
自1.7R2起的Rhino Shell也支持完成。我们可以在这里找到更多信息。
回答
在Windows中,我们可以从cscript.exe的命令提示符下运行此文件,它提供了一个简单的交互式外壳。没有完成。
// 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();
如果需要,可以使用.wsf文件通过其他实用程序库进行扩充。将以上内容保存到" shell.js",并将以下内容保存到" shell.wsf":
<job> <reference object="Scripting.FileSystemObject" /> <script language="JavaScript" src="util.js" /> <script language="JavaScript" src="shell.js" /> </job>
...其中util.js是:
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); };
...然后从命令行运行shell.wsf。
回答
编辑:再使用节点REPL之后,我发现此评估过于积极。它的实现存在一些严重的问题,包括无法删除被杀死的文本,编辑行的长度超过终端宽度,以及其他一些问题。仅使用犀牛可能会更好。
node.js REPL(在安装了节点的系统上为" node-repl")是到目前为止我所见过的基于终端的,基于系统上下文的最佳shell。我正在将其与rhino和内置的v8 shell进行比较。它提供制表符补全和行编辑历史记录,以及评估的语法颜色。我们也可以导入CommonJS模块,或者至少导入那些由node实现的模块。
缺点是我们必须构建节点。就构建应用程序而言,这并不是什么大不了的事情,但是如果我们通常不这样做的话,这可能是一个挑战。