aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorsnaka2009-02-22 21:45:09 +0000
committersnaka2009-02-22 21:45:09 +0000
commit1e2e9287abe6e3f49ff4ea4de3634d83656d5dd5 (patch)
treea40b5975edf2b09c5c35eb7497616b599a9c38f4
parent7b0a49da4c8b3ea8b9b13a3f193140a378a6e4c9 (diff)
downloadvimperator-plugins-1e2e9287abe6e3f49ff4ea4de3634d83656d5dd5.tar.bz2
Add jsh.js plugin.
git-svn-id: http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk@30444 d0d07461-0603-4401-acd4-de1884942a52
-rw-r--r--jsh.js156
1 files changed, 156 insertions, 0 deletions
diff --git a/jsh.js b/jsh.js
new file mode 100644
index 0000000..7a0c8a3
--- /dev/null
+++ b/jsh.js
@@ -0,0 +1,156 @@
+//
+// jsh.js
+//
+// LICENSE: {{{
+// Copyright (c) 2009 snaka<snaka.gml@gmail.com>
+//
+// Distributable under the terms of an MIT-style license.
+// http://www.opensource.jp/licenses/mit-license.html
+// }}}
+// PLUGIN_INFO {{{
+var PLUGIN_INFO = <VimperatorPlugin>
+ <name>jsh</name>
+ <description>Simple javascript shell</description>
+ <description lang="ja">簡易Javascriptシェル</description>
+ <minVersion>2.0pre</minVersion>
+ <maxVersion>2.0</maxVersion>
+ <updateURL>http://svn.coderepos.org/share/lang/javascript/vimperator-plugins/trunk/jsh.js</updateURL>
+ <author mail="snaka.gml@gmail.com" homepage="http://vimperator.g.hatena.ne.jp/snaka72/">snaka</author>
+ <license>MIT style license</license>
+ <version>0.1</version>
+ <detail><![CDATA[
+ == Subject ==
+
+ == Commands ==
+ To start shell.
+ >||
+ :jsh
+ ||<
+
+ == Global variables ==
+
+ == Options ==
+
+ == ToDo ==
+
+ ]]></detail>
+ <detail lang="ja"><![CDATA[
+ == 概要 ==
+
+ == コマンド ==
+ シェルの開始
+ >||
+ :jsh
+ ||<
+
+ == Global variables ==
+
+ == Options ==
+
+ == ToDo ==
+
+ ]]></detail>
+</VimperatorPlugin>;
+// }}}
+
+liberator.plugins.jsh = (function() {
+ // PUBLIC {{{
+ const self = {
+ start: function() {
+ liberator.echo("*** Javascript SHell - Commands : quit() / cls() ***");
+ waitForInput();
+ }
+ };
+ // }}}
+ // COMMAND {{{
+ commands.addUserCommand(
+ ["jsh"],
+ "Simple javascript shell",
+ function() self.start(),
+ null,
+ true // for DEBUG
+ );
+ // }}}
+ // PRIVATE {{{
+ let shellContext = {
+ quit : cmdQuit,
+ exit : cmdQuit, // alias as 'quit()'
+ cls : cmdCls,
+ echo : liberator.echo,
+ $LXs : plugins.libly.$U.getNodesFromXPath,
+ $LX : plugins.libly.$U.getFirstNodeFromXPath
+ };
+
+ const STATUS = {
+ NORMAL: '__JAVASCRIPT_SHELL_NORMAL__',
+ QUIT : '__JAVASCRIPT_SHELL_QUIT__'
+ };
+
+ let lastStatus = STATUS.NORMAL;
+
+ function waitForInput() {
+ commandline.open("js:", "", modes.JSH);
+ }
+
+ function cmdCls() {
+ // TODO Is this correct?
+ commandline.close();
+ waitForInput();
+ }
+
+ function cmdQuit() {
+ commandline.close();
+ throw STATUS.QUIT;
+ }
+
+ // TODO:Should move to _libly.js ?
+ function pp(value) {
+ let result;
+
+ if (!value)
+ return '';
+
+ if (typeof value === 'object') {
+ result = util.objectToString(value, true);
+ } else if (typeof value === 'function') {
+ result = <pre>{value.toString()}</pre>;
+ } else if (typeof value === 'string' && /\n/.test(value)) {
+ result = <span highlight="CmdOutput">{value}</span>;
+ } else {
+ result = String(value);
+ }
+
+ liberator.echo(result);
+ }
+
+ // }}}
+ // MODE {{{
+ modules.modes.addMode("JSH", true);
+ liberator.registerCallback("cancel", modes.JSH, function(str) {
+ liberator.echo("CANCELED.");
+ });
+
+ liberator.registerCallback("submit", modes.JSH, function(str) {
+ try {
+ var result = liberator.eval(str, shellContext);
+ pp(result);
+ } catch(e) {
+ if (e == STATUS.QUIT)
+ return;
+ liberator.echoerr(e);
+ }
+ (function waitForOutput() {
+ setTimeout( function() modes.main == modes.NORMAL
+ ? waitForInput()
+ : waitForOutput(),
+ 500 );
+ })();
+ });
+
+ liberator.registerCallback("complete", modes.JSH, function(context) {
+ context.fork("jsh", 0, liberator.modules.completion, "javascript");
+ });
+ // }}}
+ return self;
+})();
+// vim: sw=2 ts=2 et si fdm=marker: