diff --git a/content/commands.js b/content/commands.js index 57961c13..727f8b7c 100644 --- a/content/commands.js +++ b/content/commands.js @@ -813,7 +813,8 @@ vimperator.Commands = function () //{{{ try { // TODO: move to vimperator.eval()? - arg = eval(arg); + // with (vimperator) means, vimperator is the default namespace "inside" eval + arg = eval("with(vimperator){" + arg + "}"); } catch (e) { @@ -989,7 +990,7 @@ vimperator.Commands = function () //{{{ { try { - eval(args); + eval("with(vimperator){" + args + "}"); } catch (e) { @@ -2018,7 +2019,7 @@ vimperator.Commands = function () //{{{ else { while (i--) - eval(args); + eval("with(vimperator){" + args + "}"); } if (special) @@ -2064,7 +2065,7 @@ vimperator.Commands = function () //{{{ if (args && args[0] == ":") vimperator.execute(args); else - eval(args); + eval("with(vimperator){" + args + "}"); if (special) return; diff --git a/content/completion.js b/content/completion.js index e56e3adb..97fb9289 100644 --- a/content/completion.js +++ b/content/completion.js @@ -379,7 +379,7 @@ vimperator.Completion = function () // {{{ { g_substrings = []; var matches = str.match(/^(.*?)(\s*\.\s*)?(\w*)$/); - var object = "window"; + var objects = []; var filter = matches[3] || ""; var start = matches[1].length - 1; if (matches[2]) @@ -411,32 +411,37 @@ vimperator.Completion = function () // {{{ break outer; } } - object = matches[1].substr(start+1) || "window"; + + if (matches[1].substr(start+1)) + { + objects.push(matches[1].substr(start+1)); + } + else + { + objects.push("vimperator"); + objects.push("window"); + } var completions = []; try { - completions = eval( - "var comp = [];" + - "var type = '';" + - "var value = '';" + - "var obj = eval(" + object + ");" + - "for (var i in obj) {" + - " try { type = typeof(obj[i]); } catch (e) { type = 'unknown type'; };" + - " if (type == 'number' || type == 'string' || type == 'boolean') {" + - " value = obj[i];" + - " comp.push([[i], type + ': ' + value]); }" + - // The problem with that is that you complete vimperator. - // but can't press to complete sub items - // so it's better to complete vimperator and the user can do - // . to get the sub items - //" else if (type == 'function') {" + - //" comp.push([[i+'('], type]); }" + - //" else if (type == 'object') {" + - //" comp.push([[i+'.'], type]); }" + - " else {" + - " comp.push([[i], type]); }" + - "} comp;"); + for (var o = 0; o < objects.length; o++) + { + completions = completions.concat(eval( + "var comp = [];" + + "var type = '';" + + "var value = '';" + + "var obj = eval('with(vimperator){" + objects[o] + "}');" + + "for (var i in obj) {" + + " try { type = typeof(obj[i]); } catch (e) { type = 'unknown type'; };" + + " if (type == 'number' || type == 'string' || type == 'boolean') {" + + " value = obj[i];" + + " comp.push([[i], type + ': ' + value]); }" + + " else {" + + " comp.push([[i], type]); }" + + "} comp;" + )); + } } catch (e) { diff --git a/content/vimperator.js b/content/vimperator.js index d04097ce..88a71fa8 100644 --- a/content/vimperator.js +++ b/content/vimperator.js @@ -516,7 +516,7 @@ const vimperator = (function () //{{{ // handle pure javascript files specially if (/\.js$/.test(filename)) { - eval(str); + eval("with(vimperator){" + str + "}"); } else { @@ -528,7 +528,7 @@ const vimperator = (function () //{{{ { if (heredoc_end.test(line)) { - eval(heredoc); + eval("with(vimperator){" + heredoc + "}"); heredoc = ""; heredoc_end = null; }