diff --git a/chrome/content/vimperator/commands.js b/chrome/content/vimperator/commands.js index 0a2a57cb..6aa00d2a 100644 --- a/chrome/content/vimperator/commands.js +++ b/chrome/content/vimperator/commands.js @@ -191,6 +191,52 @@ function Commands() //{{{ return null; } + + // FIXME: doesn't really belong here... + // return [null, null, null, null, heredoc_tag || false]; + // [count, cmd, special, args] = match; + this.parseCommand = function(string, tag) + { + // removing comments + string.replace(/\s*".*$/, ''); + if (tag) // we already have a multiline heredoc construct + { + if (string == tag) + return [null, null, null, null, false]; + else + return [null, null, null, string, tag]; + } + + // 0 - count, 1 - cmd, 2 - special, 3 - args, 4 - heredoc tag + var matches = string.match(/^:*(\d+)?([a-zA-Z]+)(!)?(?:\s+(.*?)\s*)?$/); + if (!matches) + return [null, null, null, null, null]; + matches.shift(); + + // parse count + if (matches[0]) + { + matches[0] = parseInt(matches[0]); + if (isNaN(matches[0])) + matches[0] = 0; // 0 is the default if no count given + } + else + matches[0] = 0; + + matches[2] = !!matches[2]; + matches.push(null); + if (matches[3]) + { + tag = matches[3].match(/<<\s*(\w+)\s*$/); + if (tag && tag[1]) + matches[4] = tag[1]; + } + else + matches[3] = ''; + + return matches; + } + /////////////////////////////////////////////////////////////////////////////}}} ////////////////////// DEFAULT COMMANDS //////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////{{{ @@ -1119,82 +1165,6 @@ function Commands() //{{{ //}}} } //}}} -function execute_command(count, cmd, special, args, modifiers) //{{{ -{ - if (!cmd) - return; - - if (!modifiers) - modifiers = {}; - - var command = vimperator.commands.get(cmd); - if (command === null) - { - vimperator.echoerr("E492: Not an editor command: " + cmd); - vimperator.focusContent(); - return; - } - - // TODO: need to perform this test? -- djk - if (command.action === null) - { - vimperator.echoerr("E666: Internal error: command.action === null"); - return; - } - - // valid command, call it: - command.execute(args, special, count, modifiers); - -} //}}} - -/////////////////////////////////////////////////////////////////////}}} -// Ex command parsing and execution //////////////////////////////////// -/////////////////////////////////////////////////////////////////////{{{ - -// return [null, null, null, null, heredoc_tag || false]; -// [count, cmd, special, args] = match; -function tokenize_ex(string, tag) -{ - // removing comments - string.replace(/\s*".*$/, ''); - if (tag) // we already have a multiline heredoc construct - { - if (string == tag) - return [null, null, null, null, false]; - else - return [null, null, null, string, tag]; - } - - // 0 - count, 1 - cmd, 2 - special, 3 - args, 4 - heredoc tag - var matches = string.match(/^:*(\d+)?([a-zA-Z]+)(!)?(?:\s+(.*?)\s*)?$/); - if (!matches) - return [null, null, null, null, null]; - matches.shift(); - - // parse count - if (matches[0]) - { - matches[0] = parseInt(matches[0]); - if (isNaN(matches[0])) - matches[0] = 0; // 0 is the default if no count given - } - else - matches[0] = 0; - - matches[2] = !!matches[2]; - matches.push(null); - if (matches[3]) - { - tag = matches[3].match(/<<\s*(\w+)\s*$/); - if (tag && tag[1]) - matches[4] = tag[1]; - } - else - matches[3] = ''; - - return matches; -} - /* takes a string like 'google bla, www.osnews.com' * and returns an array ['www.google.com/search?q=bla', 'www.osnews.com'] */ diff --git a/chrome/content/vimperator/completion.js b/chrome/content/vimperator/completion.js index b631a55a..93d0a2b0 100644 --- a/chrome/content/vimperator/completion.js +++ b/chrome/content/vimperator/completion.js @@ -448,7 +448,7 @@ function get_buffer_completions(filter) //{{{ function exTabCompletion(str) //{{{ { - var [count, cmd, special, args] = tokenize_ex(str); + var [count, cmd, special, args] = vimperator.commands.parseCommand(str); var completions = new Array; var start = 0; diff --git a/chrome/content/vimperator/ui.js b/chrome/content/vimperator/ui.js index 39ea4531..5343019e 100644 --- a/chrome/content/vimperator/ui.js +++ b/chrome/content/vimperator/ui.js @@ -26,48 +26,6 @@ the provisions above, a recipient may use your version of this file under the terms of any one of the MPL, the GPL or the LGPL. }}} ***** END LICENSE BLOCK *****/ -// XXX: move somehere else! -// function multiliner(line, prev_match, heredoc) //{{{ -// { -// var end = true; -// var match = tokenize_ex(line, prev_match[4]); -// if (prev_match[3] === undefined) prev_match[3] = ''; -// if (match[4] === null) -// { -// vimperator.focusContent(); -// execute_command.apply(this, match); -// } -// else -// { -// if (match[4] === false) -// { -// prev_match[3] = prev_match[3].replace(new RegExp('<<\s*' + prev_match[4]), heredoc.replace(/\n$/, '')); -// vimperator.focusContent(); // also sets comp_tab_index to -1 -// execute_command.apply(this, prev_match); -// prev_match = new Array(5); -// prev_match[3] = ''; -// heredoc = ''; -// } -// else -// { -// end = false; -// if (!prev_match[3]) -// { -// prev_match[0] = match[0]; -// prev_match[1] = match[1]; -// prev_match[2] = match[2]; -// prev_match[3] = match[3]; -// prev_match[4] = match[4]; -// } -// else -// { -// heredoc += match[3] + '\n'; -// } -// } -// } -// return [prev_match, heredoc, end]; -// } //}}} - /* * This class is used for prompting of user input and echoing of messages * diff --git a/chrome/content/vimperator/vimperator.js b/chrome/content/vimperator/vimperator.js index c0d215a7..de5de64f 100644 --- a/chrome/content/vimperator/vimperator.js +++ b/chrome/content/vimperator/vimperator.js @@ -209,13 +209,32 @@ const vimperator = (function() //{{{ execute: function(string, modifiers) { - if (!string) + // skip comments and blank lines + if (/^\s*("|$)/.test(string)) return; - var tokens = tokenize_ex(string.replace(/^'(.*)'$/, '$1')); - tokens[4] = modifiers; + if (!modifiers) + modifiers = {}; - return execute_command.apply(this, tokens); + var [count, cmd, special, args] = vimperator.commands.parseCommand(string.replace(/^'(.*)'$/, '$1')); + var command = vimperator.commands.get(cmd); + + if (command === null) + { + vimperator.echoerr("E492: Not an editor command: " + cmd); + vimperator.focusContent(); + return; + } + + // TODO: need to perform this test? -- djk + if (command.action === null) + { + vimperator.echoerr("E666: Internal error: command.action === null"); + return; + } + + // valid command, call it: + command.execute(args, special, count, modifiers); }, // after pressing Escape, put focus on a non-input field of the browser document @@ -509,7 +528,8 @@ const vimperator = (function() //{{{ { var heredoc = ""; var heredocEnd = null; // the string which ends the heredoc - s.split("\n").forEach(function(line) { + s.split("\n").forEach(function(line) + { if (heredocEnd) // we already are in a heredoc { if (line.search(heredocEnd) != -1) @@ -524,7 +544,7 @@ const vimperator = (function() //{{{ else { // check for a heredoc - var [count, cmd, special, args] = tokenize_ex(line); + var [count, cmd, special, args] = vimperator.commands.parseCommand(line); var command = vimperator.commands.get(cmd); if (command && command.name == "javascript") { @@ -532,12 +552,12 @@ const vimperator = (function() //{{{ if (matches && matches[2]) { heredocEnd = new RegExp("^" + matches[2] + "$", "m"); - if(matches[1]) + if (matches[1]) heredoc = matches[1] + "\n"; } } else // execute a normal vimperator command - execute_command(count, cmd, special, args); + vimperator.execute(line); } }); }